From ed2f49551e7b28c0a2c2706ddb6a1e5de45c56ab Mon Sep 17 00:00:00 2001 From: Patrick Erichsen Date: Wed, 12 Mar 2025 21:18:35 -0700 Subject: [PATCH 001/112] chore: remove docs suggestions --- core/core.ts | 10 - core/indexing/docs/suggestions/index.ts | 129 - .../suggestions/packageCrawlers/Python.ts | 63 - .../docs/suggestions/packageCrawlers/TsJs.ts | 77 - .../docs/suggestions/suggestions.test.ts | 283 -- core/package-lock.json | 4128 ++++++++++------- core/protocol/passThrough.ts | 2 - core/protocol/webview.ts | 1 - .../constants/MessageTypes.kt | 2 - extensions/vscode/package-lock.json | 2 +- extensions/vscode/scripts/esbuild.js | 9 +- gui/src/components/dialogs/AddDocsDialog.tsx | 213 +- .../components/indexing/DocsIndexingPeeks.tsx | 12 +- gui/src/hooks/useSetup.ts | 6 - gui/src/redux/slices/miscSlice.ts | 13 +- 15 files changed, 2560 insertions(+), 2390 deletions(-) delete mode 100644 core/indexing/docs/suggestions/index.ts delete mode 100644 core/indexing/docs/suggestions/packageCrawlers/Python.ts delete mode 100644 core/indexing/docs/suggestions/packageCrawlers/TsJs.ts delete mode 100644 core/indexing/docs/suggestions/suggestions.test.ts diff --git a/core/core.ts b/core/core.ts index 77505a97605..b8fb8c6024d 100644 --- a/core/core.ts +++ b/core/core.ts @@ -22,7 +22,6 @@ import { DataLogger } from "./data/log"; import { streamDiffLines } from "./edit/streamDiffLines"; import { CodebaseIndexer, PauseToken } from "./indexing/CodebaseIndexer"; import DocsService from "./indexing/docs/DocsService"; -import { getAllSuggestedDocs } from "./indexing/docs/suggestions"; import Ollama from "./llm/llms/Ollama"; import { createNewPromptFileV2 } from "./promptFiles/v2/createNewPromptFile"; import { callTool } from "./tools/callTool"; @@ -981,14 +980,6 @@ export class Core { // this.docsService.setPaused(msg.data.id, msg.data.paused); // not supported yet } }); - on("docs/getSuggestedDocs", async (msg) => { - if (hasRequestedDocs) { - return; - } // TODO, remove, hack because of rerendering - hasRequestedDocs = true; - const suggestedDocs = await getAllSuggestedDocs(this.ide); - this.messenger.send("docs/suggestions", suggestedDocs); - }); on("docs/initStatuses", async (msg) => { void this.docsService.initStatuses(); }); @@ -1163,4 +1154,3 @@ export class Core { // private } -let hasRequestedDocs = false; diff --git a/core/indexing/docs/suggestions/index.ts b/core/indexing/docs/suggestions/index.ts deleted file mode 100644 index fac5091fd84..00000000000 --- a/core/indexing/docs/suggestions/index.ts +++ /dev/null @@ -1,129 +0,0 @@ -import { - PackageDocsResult, - FilePathAndName, - PackageFilePathAndName, - IDE, - PackageDetails, - ParsedPackageInfo, -} from "../../.."; -import { getUriPathBasename } from "../../../util/uri"; -import { walkDir, walkDirs } from "../../walkDir"; - -import { PythonPackageCrawler } from "./packageCrawlers/Python"; -import { NodePackageCrawler } from "./packageCrawlers/TsJs"; - -const PACKAGE_CRAWLERS = [NodePackageCrawler, PythonPackageCrawler]; - -export interface PackageCrawler { - packageRegistry: string; - getPackageFiles(files: FilePathAndName[]): PackageFilePathAndName[]; - parsePackageFile( - file: PackageFilePathAndName, - contents: string, - ): ParsedPackageInfo[]; - getPackageDetails(packageInfo: ParsedPackageInfo): Promise; -} - -export async function getAllSuggestedDocs(ide: IDE) { - const allFileUris = await walkDirs(ide); - const allFiles = allFileUris.map((uri) => ({ - path: uri, - name: getUriPathBasename(uri), - })); - - // Build map of language -> package files - const packageFilesByRegistry: Record = {}; - for (const Crawler of PACKAGE_CRAWLERS) { - const crawler = new Crawler(); - const packageFilePaths = crawler.getPackageFiles(allFiles); - packageFilesByRegistry[crawler.packageRegistry] = packageFilePaths; - } - - // Get file contents for all unique package files - const uniqueFilePaths = Array.from( - new Set( - Object.values(packageFilesByRegistry).flatMap((files) => - files.map((file) => file.path), - ), - ), - ); - const fileContentsArray = await Promise.all( - uniqueFilePaths.map(async (path) => { - const contents = await ide.readFile(path); - return { path, contents }; - }), - ); - const fileContents = new Map( - fileContentsArray.map(({ path, contents }) => [path, contents]), - ); - - // Parse package files and build map of language -> packages - const packagesByCrawler: Record = {}; - PACKAGE_CRAWLERS.forEach((Crawler) => { - const crawler = new Crawler(); - packagesByCrawler[crawler.packageRegistry] = []; - const packageFiles = packageFilesByRegistry[crawler.packageRegistry]; - packageFiles.forEach((file) => { - const contents = fileContents.get(file.path); - if (!contents) { - return; - } - const packages = crawler.parsePackageFile(file, contents); - packagesByCrawler[crawler.packageRegistry].push(...packages); - }); - }); - - // Deduplicate packages per language - // TODO - this is where you would allow docs for different versions - // by e.g. using "name-version" as the map key instead of just name - // For now have not allowed - const registries = Object.keys(packagesByCrawler); - registries.forEach((registry) => { - const packages = packagesByCrawler[registry]; - const uniquePackages = Array.from( - new Map(packages.map((pkg) => [pkg.name, pkg])).values(), - ); - packagesByCrawler[registry] = uniquePackages; - }); - - // Get documentation links for all packages - const allDocsResults: PackageDocsResult[] = []; - await Promise.all( - PACKAGE_CRAWLERS.map(async (Crawler) => { - const crawler = new Crawler(); - const packages = packagesByCrawler[crawler.packageRegistry]; - const docsByRegistry = await Promise.all( - packages.map(async (packageInfo) => { - try { - const details = await crawler.getPackageDetails(packageInfo); - if (!details.docsLink) { - return { - packageInfo, - error: `No documentation link found for ${packageInfo.name}`, - }; - } - return { - packageInfo, - details: { - ...details, - docsLink: details.docsLink, - docsLinkWarning: details.docsLink.includes("github.com") - ? "Github docs not supported, find the docs site" - : details.docsLink.includes("docs") - ? undefined - : "May not be a docs site, check the URL", - }, - }; - } catch (error) { - return { - packageInfo, - error: `Error getting package details for ${packageInfo.name}`, - }; - } - }), - ); - allDocsResults.push(...docsByRegistry); - }), - ); - return allDocsResults; -} diff --git a/core/indexing/docs/suggestions/packageCrawlers/Python.ts b/core/indexing/docs/suggestions/packageCrawlers/Python.ts deleted file mode 100644 index 3a617568f4f..00000000000 --- a/core/indexing/docs/suggestions/packageCrawlers/Python.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { PackageCrawler } from ".."; -import { - FilePathAndName, - PackageDetails, - PackageFilePathAndName, - ParsedPackageInfo, -} from "../../../.."; - -export class PythonPackageCrawler implements PackageCrawler { - packageRegistry = "pypi"; - - getPackageFiles(files: FilePathAndName[]): PackageFilePathAndName[] { - // For Python, we typically look for files like requirements.txt or Pipfile - return files - .filter( - (file) => file.name === "requirements.txt" || file.name === "Pipfile", - ) - .map((file) => ({ - ...file, - packageRegistry: "pypi", - })); - } - - parsePackageFile( - file: PackageFilePathAndName, - contents: string, - ): ParsedPackageInfo[] { - // Assume the fileContent is a string from a requirements.txt formatted file - return contents - .split("\n") - .map((line) => { - const [name, version] = line.split("=="); - return { name, version, packageFile: file, language: "py" }; - }) - .filter((pkg) => pkg.name && pkg.version); - } - - async getPackageDetails( - packageInfo: ParsedPackageInfo, - ): Promise { - // Fetch metadata from PyPI to find the documentation link - const response = await fetch( - `https://pypi.org/pypi/${packageInfo.name}/json`, - ); - if (!response.ok) { - throw new Error(`Could not fetch data for package ${packageInfo.name}`); - } - const data = await response.json(); - const homePage = data?.info?.home_page as string | undefined; - - return { - docsLink: - (data?.info?.project_urls?.Documentation as string | undefined) ?? - homePage, - title: data?.info?.name as string | undefined, - description: data?.info?.summary as string | undefined, - repo: - (data?.info?.project_urls?.Repository as string | undefined) ?? - homePage, - license: data?.info?.license as string | undefined, - }; - } -} diff --git a/core/indexing/docs/suggestions/packageCrawlers/TsJs.ts b/core/indexing/docs/suggestions/packageCrawlers/TsJs.ts deleted file mode 100644 index 3a9ef96c2b8..00000000000 --- a/core/indexing/docs/suggestions/packageCrawlers/TsJs.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { PackageCrawler } from ".."; -import { - FilePathAndName, - PackageDetails, - PackageFilePathAndName, - ParsedPackageInfo, -} from "../../../.."; - -export class NodePackageCrawler implements PackageCrawler { - packageRegistry = "npm"; - - getPackageFiles(files: FilePathAndName[]): PackageFilePathAndName[] { - // For Javascript/TypeScript, we look for package.json file - return files - .filter((file) => file.name === "package.json") - .map((file) => ({ - ...file, - packageRegistry: this.packageRegistry, - })); - } - - parsePackageFile( - file: PackageFilePathAndName, - contents: string, - ): ParsedPackageInfo[] { - // Parse the package.json content - const jsonData = JSON.parse(contents) as Record; - const dependencies = Object.entries(jsonData.dependencies || {}).concat( - Object.entries(jsonData.devDependencies || {}), - ); - - // Filter out types packages and check if typescript is present - let foundTypes = false; - const filtered = dependencies.filter(([name, _]) => { - if (name.startsWith("@types/")) { - foundTypes = true; - return false; - } - if (name.includes("typescript")) { - foundTypes = true; - } - return true; - }); - return filtered.map(([name, version]) => ({ - name, - version, - packageFile: file, - language: foundTypes ? "ts" : "js", - })); - } - - async getPackageDetails( - packageInfo: ParsedPackageInfo, - ): Promise { - const { name } = packageInfo; - // Fetch metadata from the NPM registry to find the documentation link - const response = await fetch(`https://registry.npmjs.org/${name}`); - if (!response.ok) { - throw new Error(`Could not fetch data for package ${name}`); - } - const data = await response.json(); - - // const dependencies = Object.keys(packageContentData.dependencies || {}) - // .concat(Object.keys(packageContentData.devDependencies || {})); - // const usesTypescript = dependencies.includes("typescript"); - - return { - docsLink: data.homepage as string | undefined, - title: name, // package.json doesn't have specific title field - description: data.description as string | undefined, - repo: Array.isArray(data.repository) - ? (data.respository[0]?.url as string | undefined) - : undefined, - license: data.license as string | undefined, - }; - } -} diff --git a/core/indexing/docs/suggestions/suggestions.test.ts b/core/indexing/docs/suggestions/suggestions.test.ts deleted file mode 100644 index 60b58caa6ae..00000000000 --- a/core/indexing/docs/suggestions/suggestions.test.ts +++ /dev/null @@ -1,283 +0,0 @@ -// Generated by continue - -import { getAllSuggestedDocs } from "./index"; -import { testIde } from "../../../test/fixtures"; -import { - setUpTestDir, - tearDownTestDir, - addToTestDir, -} from "../../../test/testDir"; -import fetch, { RequestInfo } from "node-fetch"; - -jest.mock("node-fetch", undefined, { - virtual: false, -}); - -describe.skip("getAllSuggestedDocs", () => { - beforeEach(() => { - setUpTestDir(); - jest.clearAllMocks(); - }); - - afterEach(() => { - tearDownTestDir(); - jest.restoreAllMocks(); - }); - - it("should return package docs for JavaScript and Python projects", async () => { - // Set up test files - addToTestDir([ - [ - "package.json", - JSON.stringify({ - dependencies: { - express: "^4.17.1", - lodash: "^4.17.21", - }, - devDependencies: { - typescript: "^4.0.0", - }, - }), - ], - ["requirements.txt", "requests==2.25.1\nflask==1.1.2"], - ]); - - const mockedFetch = fetch as jest.MockedFunction; - mockedFetch.mockImplementation((url: URL | RequestInfo) => { - if (url.toString().includes("registry.npmjs.org/express")) { - return Promise.resolve({ - ok: true, - json: jest.fn().mockResolvedValue({ - homepage: "https://expressjs.com/", - name: "express", - description: "Fast, unopinionated, minimalist web framework", - license: "MIT", - }), - }) as any; - } else if (url.toString().includes("registry.npmjs.org/lodash")) { - return Promise.resolve({ - ok: true, - json: jest.fn().mockResolvedValue({ - homepage: "https://lodash.com/", - name: "lodash", - description: "Lodash modular utilities.", - license: "MIT", - }), - }) as any; - } else if (url.toString().includes("pypi.org/pypi/requests/json")) { - return Promise.resolve({ - ok: true, - json: jest.fn().mockResolvedValue({ - info: { - home_page: "https://docs.python-requests.org/", - name: "requests", - summary: "Python HTTP for Humans.", - license: "Apache 2.0", - }, - }), - }) as any; - } else if (url.toString().includes("pypi.org/pypi/flask/json")) { - return Promise.resolve({ - ok: true, - json: jest.fn().mockResolvedValue({ - info: { - home_page: "https://palletsprojects.com/p/flask/", - name: "flask", - summary: - "A simple framework for building complex web applications.", - license: "BSD-3-Clause", - }, - }), - }) as any; - } else { - return Promise.reject(new Error(`Unhandled URL: ${url}`)); - } - }); - - const results = await getAllSuggestedDocs(testIde); - - expect(results).toHaveLength(4); - expect(results).toEqual( - expect.arrayContaining([ - expect.objectContaining({ - packageInfo: expect.objectContaining({ name: "express" }), - details: expect.objectContaining({ - docsLink: "https://expressjs.com/", - }), - }), - expect.objectContaining({ - packageInfo: expect.objectContaining({ name: "lodash" }), - details: expect.objectContaining({ - docsLink: "https://lodash.com/", - }), - }), - expect.objectContaining({ - packageInfo: expect.objectContaining({ name: "requests" }), - details: expect.objectContaining({ - docsLink: "https://docs.python-requests.org/", - }), - }), - expect.objectContaining({ - packageInfo: expect.objectContaining({ name: "flask" }), - details: expect.objectContaining({ - docsLink: "https://palletsprojects.com/p/flask/", - }), - }), - ]), - ); - - // Verify no errors are present - results.forEach((result) => { - expect(result.error).toBeUndefined(); - }); - }); - - it("should handle packages without documentation links", async () => { - addToTestDir([ - [ - "package.json", - JSON.stringify({ - dependencies: { - "no-docs-package": "^1.0.0", - }, - }), - ], - ]); - - // Mock fetch - const mockedFetch = fetch as jest.MockedFunction; - mockedFetch.mockImplementation((url: RequestInfo | URL) => { - if (url.toString().includes("registry.npmjs.org/no-docs-package")) { - return Promise.resolve({ - ok: true, - json: jest.fn().mockResolvedValue({ - name: "no-docs-package", - description: "A package without docs", - license: "MIT", - // No homepage provided - }), - }) as any; - } else { - return Promise.reject(new Error(`Unhandled URL: ${url}`)); - } - }); - - const results = await getAllSuggestedDocs(testIde); - - expect(results).toHaveLength(1); - expect(results[0].error).toContain( - "No documentation link found for no-docs-package", - ); - expect(results[0].details).toBeUndefined(); - }); - - it("should handle errors when fetching package details", async () => { - addToTestDir([ - [ - "package.json", - JSON.stringify({ - dependencies: { - "error-package": "^1.0.0", - }, - }), - ], - ]); - - // Mock fetch - const mockedFetch = fetch as jest.MockedFunction; - mockedFetch.mockImplementation((url: URL | RequestInfo) => { - if (url.toString().includes("registry.npmjs.org/error-package")) { - return Promise.resolve({ - ok: false, - }) as any; - } else { - return Promise.reject(new Error(`Unhandled URL: ${url}`)); - } - }); - - const results = await getAllSuggestedDocs(testIde); - - expect(results).toHaveLength(1); - expect(results[0].error).toContain( - "Error getting package details for error-package", - ); - expect(results[0].details).toBeUndefined(); - }); - - it("should handle workspaces with no package files", async () => { - const results = await getAllSuggestedDocs(testIde); - - expect(results).toEqual([]); - }); - - it("should handle packages with GitHub documentation links", async () => { - addToTestDir([ - [ - "package.json", - JSON.stringify({ - dependencies: { - "github-docs-package": "^1.0.0", - }, - }), - ], - ]); - - // Mock fetch - const mockedFetch = fetch as jest.MockedFunction; - mockedFetch.mockImplementation((url: URL | RequestInfo) => { - if (url.toString().includes("registry.npmjs.org/github-docs-package")) { - return Promise.resolve({ - ok: true, - json: jest.fn().mockResolvedValue({ - homepage: "https://github.com/user/repo", - name: "github-docs-package", - description: "A package with GitHub docs", - license: "MIT", - }), - }) as any; - } else { - return Promise.reject(new Error(`Unhandled URL: ${url}`)); - } - }); - - const results = await getAllSuggestedDocs(testIde); - - expect(results).toHaveLength(1); - expect(results[0].details?.docsLink).toBe("https://github.com/user/repo"); - expect(results[0].details?.docsLinkWarning).toBe( - "Github docs not supported, find the docs site", - ); - }); - - it("should handle packages with non-docs links", async () => { - addToTestDir([["requirements.txt", "non-docs-package==1.0.0"]]); - - // Mock fetch - const mockedFetch = fetch as jest.MockedFunction; - mockedFetch.mockImplementation((url: URL | RequestInfo) => { - if (url.toString().includes("pypi.org/pypi/non-docs-package/json")) { - return Promise.resolve({ - ok: true, - json: jest.fn().mockResolvedValue({ - info: { - home_page: "https://somewebsite.com", - name: "non-docs-package", - summary: "A package with non-docs homepage", - license: "MIT", - }, - }), - }) as any; - } else { - return Promise.reject(new Error(`Unhandled URL: ${url}`)); - } - }); - - const results = await getAllSuggestedDocs(testIde); - - expect(results).toHaveLength(1); - expect(results[0].details?.docsLink).toBe("https://somewebsite.com"); - expect(results[0].details?.docsLinkWarning).toBe( - "May not be a docs site, check the URL", - ); - }); -}); diff --git a/core/package-lock.json b/core/package-lock.json index c99cf8b73d4..2958eb16f5d 100644 --- a/core/package-lock.json +++ b/core/package-lock.json @@ -159,6 +159,23 @@ "tslib": "^2.5.3" } }, + "node_modules/@asamuzakjp/css-color": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-3.1.1.tgz", + "integrity": "sha512-hpRD68SV2OMcZCsrbdkccTw5FXjNDLo5OuqSHyHZfwweGsDWZwDJ2+gONyNAbazZclobMirACLw0lk8WVxIqxA==", + "dependencies": { + "@csstools/css-calc": "^2.1.2", + "@csstools/css-color-parser": "^3.0.8", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "lru-cache": "^10.4.3" + } + }, + "node_modules/@asamuzakjp/css-color/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==" + }, "node_modules/@aws-crypto/crc32": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-5.2.0.tgz", @@ -288,668 +305,602 @@ } }, "node_modules/@aws-sdk/client-bedrock-runtime": { - "version": "3.706.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-bedrock-runtime/-/client-bedrock-runtime-3.706.0.tgz", - "integrity": "sha512-Wxzv0VgC1JFDFEnnmCCpKCXYpe+CfANY+ljY7HBSF2zJDasBHKpM4z28sN5nuffJgsBbkIDWltWbNnXKP/cONA==", + "version": "3.758.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-bedrock-runtime/-/client-bedrock-runtime-3.758.0.tgz", + "integrity": "sha512-T7s+fULUxN3AcJP+lgoUKLawzVEtyCTi+5Ga+wrHnqEPwAsM/wg7VctsZfow1fCgARLT/lzmP2LTCi8ycRnQWg==", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.699.0", - "@aws-sdk/client-sts": "3.699.0", - "@aws-sdk/core": "3.696.0", - "@aws-sdk/credential-provider-node": "3.699.0", - "@aws-sdk/middleware-host-header": "3.696.0", - "@aws-sdk/middleware-logger": "3.696.0", - "@aws-sdk/middleware-recursion-detection": "3.696.0", - "@aws-sdk/middleware-user-agent": "3.696.0", - "@aws-sdk/region-config-resolver": "3.696.0", - "@aws-sdk/types": "3.696.0", - "@aws-sdk/util-endpoints": "3.696.0", - "@aws-sdk/util-user-agent-browser": "3.696.0", - "@aws-sdk/util-user-agent-node": "3.696.0", - "@smithy/config-resolver": "^3.0.12", - "@smithy/core": "^2.5.3", - "@smithy/eventstream-serde-browser": "^3.0.13", - "@smithy/eventstream-serde-config-resolver": "^3.0.10", - "@smithy/eventstream-serde-node": "^3.0.12", - "@smithy/fetch-http-handler": "^4.1.1", - "@smithy/hash-node": "^3.0.10", - "@smithy/invalid-dependency": "^3.0.10", - "@smithy/middleware-content-length": "^3.0.12", - "@smithy/middleware-endpoint": "^3.2.3", - "@smithy/middleware-retry": "^3.0.27", - "@smithy/middleware-serde": "^3.0.10", - "@smithy/middleware-stack": "^3.0.10", - "@smithy/node-config-provider": "^3.1.11", - "@smithy/node-http-handler": "^3.3.1", - "@smithy/protocol-http": "^4.1.7", - "@smithy/smithy-client": "^3.4.4", - "@smithy/types": "^3.7.1", - "@smithy/url-parser": "^3.0.10", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.27", - "@smithy/util-defaults-mode-node": "^3.0.27", - "@smithy/util-endpoints": "^2.1.6", - "@smithy/util-middleware": "^3.0.10", - "@smithy/util-retry": "^3.0.10", - "@smithy/util-stream": "^3.3.1", - "@smithy/util-utf8": "^3.0.0", + "@aws-sdk/core": "3.758.0", + "@aws-sdk/credential-provider-node": "3.758.0", + "@aws-sdk/middleware-host-header": "3.734.0", + "@aws-sdk/middleware-logger": "3.734.0", + "@aws-sdk/middleware-recursion-detection": "3.734.0", + "@aws-sdk/middleware-user-agent": "3.758.0", + "@aws-sdk/region-config-resolver": "3.734.0", + "@aws-sdk/types": "3.734.0", + "@aws-sdk/util-endpoints": "3.743.0", + "@aws-sdk/util-user-agent-browser": "3.734.0", + "@aws-sdk/util-user-agent-node": "3.758.0", + "@smithy/config-resolver": "^4.0.1", + "@smithy/core": "^3.1.5", + "@smithy/eventstream-serde-browser": "^4.0.1", + "@smithy/eventstream-serde-config-resolver": "^4.0.1", + "@smithy/eventstream-serde-node": "^4.0.1", + "@smithy/fetch-http-handler": "^5.0.1", + "@smithy/hash-node": "^4.0.1", + "@smithy/invalid-dependency": "^4.0.1", + "@smithy/middleware-content-length": "^4.0.1", + "@smithy/middleware-endpoint": "^4.0.6", + "@smithy/middleware-retry": "^4.0.7", + "@smithy/middleware-serde": "^4.0.2", + "@smithy/middleware-stack": "^4.0.1", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/node-http-handler": "^4.0.3", + "@smithy/protocol-http": "^5.0.1", + "@smithy/smithy-client": "^4.1.6", + "@smithy/types": "^4.1.0", + "@smithy/url-parser": "^4.0.1", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-body-length-node": "^4.0.0", + "@smithy/util-defaults-mode-browser": "^4.0.7", + "@smithy/util-defaults-mode-node": "^4.0.7", + "@smithy/util-endpoints": "^3.0.1", + "@smithy/util-middleware": "^4.0.1", + "@smithy/util-retry": "^4.0.1", + "@smithy/util-stream": "^4.1.2", + "@smithy/util-utf8": "^4.0.0", "@types/uuid": "^9.0.1", "tslib": "^2.6.2", "uuid": "^9.0.1" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/client-cognito-identity": { - "version": "3.699.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.699.0.tgz", - "integrity": "sha512-9tFt+we6AIvj/f1+nrLHuCWcQmyfux5gcBSOy9d9+zIG56YxGEX7S9TaZnybogpVV8A0BYWml36WvIHS9QjIpA==", + "version": "3.758.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.758.0.tgz", + "integrity": "sha512-8bOXVYtf/0OUN0jXTIHLv3V0TAS6kvvCRAy7nmiL/fDde0O+ChW1WZU7CVPAOtFEpFCdKskDcxFspM7m1k6qyg==", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.699.0", - "@aws-sdk/client-sts": "3.699.0", - "@aws-sdk/core": "3.696.0", - "@aws-sdk/credential-provider-node": "3.699.0", - "@aws-sdk/middleware-host-header": "3.696.0", - "@aws-sdk/middleware-logger": "3.696.0", - "@aws-sdk/middleware-recursion-detection": "3.696.0", - "@aws-sdk/middleware-user-agent": "3.696.0", - "@aws-sdk/region-config-resolver": "3.696.0", - "@aws-sdk/types": "3.696.0", - "@aws-sdk/util-endpoints": "3.696.0", - "@aws-sdk/util-user-agent-browser": "3.696.0", - "@aws-sdk/util-user-agent-node": "3.696.0", - "@smithy/config-resolver": "^3.0.12", - "@smithy/core": "^2.5.3", - "@smithy/fetch-http-handler": "^4.1.1", - "@smithy/hash-node": "^3.0.10", - "@smithy/invalid-dependency": "^3.0.10", - "@smithy/middleware-content-length": "^3.0.12", - "@smithy/middleware-endpoint": "^3.2.3", - "@smithy/middleware-retry": "^3.0.27", - "@smithy/middleware-serde": "^3.0.10", - "@smithy/middleware-stack": "^3.0.10", - "@smithy/node-config-provider": "^3.1.11", - "@smithy/node-http-handler": "^3.3.1", - "@smithy/protocol-http": "^4.1.7", - "@smithy/smithy-client": "^3.4.4", - "@smithy/types": "^3.7.1", - "@smithy/url-parser": "^3.0.10", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.27", - "@smithy/util-defaults-mode-node": "^3.0.27", - "@smithy/util-endpoints": "^2.1.6", - "@smithy/util-middleware": "^3.0.10", - "@smithy/util-retry": "^3.0.10", - "@smithy/util-utf8": "^3.0.0", + "@aws-sdk/core": "3.758.0", + "@aws-sdk/credential-provider-node": "3.758.0", + "@aws-sdk/middleware-host-header": "3.734.0", + "@aws-sdk/middleware-logger": "3.734.0", + "@aws-sdk/middleware-recursion-detection": "3.734.0", + "@aws-sdk/middleware-user-agent": "3.758.0", + "@aws-sdk/region-config-resolver": "3.734.0", + "@aws-sdk/types": "3.734.0", + "@aws-sdk/util-endpoints": "3.743.0", + "@aws-sdk/util-user-agent-browser": "3.734.0", + "@aws-sdk/util-user-agent-node": "3.758.0", + "@smithy/config-resolver": "^4.0.1", + "@smithy/core": "^3.1.5", + "@smithy/fetch-http-handler": "^5.0.1", + "@smithy/hash-node": "^4.0.1", + "@smithy/invalid-dependency": "^4.0.1", + "@smithy/middleware-content-length": "^4.0.1", + "@smithy/middleware-endpoint": "^4.0.6", + "@smithy/middleware-retry": "^4.0.7", + "@smithy/middleware-serde": "^4.0.2", + "@smithy/middleware-stack": "^4.0.1", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/node-http-handler": "^4.0.3", + "@smithy/protocol-http": "^5.0.1", + "@smithy/smithy-client": "^4.1.6", + "@smithy/types": "^4.1.0", + "@smithy/url-parser": "^4.0.1", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-body-length-node": "^4.0.0", + "@smithy/util-defaults-mode-browser": "^4.0.7", + "@smithy/util-defaults-mode-node": "^4.0.7", + "@smithy/util-endpoints": "^3.0.1", + "@smithy/util-middleware": "^4.0.1", + "@smithy/util-retry": "^4.0.1", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/client-sagemaker-runtime": { - "version": "3.699.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sagemaker-runtime/-/client-sagemaker-runtime-3.699.0.tgz", - "integrity": "sha512-okWP5FcnOJlpIE+xoByhfh0N+93pXMNr6X5YXTiYnbChu7E86ST2CORkcmD/GDdvPpS8RV9qZCGI0QjS3pQlWA==", + "version": "3.758.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sagemaker-runtime/-/client-sagemaker-runtime-3.758.0.tgz", + "integrity": "sha512-6pZdZT+Xol56UKcpUDzOlRwLgmVIgv4I2bvCsvq4YI0TnSNhO6/Ob2I8l0GzUTU2qoO2XBkrhO1t+zLuc681ig==", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.699.0", - "@aws-sdk/client-sts": "3.699.0", - "@aws-sdk/core": "3.696.0", - "@aws-sdk/credential-provider-node": "3.699.0", - "@aws-sdk/middleware-host-header": "3.696.0", - "@aws-sdk/middleware-logger": "3.696.0", - "@aws-sdk/middleware-recursion-detection": "3.696.0", - "@aws-sdk/middleware-user-agent": "3.696.0", - "@aws-sdk/region-config-resolver": "3.696.0", - "@aws-sdk/types": "3.696.0", - "@aws-sdk/util-endpoints": "3.696.0", - "@aws-sdk/util-user-agent-browser": "3.696.0", - "@aws-sdk/util-user-agent-node": "3.696.0", - "@smithy/config-resolver": "^3.0.12", - "@smithy/core": "^2.5.3", - "@smithy/eventstream-serde-browser": "^3.0.13", - "@smithy/eventstream-serde-config-resolver": "^3.0.10", - "@smithy/eventstream-serde-node": "^3.0.12", - "@smithy/fetch-http-handler": "^4.1.1", - "@smithy/hash-node": "^3.0.10", - "@smithy/invalid-dependency": "^3.0.10", - "@smithy/middleware-content-length": "^3.0.12", - "@smithy/middleware-endpoint": "^3.2.3", - "@smithy/middleware-retry": "^3.0.27", - "@smithy/middleware-serde": "^3.0.10", - "@smithy/middleware-stack": "^3.0.10", - "@smithy/node-config-provider": "^3.1.11", - "@smithy/node-http-handler": "^3.3.1", - "@smithy/protocol-http": "^4.1.7", - "@smithy/smithy-client": "^3.4.4", - "@smithy/types": "^3.7.1", - "@smithy/url-parser": "^3.0.10", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.27", - "@smithy/util-defaults-mode-node": "^3.0.27", - "@smithy/util-endpoints": "^2.1.6", - "@smithy/util-middleware": "^3.0.10", - "@smithy/util-retry": "^3.0.10", - "@smithy/util-stream": "^3.3.1", - "@smithy/util-utf8": "^3.0.0", + "@aws-sdk/core": "3.758.0", + "@aws-sdk/credential-provider-node": "3.758.0", + "@aws-sdk/middleware-host-header": "3.734.0", + "@aws-sdk/middleware-logger": "3.734.0", + "@aws-sdk/middleware-recursion-detection": "3.734.0", + "@aws-sdk/middleware-user-agent": "3.758.0", + "@aws-sdk/region-config-resolver": "3.734.0", + "@aws-sdk/types": "3.734.0", + "@aws-sdk/util-endpoints": "3.743.0", + "@aws-sdk/util-user-agent-browser": "3.734.0", + "@aws-sdk/util-user-agent-node": "3.758.0", + "@smithy/config-resolver": "^4.0.1", + "@smithy/core": "^3.1.5", + "@smithy/eventstream-serde-browser": "^4.0.1", + "@smithy/eventstream-serde-config-resolver": "^4.0.1", + "@smithy/eventstream-serde-node": "^4.0.1", + "@smithy/fetch-http-handler": "^5.0.1", + "@smithy/hash-node": "^4.0.1", + "@smithy/invalid-dependency": "^4.0.1", + "@smithy/middleware-content-length": "^4.0.1", + "@smithy/middleware-endpoint": "^4.0.6", + "@smithy/middleware-retry": "^4.0.7", + "@smithy/middleware-serde": "^4.0.2", + "@smithy/middleware-stack": "^4.0.1", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/node-http-handler": "^4.0.3", + "@smithy/protocol-http": "^5.0.1", + "@smithy/smithy-client": "^4.1.6", + "@smithy/types": "^4.1.0", + "@smithy/url-parser": "^4.0.1", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-body-length-node": "^4.0.0", + "@smithy/util-defaults-mode-browser": "^4.0.7", + "@smithy/util-defaults-mode-node": "^4.0.7", + "@smithy/util-endpoints": "^3.0.1", + "@smithy/util-middleware": "^4.0.1", + "@smithy/util-retry": "^4.0.1", + "@smithy/util-stream": "^4.1.2", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/client-sso": { - "version": "3.696.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.696.0.tgz", - "integrity": "sha512-q5TTkd08JS0DOkHfUL853tuArf7NrPeqoS5UOvqJho8ibV9Ak/a/HO4kNvy9Nj3cib/toHYHsQIEtecUPSUUrQ==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.696.0", - "@aws-sdk/middleware-host-header": "3.696.0", - "@aws-sdk/middleware-logger": "3.696.0", - "@aws-sdk/middleware-recursion-detection": "3.696.0", - "@aws-sdk/middleware-user-agent": "3.696.0", - "@aws-sdk/region-config-resolver": "3.696.0", - "@aws-sdk/types": "3.696.0", - "@aws-sdk/util-endpoints": "3.696.0", - "@aws-sdk/util-user-agent-browser": "3.696.0", - "@aws-sdk/util-user-agent-node": "3.696.0", - "@smithy/config-resolver": "^3.0.12", - "@smithy/core": "^2.5.3", - "@smithy/fetch-http-handler": "^4.1.1", - "@smithy/hash-node": "^3.0.10", - "@smithy/invalid-dependency": "^3.0.10", - "@smithy/middleware-content-length": "^3.0.12", - "@smithy/middleware-endpoint": "^3.2.3", - "@smithy/middleware-retry": "^3.0.27", - "@smithy/middleware-serde": "^3.0.10", - "@smithy/middleware-stack": "^3.0.10", - "@smithy/node-config-provider": "^3.1.11", - "@smithy/node-http-handler": "^3.3.1", - "@smithy/protocol-http": "^4.1.7", - "@smithy/smithy-client": "^3.4.4", - "@smithy/types": "^3.7.1", - "@smithy/url-parser": "^3.0.10", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.27", - "@smithy/util-defaults-mode-node": "^3.0.27", - "@smithy/util-endpoints": "^2.1.6", - "@smithy/util-middleware": "^3.0.10", - "@smithy/util-retry": "^3.0.10", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.699.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.699.0.tgz", - "integrity": "sha512-u8a1GorY5D1l+4FQAf4XBUC1T10/t7neuwT21r0ymrtMFSK2a9QqVHKMoLkvavAwyhJnARSBM9/UQC797PFOFw==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.696.0", - "@aws-sdk/credential-provider-node": "3.699.0", - "@aws-sdk/middleware-host-header": "3.696.0", - "@aws-sdk/middleware-logger": "3.696.0", - "@aws-sdk/middleware-recursion-detection": "3.696.0", - "@aws-sdk/middleware-user-agent": "3.696.0", - "@aws-sdk/region-config-resolver": "3.696.0", - "@aws-sdk/types": "3.696.0", - "@aws-sdk/util-endpoints": "3.696.0", - "@aws-sdk/util-user-agent-browser": "3.696.0", - "@aws-sdk/util-user-agent-node": "3.696.0", - "@smithy/config-resolver": "^3.0.12", - "@smithy/core": "^2.5.3", - "@smithy/fetch-http-handler": "^4.1.1", - "@smithy/hash-node": "^3.0.10", - "@smithy/invalid-dependency": "^3.0.10", - "@smithy/middleware-content-length": "^3.0.12", - "@smithy/middleware-endpoint": "^3.2.3", - "@smithy/middleware-retry": "^3.0.27", - "@smithy/middleware-serde": "^3.0.10", - "@smithy/middleware-stack": "^3.0.10", - "@smithy/node-config-provider": "^3.1.11", - "@smithy/node-http-handler": "^3.3.1", - "@smithy/protocol-http": "^4.1.7", - "@smithy/smithy-client": "^3.4.4", - "@smithy/types": "^3.7.1", - "@smithy/url-parser": "^3.0.10", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.27", - "@smithy/util-defaults-mode-node": "^3.0.27", - "@smithy/util-endpoints": "^2.1.6", - "@smithy/util-middleware": "^3.0.10", - "@smithy/util-retry": "^3.0.10", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.699.0" - } - }, - "node_modules/@aws-sdk/client-sts": { - "version": "3.699.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.699.0.tgz", - "integrity": "sha512-++lsn4x2YXsZPIzFVwv3fSUVM55ZT0WRFmPeNilYIhZClxHLmVAWKH4I55cY9ry60/aTKYjzOXkWwyBKGsGvQg==", + "version": "3.758.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.758.0.tgz", + "integrity": "sha512-BoGO6IIWrLyLxQG6txJw6RT2urmbtlwfggapNCrNPyYjlXpzTSJhBYjndg7TpDATFd0SXL0zm8y/tXsUXNkdYQ==", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.699.0", - "@aws-sdk/core": "3.696.0", - "@aws-sdk/credential-provider-node": "3.699.0", - "@aws-sdk/middleware-host-header": "3.696.0", - "@aws-sdk/middleware-logger": "3.696.0", - "@aws-sdk/middleware-recursion-detection": "3.696.0", - "@aws-sdk/middleware-user-agent": "3.696.0", - "@aws-sdk/region-config-resolver": "3.696.0", - "@aws-sdk/types": "3.696.0", - "@aws-sdk/util-endpoints": "3.696.0", - "@aws-sdk/util-user-agent-browser": "3.696.0", - "@aws-sdk/util-user-agent-node": "3.696.0", - "@smithy/config-resolver": "^3.0.12", - "@smithy/core": "^2.5.3", - "@smithy/fetch-http-handler": "^4.1.1", - "@smithy/hash-node": "^3.0.10", - "@smithy/invalid-dependency": "^3.0.10", - "@smithy/middleware-content-length": "^3.0.12", - "@smithy/middleware-endpoint": "^3.2.3", - "@smithy/middleware-retry": "^3.0.27", - "@smithy/middleware-serde": "^3.0.10", - "@smithy/middleware-stack": "^3.0.10", - "@smithy/node-config-provider": "^3.1.11", - "@smithy/node-http-handler": "^3.3.1", - "@smithy/protocol-http": "^4.1.7", - "@smithy/smithy-client": "^3.4.4", - "@smithy/types": "^3.7.1", - "@smithy/url-parser": "^3.0.10", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.27", - "@smithy/util-defaults-mode-node": "^3.0.27", - "@smithy/util-endpoints": "^2.1.6", - "@smithy/util-middleware": "^3.0.10", - "@smithy/util-retry": "^3.0.10", - "@smithy/util-utf8": "^3.0.0", + "@aws-sdk/core": "3.758.0", + "@aws-sdk/middleware-host-header": "3.734.0", + "@aws-sdk/middleware-logger": "3.734.0", + "@aws-sdk/middleware-recursion-detection": "3.734.0", + "@aws-sdk/middleware-user-agent": "3.758.0", + "@aws-sdk/region-config-resolver": "3.734.0", + "@aws-sdk/types": "3.734.0", + "@aws-sdk/util-endpoints": "3.743.0", + "@aws-sdk/util-user-agent-browser": "3.734.0", + "@aws-sdk/util-user-agent-node": "3.758.0", + "@smithy/config-resolver": "^4.0.1", + "@smithy/core": "^3.1.5", + "@smithy/fetch-http-handler": "^5.0.1", + "@smithy/hash-node": "^4.0.1", + "@smithy/invalid-dependency": "^4.0.1", + "@smithy/middleware-content-length": "^4.0.1", + "@smithy/middleware-endpoint": "^4.0.6", + "@smithy/middleware-retry": "^4.0.7", + "@smithy/middleware-serde": "^4.0.2", + "@smithy/middleware-stack": "^4.0.1", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/node-http-handler": "^4.0.3", + "@smithy/protocol-http": "^5.0.1", + "@smithy/smithy-client": "^4.1.6", + "@smithy/types": "^4.1.0", + "@smithy/url-parser": "^4.0.1", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-body-length-node": "^4.0.0", + "@smithy/util-defaults-mode-browser": "^4.0.7", + "@smithy/util-defaults-mode-node": "^4.0.7", + "@smithy/util-endpoints": "^3.0.1", + "@smithy/util-middleware": "^4.0.1", + "@smithy/util-retry": "^4.0.1", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/core": { - "version": "3.696.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.696.0.tgz", - "integrity": "sha512-3c9III1k03DgvRZWg8vhVmfIXPG6hAciN9MzQTzqGngzWAELZF/WONRTRQuDFixVtarQatmLHYVw/atGeA2Byw==", - "dependencies": { - "@aws-sdk/types": "3.696.0", - "@smithy/core": "^2.5.3", - "@smithy/node-config-provider": "^3.1.11", - "@smithy/property-provider": "^3.1.9", - "@smithy/protocol-http": "^4.1.7", - "@smithy/signature-v4": "^4.2.2", - "@smithy/smithy-client": "^3.4.4", - "@smithy/types": "^3.7.1", - "@smithy/util-middleware": "^3.0.10", + "version": "3.758.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.758.0.tgz", + "integrity": "sha512-0RswbdR9jt/XKemaLNuxi2gGr4xGlHyGxkTdhSQzCyUe9A9OPCoLl3rIESRguQEech+oJnbHk/wuiwHqTuP9sg==", + "dependencies": { + "@aws-sdk/types": "3.734.0", + "@smithy/core": "^3.1.5", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/property-provider": "^4.0.1", + "@smithy/protocol-http": "^5.0.1", + "@smithy/signature-v4": "^5.0.1", + "@smithy/smithy-client": "^4.1.6", + "@smithy/types": "^4.1.0", + "@smithy/util-middleware": "^4.0.1", "fast-xml-parser": "4.4.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/credential-provider-cognito-identity": { - "version": "3.699.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.699.0.tgz", - "integrity": "sha512-iuaTnudaBfEET+o444sDwf71Awe6UiZfH+ipUPmswAi2jZDwdFF1nxMKDEKL8/LV5WpXsdKSfwgS0RQeupURew==", - "dependencies": { - "@aws-sdk/client-cognito-identity": "3.699.0", - "@aws-sdk/types": "3.696.0", - "@smithy/property-provider": "^3.1.9", - "@smithy/types": "^3.7.1", + "version": "3.758.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.758.0.tgz", + "integrity": "sha512-y/rHZqyChlEkNRr59gn4hv0gjhJwGmdCdW0JI1K9p3P9p7EurWGjr2M6+goTn3ilOlcAwrl5oFKR5jLt27TkOA==", + "dependencies": { + "@aws-sdk/client-cognito-identity": "3.758.0", + "@aws-sdk/types": "3.734.0", + "@smithy/property-provider": "^4.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.696.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.696.0.tgz", - "integrity": "sha512-T9iMFnJL7YTlESLpVFT3fg1Lkb1lD+oiaIC8KMpepb01gDUBIpj9+Y+pA/cgRWW0yRxmkDXNazAE2qQTVFGJzA==", - "dependencies": { - "@aws-sdk/core": "3.696.0", - "@aws-sdk/types": "3.696.0", - "@smithy/property-provider": "^3.1.9", - "@smithy/types": "^3.7.1", + "version": "3.758.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.758.0.tgz", + "integrity": "sha512-N27eFoRrO6MeUNumtNHDW9WOiwfd59LPXPqDrIa3kWL/s+fOKFHb9xIcF++bAwtcZnAxKkgpDCUP+INNZskE+w==", + "dependencies": { + "@aws-sdk/core": "3.758.0", + "@aws-sdk/types": "3.734.0", + "@smithy/property-provider": "^4.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/credential-provider-http": { - "version": "3.696.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.696.0.tgz", - "integrity": "sha512-GV6EbvPi2eq1+WgY/o2RFA3P7HGmnkIzCNmhwtALFlqMroLYWKE7PSeHw66Uh1dFQeVESn0/+hiUNhu1mB0emA==", - "dependencies": { - "@aws-sdk/core": "3.696.0", - "@aws-sdk/types": "3.696.0", - "@smithy/fetch-http-handler": "^4.1.1", - "@smithy/node-http-handler": "^3.3.1", - "@smithy/property-provider": "^3.1.9", - "@smithy/protocol-http": "^4.1.7", - "@smithy/smithy-client": "^3.4.4", - "@smithy/types": "^3.7.1", - "@smithy/util-stream": "^3.3.1", + "version": "3.758.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.758.0.tgz", + "integrity": "sha512-Xt9/U8qUCiw1hihztWkNeIR+arg6P+yda10OuCHX6kFVx3auTlU7+hCqs3UxqniGU4dguHuftf3mRpi5/GJ33Q==", + "dependencies": { + "@aws-sdk/core": "3.758.0", + "@aws-sdk/types": "3.734.0", + "@smithy/fetch-http-handler": "^5.0.1", + "@smithy/node-http-handler": "^4.0.3", + "@smithy/property-provider": "^4.0.1", + "@smithy/protocol-http": "^5.0.1", + "@smithy/smithy-client": "^4.1.6", + "@smithy/types": "^4.1.0", + "@smithy/util-stream": "^4.1.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.699.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.699.0.tgz", - "integrity": "sha512-dXmCqjJnKmG37Q+nLjPVu22mNkrGHY8hYoOt3Jo9R2zr5MYV7s/NHsCHr+7E+BZ+tfZYLRPeB1wkpTeHiEcdRw==", - "dependencies": { - "@aws-sdk/core": "3.696.0", - "@aws-sdk/credential-provider-env": "3.696.0", - "@aws-sdk/credential-provider-http": "3.696.0", - "@aws-sdk/credential-provider-process": "3.696.0", - "@aws-sdk/credential-provider-sso": "3.699.0", - "@aws-sdk/credential-provider-web-identity": "3.696.0", - "@aws-sdk/types": "3.696.0", - "@smithy/credential-provider-imds": "^3.2.6", - "@smithy/property-provider": "^3.1.9", - "@smithy/shared-ini-file-loader": "^3.1.10", - "@smithy/types": "^3.7.1", + "version": "3.758.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.758.0.tgz", + "integrity": "sha512-cymSKMcP5d+OsgetoIZ5QCe1wnp2Q/tq+uIxVdh9MbfdBBEnl9Ecq6dH6VlYS89sp4QKuxHxkWXVnbXU3Q19Aw==", + "dependencies": { + "@aws-sdk/core": "3.758.0", + "@aws-sdk/credential-provider-env": "3.758.0", + "@aws-sdk/credential-provider-http": "3.758.0", + "@aws-sdk/credential-provider-process": "3.758.0", + "@aws-sdk/credential-provider-sso": "3.758.0", + "@aws-sdk/credential-provider-web-identity": "3.758.0", + "@aws-sdk/nested-clients": "3.758.0", + "@aws-sdk/types": "3.734.0", + "@smithy/credential-provider-imds": "^4.0.1", + "@smithy/property-provider": "^4.0.1", + "@smithy/shared-ini-file-loader": "^4.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.699.0" + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.699.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.699.0.tgz", - "integrity": "sha512-MmEmNDo1bBtTgRmdNfdQksXu4uXe66s0p1hi1YPrn1h59Q605eq/xiWbGL6/3KdkViH6eGUuABeV2ODld86ylg==", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.696.0", - "@aws-sdk/credential-provider-http": "3.696.0", - "@aws-sdk/credential-provider-ini": "3.699.0", - "@aws-sdk/credential-provider-process": "3.696.0", - "@aws-sdk/credential-provider-sso": "3.699.0", - "@aws-sdk/credential-provider-web-identity": "3.696.0", - "@aws-sdk/types": "3.696.0", - "@smithy/credential-provider-imds": "^3.2.6", - "@smithy/property-provider": "^3.1.9", - "@smithy/shared-ini-file-loader": "^3.1.10", - "@smithy/types": "^3.7.1", + "version": "3.758.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.758.0.tgz", + "integrity": "sha512-+DaMv63wiq7pJrhIQzZYMn4hSarKiizDoJRvyR7WGhnn0oQ/getX9Z0VNCV3i7lIFoLNTb7WMmQ9k7+z/uD5EQ==", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.758.0", + "@aws-sdk/credential-provider-http": "3.758.0", + "@aws-sdk/credential-provider-ini": "3.758.0", + "@aws-sdk/credential-provider-process": "3.758.0", + "@aws-sdk/credential-provider-sso": "3.758.0", + "@aws-sdk/credential-provider-web-identity": "3.758.0", + "@aws-sdk/types": "3.734.0", + "@smithy/credential-provider-imds": "^4.0.1", + "@smithy/property-provider": "^4.0.1", + "@smithy/shared-ini-file-loader": "^4.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.696.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.696.0.tgz", - "integrity": "sha512-mL1RcFDe9sfmyU5K1nuFkO8UiJXXxLX4JO1gVaDIOvPqwStpUAwi3A1BoeZhWZZNQsiKI810RnYGo0E0WB/hUA==", - "dependencies": { - "@aws-sdk/core": "3.696.0", - "@aws-sdk/types": "3.696.0", - "@smithy/property-provider": "^3.1.9", - "@smithy/shared-ini-file-loader": "^3.1.10", - "@smithy/types": "^3.7.1", + "version": "3.758.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.758.0.tgz", + "integrity": "sha512-AzcY74QTPqcbXWVgjpPZ3HOmxQZYPROIBz2YINF0OQk0MhezDWV/O7Xec+K1+MPGQO3qS6EDrUUlnPLjsqieHA==", + "dependencies": { + "@aws-sdk/core": "3.758.0", + "@aws-sdk/types": "3.734.0", + "@smithy/property-provider": "^4.0.1", + "@smithy/shared-ini-file-loader": "^4.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.699.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.699.0.tgz", - "integrity": "sha512-Ekp2cZG4pl9D8+uKWm4qO1xcm8/MeiI8f+dnlZm8aQzizeC+aXYy9GyoclSf6daK8KfRPiRfM7ZHBBL5dAfdMA==", - "dependencies": { - "@aws-sdk/client-sso": "3.696.0", - "@aws-sdk/core": "3.696.0", - "@aws-sdk/token-providers": "3.699.0", - "@aws-sdk/types": "3.696.0", - "@smithy/property-provider": "^3.1.9", - "@smithy/shared-ini-file-loader": "^3.1.10", - "@smithy/types": "^3.7.1", + "version": "3.758.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.758.0.tgz", + "integrity": "sha512-x0FYJqcOLUCv8GLLFDYMXRAQKGjoM+L0BG4BiHYZRDf24yQWFCAZsCQAYKo6XZYh2qznbsW6f//qpyJ5b0QVKQ==", + "dependencies": { + "@aws-sdk/client-sso": "3.758.0", + "@aws-sdk/core": "3.758.0", + "@aws-sdk/token-providers": "3.758.0", + "@aws-sdk/types": "3.734.0", + "@smithy/property-provider": "^4.0.1", + "@smithy/shared-ini-file-loader": "^4.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.696.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.696.0.tgz", - "integrity": "sha512-XJ/CVlWChM0VCoc259vWguFUjJDn/QwDqHwbx+K9cg3v6yrqXfK5ai+p/6lx0nQpnk4JzPVeYYxWRpaTsGC9rg==", - "dependencies": { - "@aws-sdk/core": "3.696.0", - "@aws-sdk/types": "3.696.0", - "@smithy/property-provider": "^3.1.9", - "@smithy/types": "^3.7.1", + "version": "3.758.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.758.0.tgz", + "integrity": "sha512-XGguXhBqiCXMXRxcfCAVPlMbm3VyJTou79r/3mxWddHWF0XbhaQiBIbUz6vobVTD25YQRbWSmSch7VA8kI5Lrw==", + "dependencies": { + "@aws-sdk/core": "3.758.0", + "@aws-sdk/nested-clients": "3.758.0", + "@aws-sdk/types": "3.734.0", + "@smithy/property-provider": "^4.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.696.0" + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/credential-providers": { - "version": "3.699.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.699.0.tgz", - "integrity": "sha512-jBjOntl9zN9Nvb0jmbMGRbiTzemDz64ij7W6BDavxBJRZpRoNeN0QCz6RolkCyXnyUJjo5mF2unY2wnv00A+LQ==", - "dependencies": { - "@aws-sdk/client-cognito-identity": "3.699.0", - "@aws-sdk/client-sso": "3.696.0", - "@aws-sdk/client-sts": "3.699.0", - "@aws-sdk/core": "3.696.0", - "@aws-sdk/credential-provider-cognito-identity": "3.699.0", - "@aws-sdk/credential-provider-env": "3.696.0", - "@aws-sdk/credential-provider-http": "3.696.0", - "@aws-sdk/credential-provider-ini": "3.699.0", - "@aws-sdk/credential-provider-node": "3.699.0", - "@aws-sdk/credential-provider-process": "3.696.0", - "@aws-sdk/credential-provider-sso": "3.699.0", - "@aws-sdk/credential-provider-web-identity": "3.696.0", - "@aws-sdk/types": "3.696.0", - "@smithy/credential-provider-imds": "^3.2.6", - "@smithy/property-provider": "^3.1.9", - "@smithy/types": "^3.7.1", + "version": "3.758.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.758.0.tgz", + "integrity": "sha512-BaGVBdm9ynsErIc/mLuUwJ1OQcL/pkhCuAm24jpsif3evZ5wgyZnEAZB2yRin+mQnQaQT3L+KvTbdKGfjL8+fQ==", + "dependencies": { + "@aws-sdk/client-cognito-identity": "3.758.0", + "@aws-sdk/core": "3.758.0", + "@aws-sdk/credential-provider-cognito-identity": "3.758.0", + "@aws-sdk/credential-provider-env": "3.758.0", + "@aws-sdk/credential-provider-http": "3.758.0", + "@aws-sdk/credential-provider-ini": "3.758.0", + "@aws-sdk/credential-provider-node": "3.758.0", + "@aws-sdk/credential-provider-process": "3.758.0", + "@aws-sdk/credential-provider-sso": "3.758.0", + "@aws-sdk/credential-provider-web-identity": "3.758.0", + "@aws-sdk/nested-clients": "3.758.0", + "@aws-sdk/types": "3.734.0", + "@smithy/core": "^3.1.5", + "@smithy/credential-provider-imds": "^4.0.1", + "@smithy/property-provider": "^4.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.696.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.696.0.tgz", - "integrity": "sha512-zELJp9Ta2zkX7ELggMN9qMCgekqZhFC5V2rOr4hJDEb/Tte7gpfKSObAnw/3AYiVqt36sjHKfdkoTsuwGdEoDg==", + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.734.0.tgz", + "integrity": "sha512-LW7RRgSOHHBzWZnigNsDIzu3AiwtjeI2X66v+Wn1P1u+eXssy1+up4ZY/h+t2sU4LU36UvEf+jrZti9c6vRnFw==", "dependencies": { - "@aws-sdk/types": "3.696.0", - "@smithy/protocol-http": "^4.1.7", - "@smithy/types": "^3.7.1", + "@aws-sdk/types": "3.734.0", + "@smithy/protocol-http": "^5.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/middleware-logger": { - "version": "3.696.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.696.0.tgz", - "integrity": "sha512-KhkHt+8AjCxcR/5Zp3++YPJPpFQzxpr+jmONiT/Jw2yqnSngZ0Yspm5wGoRx2hS1HJbyZNuaOWEGuJoxLeBKfA==", + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.734.0.tgz", + "integrity": "sha512-mUMFITpJUW3LcKvFok176eI5zXAUomVtahb9IQBwLzkqFYOrMJvWAvoV4yuxrJ8TlQBG8gyEnkb9SnhZvjg67w==", "dependencies": { - "@aws-sdk/types": "3.696.0", - "@smithy/types": "^3.7.1", + "@aws-sdk/types": "3.734.0", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.696.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.696.0.tgz", - "integrity": "sha512-si/maV3Z0hH7qa99f9ru2xpS5HlfSVcasRlNUXKSDm611i7jFMWwGNLUOXFAOLhXotPX5G3Z6BLwL34oDeBMug==", + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.734.0.tgz", + "integrity": "sha512-CUat2d9ITsFc2XsmeiRQO96iWpxSKYFjxvj27Hc7vo87YUHRnfMfnc8jw1EpxEwMcvBD7LsRa6vDNky6AjcrFA==", "dependencies": { - "@aws-sdk/types": "3.696.0", - "@smithy/protocol-http": "^4.1.7", - "@smithy/types": "^3.7.1", + "@aws-sdk/types": "3.734.0", + "@smithy/protocol-http": "^5.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.696.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.696.0.tgz", - "integrity": "sha512-Lvyj8CTyxrHI6GHd2YVZKIRI5Fmnugt3cpJo0VrKKEgK5zMySwEZ1n4dqPK6czYRWKd5+WnYHYAuU+Wdk6Jsjw==", - "dependencies": { - "@aws-sdk/core": "3.696.0", - "@aws-sdk/types": "3.696.0", - "@aws-sdk/util-endpoints": "3.696.0", - "@smithy/core": "^2.5.3", - "@smithy/protocol-http": "^4.1.7", - "@smithy/types": "^3.7.1", + "version": "3.758.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.758.0.tgz", + "integrity": "sha512-iNyehQXtQlj69JCgfaOssgZD4HeYGOwxcaKeG6F+40cwBjTAi0+Ph1yfDwqk2qiBPIRWJ/9l2LodZbxiBqgrwg==", + "dependencies": { + "@aws-sdk/core": "3.758.0", + "@aws-sdk/types": "3.734.0", + "@aws-sdk/util-endpoints": "3.743.0", + "@smithy/core": "^3.1.5", + "@smithy/protocol-http": "^5.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients": { + "version": "3.758.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.758.0.tgz", + "integrity": "sha512-YZ5s7PSvyF3Mt2h1EQulCG93uybprNGbBkPmVuy/HMMfbFTt4iL3SbKjxqvOZelm86epFfj7pvK7FliI2WOEcg==", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.758.0", + "@aws-sdk/middleware-host-header": "3.734.0", + "@aws-sdk/middleware-logger": "3.734.0", + "@aws-sdk/middleware-recursion-detection": "3.734.0", + "@aws-sdk/middleware-user-agent": "3.758.0", + "@aws-sdk/region-config-resolver": "3.734.0", + "@aws-sdk/types": "3.734.0", + "@aws-sdk/util-endpoints": "3.743.0", + "@aws-sdk/util-user-agent-browser": "3.734.0", + "@aws-sdk/util-user-agent-node": "3.758.0", + "@smithy/config-resolver": "^4.0.1", + "@smithy/core": "^3.1.5", + "@smithy/fetch-http-handler": "^5.0.1", + "@smithy/hash-node": "^4.0.1", + "@smithy/invalid-dependency": "^4.0.1", + "@smithy/middleware-content-length": "^4.0.1", + "@smithy/middleware-endpoint": "^4.0.6", + "@smithy/middleware-retry": "^4.0.7", + "@smithy/middleware-serde": "^4.0.2", + "@smithy/middleware-stack": "^4.0.1", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/node-http-handler": "^4.0.3", + "@smithy/protocol-http": "^5.0.1", + "@smithy/smithy-client": "^4.1.6", + "@smithy/types": "^4.1.0", + "@smithy/url-parser": "^4.0.1", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-body-length-node": "^4.0.0", + "@smithy/util-defaults-mode-browser": "^4.0.7", + "@smithy/util-defaults-mode-node": "^4.0.7", + "@smithy/util-endpoints": "^3.0.1", + "@smithy/util-middleware": "^4.0.1", + "@smithy/util-retry": "^4.0.1", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/region-config-resolver": { - "version": "3.696.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.696.0.tgz", - "integrity": "sha512-7EuH142lBXjI8yH6dVS/CZeiK/WZsmb/8zP6bQbVYpMrppSTgB3MzZZdxVZGzL5r8zPQOU10wLC4kIMy0qdBVQ==", - "dependencies": { - "@aws-sdk/types": "3.696.0", - "@smithy/node-config-provider": "^3.1.11", - "@smithy/types": "^3.7.1", - "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.10", + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.734.0.tgz", + "integrity": "sha512-Lvj1kPRC5IuJBr9DyJ9T9/plkh+EfKLy+12s/mykOy1JaKHDpvj+XGy2YO6YgYVOb8JFtaqloid+5COtje4JTQ==", + "dependencies": { + "@aws-sdk/types": "3.734.0", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/types": "^4.1.0", + "@smithy/util-config-provider": "^4.0.0", + "@smithy/util-middleware": "^4.0.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/token-providers": { - "version": "3.699.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.699.0.tgz", - "integrity": "sha512-kuiEW9DWs7fNos/SM+y58HCPhcIzm1nEZLhe2/7/6+TvAYLuEWURYsbK48gzsxXlaJ2k/jGY3nIsA7RptbMOwA==", - "dependencies": { - "@aws-sdk/types": "3.696.0", - "@smithy/property-provider": "^3.1.9", - "@smithy/shared-ini-file-loader": "^3.1.10", - "@smithy/types": "^3.7.1", + "version": "3.758.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.758.0.tgz", + "integrity": "sha512-ckptN1tNrIfQUaGWm/ayW1ddG+imbKN7HHhjFdS4VfItsP0QQOB0+Ov+tpgb4MoNR4JaUghMIVStjIeHN2ks1w==", + "dependencies": { + "@aws-sdk/nested-clients": "3.758.0", + "@aws-sdk/types": "3.734.0", + "@smithy/property-provider": "^4.0.1", + "@smithy/shared-ini-file-loader": "^4.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sso-oidc": "^3.699.0" + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/types": { - "version": "3.696.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.696.0.tgz", - "integrity": "sha512-9rTvUJIAj5d3//U5FDPWGJ1nFJLuWb30vugGOrWk7aNZ6y9tuA3PI7Cc9dP8WEXKVyK1vuuk8rSFP2iqXnlgrw==", + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.734.0.tgz", + "integrity": "sha512-o11tSPTT70nAkGV1fN9wm/hAIiLPyWX6SuGf+9JyTp7S/rC2cFWhR26MvA69nplcjNaXVzB0f+QFrLXXjOqCrg==", "dependencies": { - "@smithy/types": "^3.7.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/util-endpoints": { - "version": "3.696.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.696.0.tgz", - "integrity": "sha512-T5s0IlBVX+gkb9g/I6CLt4yAZVzMSiGnbUqWihWsHvQR1WOoIcndQy/Oz/IJXT9T2ipoy7a80gzV6a5mglrioA==", + "version": "3.743.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.743.0.tgz", + "integrity": "sha512-sN1l559zrixeh5x+pttrnd0A3+r34r0tmPkJ/eaaMaAzXqsmKU/xYre9K3FNnsSS1J1k4PEfk/nHDTVUgFYjnw==", "dependencies": { - "@aws-sdk/types": "3.696.0", - "@smithy/types": "^3.7.1", - "@smithy/util-endpoints": "^2.1.6", + "@aws-sdk/types": "3.734.0", + "@smithy/types": "^4.1.0", + "@smithy/util-endpoints": "^3.0.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/util-locate-window": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.693.0.tgz", - "integrity": "sha512-ttrag6haJLWABhLqtg1Uf+4LgHWIMOVSYL+VYZmAp2v4PUGOwWmWQH0Zk8RM7YuQcLfH/EoR72/Yxz6A4FKcuw==", + "version": "3.723.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.723.0.tgz", + "integrity": "sha512-Yf2CS10BqK688DRsrKI/EO6B8ff5J86NXe4C+VCysK7UOgN0l1zOTeTukZ3H8Q9tYYX3oaF1961o8vRkFm7Nmw==", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.696.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.696.0.tgz", - "integrity": "sha512-Z5rVNDdmPOe6ELoM5AhF/ja5tSjbe6ctSctDPb0JdDf4dT0v2MfwhJKzXju2RzX8Es/77Glh7MlaXLE0kCB9+Q==", + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.734.0.tgz", + "integrity": "sha512-xQTCus6Q9LwUuALW+S76OL0jcWtMOVu14q+GoLnWPUM7QeUw963oQcLhF7oq0CtaLLKyl4GOUfcwc773Zmwwng==", "dependencies": { - "@aws-sdk/types": "3.696.0", - "@smithy/types": "^3.7.1", + "@aws-sdk/types": "3.734.0", + "@smithy/types": "^4.1.0", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.696.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.696.0.tgz", - "integrity": "sha512-KhKqcfyXIB0SCCt+qsu4eJjsfiOrNzK5dCV7RAW2YIpp+msxGUUX0NdRE9rkzjiv+3EMktgJm3eEIS+yxtlVdQ==", - "dependencies": { - "@aws-sdk/middleware-user-agent": "3.696.0", - "@aws-sdk/types": "3.696.0", - "@smithy/node-config-provider": "^3.1.11", - "@smithy/types": "^3.7.1", + "version": "3.758.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.758.0.tgz", + "integrity": "sha512-A5EZw85V6WhoKMV2hbuFRvb9NPlxEErb4HPO6/SPXYY4QrjprIzScHxikqcWv1w4J3apB1wto9LPU3IMsYtfrw==", + "dependencies": { + "@aws-sdk/middleware-user-agent": "3.758.0", + "@aws-sdk/types": "3.734.0", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" }, "peerDependencies": { "aws-crt": ">=1.0.0" @@ -1001,9 +952,9 @@ } }, "node_modules/@azure/core-client": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.9.2.tgz", - "integrity": "sha512-kRdry/rav3fUKHl/aDLd/pDLcB+4pOFwPPTVEExuMyaI5r+JBbMWqRbCY1pn5BniDaU3lRxO9eaQ1AmSMehl/w==", + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.9.3.tgz", + "integrity": "sha512-/wGw8fJ4mdpJ1Cum7s1S+VQyXt1ihwKLzfabS1O/RDADnmzVc01dHn44qD0BvGH6KlZNzOMW95tEpKqhkCChPA==", "dependencies": { "@azure/abort-controller": "^2.0.0", "@azure/core-auth": "^1.4.0", @@ -1018,13 +969,13 @@ } }, "node_modules/@azure/core-http-compat": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@azure/core-http-compat/-/core-http-compat-2.1.2.tgz", - "integrity": "sha512-5MnV1yqzZwgNLLjlizsU3QqOeQChkIXw781Fwh1xdAqJR5AA32IUaq6xv1BICJvfbHoa+JYcaij2HFkhLbNTJQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@azure/core-http-compat/-/core-http-compat-2.2.0.tgz", + "integrity": "sha512-1kW8ZhN0CfbNOG6C688z5uh2yrzALE7dDXHiR9dY4vt+EbhGZQSbjDa5bQd2rf3X2pdWMsXbqbArxUyeNdvtmg==", "dependencies": { "@azure/abort-controller": "^2.0.0", "@azure/core-client": "^1.3.0", - "@azure/core-rest-pipeline": "^1.3.0" + "@azure/core-rest-pipeline": "^1.19.0" }, "engines": { "node": ">=18.0.0" @@ -1056,9 +1007,9 @@ } }, "node_modules/@azure/core-rest-pipeline": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.18.1.tgz", - "integrity": "sha512-/wS73UEDrxroUEVywEm7J0p2c+IIiVxyfigCGfsKvCxxCET4V/Hef2aURqltrXMRjNmdmt5IuOgIpl8f6xdO5A==", + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.19.1.tgz", + "integrity": "sha512-zHeoI3NCs53lLBbWNzQycjnYKsA1CVKlnzSNuSFcUDwBp8HHVObePxrM7HaX+Ha5Ks639H7chNC9HOaIhNS03w==", "dependencies": { "@azure/abort-controller": "^2.0.0", "@azure/core-auth": "^1.8.0", @@ -1108,9 +1059,9 @@ } }, "node_modules/@azure/identity": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-4.5.0.tgz", - "integrity": "sha512-EknvVmtBuSIic47xkOqyNabAme0RYTw52BTMz8eBgU1ysTyMrD1uOoM+JdS0J/4Yfp98IBT3osqq3BfwSaNaGQ==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-4.8.0.tgz", + "integrity": "sha512-l9ALUGHtFB/JfsqmA+9iYAp2a+cCwdNO/cyIr2y7nJLJsz1aae6qVP8XxT7Kbudg0IQRSIMXj0+iivFdbD1xPA==", "dependencies": { "@azure/abort-controller": "^2.0.0", "@azure/core-auth": "^1.9.0", @@ -1119,11 +1070,11 @@ "@azure/core-tracing": "^1.0.0", "@azure/core-util": "^1.11.0", "@azure/logger": "^1.0.0", - "@azure/msal-browser": "^3.26.1", - "@azure/msal-node": "^2.15.0", + "@azure/msal-browser": "^4.2.0", + "@azure/msal-node": "^3.2.3", "events": "^3.0.0", "jws": "^4.0.0", - "open": "^8.0.0", + "open": "^10.1.0", "stoppable": "^1.1.0", "tslib": "^2.2.0" }, @@ -1183,30 +1134,30 @@ } }, "node_modules/@azure/msal-browser": { - "version": "3.27.0", - "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-3.27.0.tgz", - "integrity": "sha512-+b4ZKSD8+vslCtVRVetkegEhOFMLP3rxDWJY212ct+2r6jVg6OSQKc1Qz3kCoXo0FgwaXkb+76TMZfpHp8QtgA==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-4.7.0.tgz", + "integrity": "sha512-H4AIPhIQVe1qW4+BJaitqod6UGQiXE3juj7q2ZBsOPjuZicQaqcbnBp2gCroF/icS0+TJ9rGuyCBJbjlAqVOGA==", "dependencies": { - "@azure/msal-common": "14.16.0" + "@azure/msal-common": "15.2.1" }, "engines": { "node": ">=0.8.0" } }, "node_modules/@azure/msal-common": { - "version": "14.16.0", - "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-14.16.0.tgz", - "integrity": "sha512-1KOZj9IpcDSwpNiQNjt0jDYZpQvNZay7QAEi/5DLubay40iGYtLzya/jbjRPLyOTZhEKyL1MzPuw2HqBCjceYA==", + "version": "15.2.1", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-15.2.1.tgz", + "integrity": "sha512-eZHtYE5OHDN0o2NahCENkczQ6ffGc0MoUSAI3hpwGpZBHJXaEQMMZPWtIx86da2L9w7uT+Tr/xgJbGwIkvTZTQ==", "engines": { "node": ">=0.8.0" } }, "node_modules/@azure/msal-node": { - "version": "2.16.2", - "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-2.16.2.tgz", - "integrity": "sha512-An7l1hEr0w1HMMh1LU+rtDtqL7/jw74ORlc9Wnh06v7TU/xpG39/Zdr1ZJu3QpjUfKJ+E0/OXMW8DRSWTlh7qQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-3.3.0.tgz", + "integrity": "sha512-ulsT3EHF1RQ29X55cxBLgKsIKWni9JdbUqG7sipGVP4uhWcBpmm/vhKOMH340+27Acm9+kHGnN/5XmQ5LrIDgA==", "dependencies": { - "@azure/msal-common": "14.16.0", + "@azure/msal-common": "15.2.1", "jsonwebtoken": "^9.0.0", "uuid": "^8.3.0" }, @@ -1226,6 +1177,7 @@ "version": "1.0.0-beta.13", "resolved": "https://registry.npmjs.org/@azure/openai/-/openai-1.0.0-beta.13.tgz", "integrity": "sha512-oHE5ScnPTXALmyEBgqokZlYVT7F76EfrKjMWF+YcFJdUxk9Adhvht2iL5v+QpmlAIMdkih1q8DkTs/tApDjBpw==", + "deprecated": "The Azure OpenAI client library for JavaScript beta has been retired. Please migrate to the stable OpenAI SDK for JavaScript using the migration guide: https://github.com/Azure/azure-sdk-for-js/blob/main/sdk/openai/openai/MIGRATION.md.", "dependencies": { "@azure-rest/core-client": "^1.1.7", "@azure/core-auth": "^1.4.0", @@ -1253,30 +1205,30 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.3.tgz", - "integrity": "sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==", + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", + "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz", - "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz", + "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.26.0", - "@babel/generator": "^7.26.0", - "@babel/helper-compilation-targets": "^7.25.9", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.10", + "@babel/helper-compilation-targets": "^7.26.5", "@babel/helper-module-transforms": "^7.26.0", - "@babel/helpers": "^7.26.0", - "@babel/parser": "^7.26.0", - "@babel/template": "^7.25.9", - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.26.0", + "@babel/helpers": "^7.26.10", + "@babel/parser": "^7.26.10", + "@babel/template": "^7.26.9", + "@babel/traverse": "^7.26.10", + "@babel/types": "^7.26.10", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -1292,13 +1244,13 @@ } }, "node_modules/@babel/generator": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.3.tgz", - "integrity": "sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.10.tgz", + "integrity": "sha512-rRHT8siFIXQrAYOYqZQVsAr8vJ+cBNqcVAY6m5V8/4QqzaPl+zDBe6cLEPRDuNOUf3ww8RfJVlOyQMoSI+5Ang==", "dev": true, "dependencies": { - "@babel/parser": "^7.26.3", - "@babel/types": "^7.26.3", + "@babel/parser": "^7.26.10", + "@babel/types": "^7.26.10", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" @@ -1320,12 +1272,12 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", - "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz", + "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.25.9", + "@babel/compat-data": "^7.26.5", "@babel/helper-validator-option": "^7.25.9", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", @@ -1351,17 +1303,17 @@ "dev": true }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz", - "integrity": "sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.26.9.tgz", + "integrity": "sha512-ubbUqCofvxPRurw5L8WTsCLSkQiVpov4Qx0WMA+jUN+nXBK8ADPlJO1grkFw5CWKC5+sZSOfuGMdX1aI1iT9Sg==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.25.9", "@babel/helper-member-expression-to-functions": "^7.25.9", "@babel/helper-optimise-call-expression": "^7.25.9", - "@babel/helper-replace-supers": "^7.25.9", + "@babel/helper-replace-supers": "^7.26.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", - "@babel/traverse": "^7.25.9", + "@babel/traverse": "^7.26.9", "semver": "^6.3.1" }, "engines": { @@ -1460,9 +1412,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz", - "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", + "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", "dev": true, "engines": { "node": ">=6.9.0" @@ -1486,14 +1438,14 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz", - "integrity": "sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.26.5.tgz", + "integrity": "sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==", "dev": true, "dependencies": { "@babel/helper-member-expression-to-functions": "^7.25.9", "@babel/helper-optimise-call-expression": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/traverse": "^7.26.5" }, "engines": { "node": ">=6.9.0" @@ -1556,25 +1508,25 @@ } }, "node_modules/@babel/helpers": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", - "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.10.tgz", + "integrity": "sha512-UPYc3SauzZ3JGgj87GgZ89JVdC5dj0AoetR5Bw6wj4niittNyFh6+eOGonYvJ1ao6B8lEa3Q3klS7ADZ53bc5g==", "dev": true, "dependencies": { - "@babel/template": "^7.25.9", - "@babel/types": "^7.26.0" + "@babel/template": "^7.26.9", + "@babel/types": "^7.26.10" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz", - "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.10.tgz", + "integrity": "sha512-6aQR2zGE/QFi8JpDLjUZEPYOs7+mhKXm86VaKFiLP35JQwQb6bwUE+XbvkH0EptsYhbNBSUGaUBLKqxH1xSgsA==", "dev": true, "dependencies": { - "@babel/types": "^7.26.3" + "@babel/types": "^7.26.10" }, "bin": { "parser": "bin/babel-parser.js" @@ -1943,14 +1895,14 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.9.tgz", - "integrity": "sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==", + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.26.8.tgz", + "integrity": "sha512-He9Ej2X7tNf2zdKMAGOsmg2MrFc+hfoAhd3po4cWfo/NWjzEAKa0oQruj1ROVUdl0e6fb6/kE/G3SSxE0lRJOg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-plugin-utils": "^7.26.5", "@babel/helper-remap-async-to-generator": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/traverse": "^7.26.8" }, "engines": { "node": ">=6.9.0" @@ -1977,12 +1929,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.9.tgz", - "integrity": "sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.26.5.tgz", + "integrity": "sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.26.5" }, "engines": { "node": ">=6.9.0" @@ -2182,12 +2134,12 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.9.tgz", - "integrity": "sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.26.9.tgz", + "integrity": "sha512-Hry8AusVm8LW5BVFgiyUReuoGzPUpdHQQqJY5bZnbbf+ngOHWuCuYFKw/BqaaWlvEUrF91HMhDtEaI1hZzNbLg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-plugin-utils": "^7.26.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" }, "engines": { @@ -2372,12 +2324,12 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.9.tgz", - "integrity": "sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog==", + "version": "7.26.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.26.6.tgz", + "integrity": "sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.26.5" }, "engines": { "node": ">=6.9.0" @@ -2622,12 +2574,12 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.9.tgz", - "integrity": "sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==", + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.26.8.tgz", + "integrity": "sha512-OmGDL5/J0CJPJZTHZbi2XpO0tyT2Ia7fzpW5GURwdtp2X3fMmN8au/ej6peC/T33/+CRiIpA8Krse8hFGVmT5Q==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.26.5" }, "engines": { "node": ">=6.9.0" @@ -2637,12 +2589,12 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.9.tgz", - "integrity": "sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA==", + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.26.7.tgz", + "integrity": "sha512-jfoTXXZTgGg36BmhqT3cAYK5qkmqvJpvNrPhaK/52Vgjhw4Rq29s9UqpWWV0D6yuRmgiFH/BUVlkl96zJWqnaw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.26.5" }, "engines": { "node": ">=6.9.0" @@ -2715,14 +2667,14 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.0.tgz", - "integrity": "sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.9.tgz", + "integrity": "sha512-vX3qPGE8sEKEAZCWk05k3cpTAE3/nOYca++JA+Rd0z2NCNzabmYvEiSShKzm10zdquOIAVXsy2Ei/DTW34KlKQ==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.26.0", - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", + "@babel/compat-data": "^7.26.8", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-plugin-utils": "^7.26.5", "@babel/helper-validator-option": "^7.25.9", "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9", "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9", @@ -2734,9 +2686,9 @@ "@babel/plugin-syntax-import-attributes": "^7.26.0", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.25.9", - "@babel/plugin-transform-async-generator-functions": "^7.25.9", + "@babel/plugin-transform-async-generator-functions": "^7.26.8", "@babel/plugin-transform-async-to-generator": "^7.25.9", - "@babel/plugin-transform-block-scoped-functions": "^7.25.9", + "@babel/plugin-transform-block-scoped-functions": "^7.26.5", "@babel/plugin-transform-block-scoping": "^7.25.9", "@babel/plugin-transform-class-properties": "^7.25.9", "@babel/plugin-transform-class-static-block": "^7.26.0", @@ -2747,21 +2699,21 @@ "@babel/plugin-transform-duplicate-keys": "^7.25.9", "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9", "@babel/plugin-transform-dynamic-import": "^7.25.9", - "@babel/plugin-transform-exponentiation-operator": "^7.25.9", + "@babel/plugin-transform-exponentiation-operator": "^7.26.3", "@babel/plugin-transform-export-namespace-from": "^7.25.9", - "@babel/plugin-transform-for-of": "^7.25.9", + "@babel/plugin-transform-for-of": "^7.26.9", "@babel/plugin-transform-function-name": "^7.25.9", "@babel/plugin-transform-json-strings": "^7.25.9", "@babel/plugin-transform-literals": "^7.25.9", "@babel/plugin-transform-logical-assignment-operators": "^7.25.9", "@babel/plugin-transform-member-expression-literals": "^7.25.9", "@babel/plugin-transform-modules-amd": "^7.25.9", - "@babel/plugin-transform-modules-commonjs": "^7.25.9", + "@babel/plugin-transform-modules-commonjs": "^7.26.3", "@babel/plugin-transform-modules-systemjs": "^7.25.9", "@babel/plugin-transform-modules-umd": "^7.25.9", "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9", "@babel/plugin-transform-new-target": "^7.25.9", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.25.9", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.26.6", "@babel/plugin-transform-numeric-separator": "^7.25.9", "@babel/plugin-transform-object-rest-spread": "^7.25.9", "@babel/plugin-transform-object-super": "^7.25.9", @@ -2777,17 +2729,17 @@ "@babel/plugin-transform-shorthand-properties": "^7.25.9", "@babel/plugin-transform-spread": "^7.25.9", "@babel/plugin-transform-sticky-regex": "^7.25.9", - "@babel/plugin-transform-template-literals": "^7.25.9", - "@babel/plugin-transform-typeof-symbol": "^7.25.9", + "@babel/plugin-transform-template-literals": "^7.26.8", + "@babel/plugin-transform-typeof-symbol": "^7.26.7", "@babel/plugin-transform-unicode-escapes": "^7.25.9", "@babel/plugin-transform-unicode-property-regex": "^7.25.9", "@babel/plugin-transform-unicode-regex": "^7.25.9", "@babel/plugin-transform-unicode-sets-regex": "^7.25.9", "@babel/preset-modules": "0.1.6-no-external-plugins", "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.6", + "babel-plugin-polyfill-corejs3": "^0.11.0", "babel-plugin-polyfill-regenerator": "^0.6.1", - "core-js-compat": "^3.38.1", + "core-js-compat": "^3.40.0", "semver": "^6.3.1" }, "engines": { @@ -2812,9 +2764,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", - "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.10.tgz", + "integrity": "sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw==", "dev": true, "dependencies": { "regenerator-runtime": "^0.14.0" @@ -2824,30 +2776,30 @@ } }, "node_modules/@babel/template": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", - "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz", + "integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.25.9", - "@babel/parser": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/code-frame": "^7.26.2", + "@babel/parser": "^7.26.9", + "@babel/types": "^7.26.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.26.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.4.tgz", - "integrity": "sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.10.tgz", + "integrity": "sha512-k8NuDrxr0WrPH5Aupqb2LCVURP/S0vBEn5mK6iH+GIYob66U5EtoZvcdudR2jQ4cmTwhEwW1DLB+Yyas9zjF6A==", "dev": true, "dependencies": { "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.3", - "@babel/parser": "^7.26.3", - "@babel/template": "^7.25.9", - "@babel/types": "^7.26.3", + "@babel/generator": "^7.26.10", + "@babel/parser": "^7.26.10", + "@babel/template": "^7.26.9", + "@babel/types": "^7.26.10", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -2856,9 +2808,9 @@ } }, "node_modules/@babel/types": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz", - "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.10.tgz", + "integrity": "sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.25.9", @@ -3065,16 +3017,123 @@ "integrity": "sha512-MyYmP4tbTzOnlT6hItC9tFkVZpYkaAg45AUXqdXzEfZhz8ZWpaiN8jZ789KLVmq+NKqhMUbKAHIZUUY1d39eRw==" }, "node_modules/@continuedev/openai-adapters": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/@continuedev/openai-adapters/-/openai-adapters-1.0.10.tgz", - "integrity": "sha512-hTiCxlXsek/jpVbtHDQCe4JnCmJ+jbye9ionXCDmg9oAKKEymW1UVVrX08xcdCkfKnxAP2ESgqFSMok314q+fg==", + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/@continuedev/openai-adapters/-/openai-adapters-1.0.16.tgz", + "integrity": "sha512-PLu2xwBDIjDeqpKlVaCGAlwSGrhLn2OOR/n/By9j71wqVZ7sCZ5xFlx3dS+E5PX1EyZjWmCppmwo5Q7LlzDCrA==", "dependencies": { "@azure/openai": "^1.0.0-beta.12", "@continuedev/config-types": "^1.0.5", + "@continuedev/config-yaml": "^1.0.51", "@continuedev/fetch": "^1.0.3", + "json-schema": "^0.4.0", "node-fetch": "^3.3.2", "openai": "^4.76.0", - "zod": "^3.23.8" + "zod": "^3.24.2" + } + }, + "node_modules/@csstools/color-helpers": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.0.2.tgz", + "integrity": "sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/css-calc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.2.tgz", + "integrity": "sha512-TklMyb3uBB28b5uQdxjReG4L80NxAqgrECqLZFQbyLekwwlcDDS8r3f07DKqeo8C4926Br0gf/ZDe17Zv4wIuw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "node_modules/@csstools/css-color-parser": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.8.tgz", + "integrity": "sha512-pdwotQjCCnRPuNi06jFuP68cykU1f3ZWExLe/8MQ1LOs8Xq+fTkYgd+2V8mWUWMrOn9iS2HftPVaMZDaXzGbhQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/color-helpers": "^5.0.2", + "@csstools/css-calc": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.4.tgz", + "integrity": "sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.3.tgz", + "integrity": "sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": ">=18" } }, "node_modules/@esbuild/android-arm": { @@ -3430,9 +3489,9 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", - "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.5.0.tgz", + "integrity": "sha512-RoV8Xs9eNwiDvhv7M+xcL4PWyRyIXRY/FLp3buU4h1EYfdF7unWUy3dOjPqb3C7rMUewIcqwW850PgS8h1o1yg==", "dependencies": { "eslint-visitor-keys": "^3.4.3" }, @@ -4105,9 +4164,9 @@ } }, "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==", + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", "dev": true, "dependencies": { "@jridgewell/set-array": "^1.2.1", @@ -4153,9 +4212,9 @@ } }, "node_modules/@js-joda/core": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/@js-joda/core/-/core-5.6.3.tgz", - "integrity": "sha512-T1rRxzdqkEXcou0ZprN1q9yDRlvzCPLqmlNt5IIsGBzoEVgLCCYrKEwc84+TvsXuAc95VAZwtWD2zVsKPY4bcA==" + "version": "5.6.4", + "resolved": "https://registry.npmjs.org/@js-joda/core/-/core-5.6.4.tgz", + "integrity": "sha512-ChdLDTYMEoYoiKZMT90wZMEdGvZ2/QZMnhvjvEqeO5oLoxUfSiLzfe6Lhf3g88+MhZ+utbAu7PAxX1sZkLo5pA==" }, "node_modules/@lancedb/vectordb-darwin-arm64": { "version": "0.4.20", @@ -4218,12 +4277,16 @@ ] }, "node_modules/@modelcontextprotocol/sdk": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.5.0.tgz", - "integrity": "sha512-IJ+5iVVs8FCumIHxWqpwgkwOzyhtHVKy45s6Ug7Dv0MfRpaYisH8QQ87rIWeWdOzlk8sfhitZ7HCyQZk7d6b8w==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.7.0.tgz", + "integrity": "sha512-IYPe/FLpvF3IZrd/f5p5ffmWhMc3aEMuM2wGJASDqC2Ge7qatVCdbfPx3n/5xFeb19xN0j/911M2AaFuircsWA==", "dependencies": { "content-type": "^1.0.5", + "cors": "^2.8.5", "eventsource": "^3.0.2", + "express": "^5.0.1", + "express-rate-limit": "^7.5.0", + "pkce-challenge": "^4.1.0", "raw-body": "^3.0.0", "zod": "^3.23.8", "zod-to-json-schema": "^3.24.1" @@ -4232,14 +4295,6 @@ "node": ">=18" } }, - "node_modules/@modelcontextprotocol/sdk/node_modules/zod-to-json-schema": { - "version": "3.24.1", - "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.1.tgz", - "integrity": "sha512-3h08nf3Vw3Wl3PK+q3ow/lIil81IT2Oa7YpQyUUDsEWbXveMesdfK1xBd2RhCkynwZndAxixji/7SYJJowr62w==", - "peerDependencies": { - "zod": "^3.24.1" - } - }, "node_modules/@mozilla/readability": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/@mozilla/readability/-/readability-0.5.0.tgz", @@ -4296,9 +4351,9 @@ } }, "node_modules/@npmcli/fs/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", "optional": true, "bin": { "semver": "bin/semver.js" @@ -4347,9 +4402,9 @@ } }, "node_modules/@octokit/endpoint": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.5.tgz", - "integrity": "sha512-ekqR4/+PCLkEBF6qgj8WqJfvDq65RH85OAgrtnVp1mSxaXF03u2xW/hUdweGS5654IlC0wkNYC18Z50tSYTAFw==", + "version": "9.0.6", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.6.tgz", + "integrity": "sha512-H1fNTMA57HbkFESSt3Y9+FBICv+0jFceJFPWDePYlR/iMGrwM5ph+Dd4XRQs+8X+PUFURLQgX9ChPfhJ/1uNQw==", "dependencies": { "@octokit/types": "^13.1.0", "universal-user-agent": "^6.0.0" @@ -4359,11 +4414,11 @@ } }, "node_modules/@octokit/graphql": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-7.1.0.tgz", - "integrity": "sha512-r+oZUH7aMFui1ypZnAvZmn0KSqAUgE1/tUXIWaqUCa1758ts/Jio84GZuzsvUkme98kv0WFY8//n0J1Z+vsIsQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-7.1.1.tgz", + "integrity": "sha512-3mkDltSfcDUoa176nlGoA32RGjeWjl3K7F/BwHwRMJUW/IteSa4bnSV8p2ThNkcIcZU2umkZWxwETSSCJf2Q7g==", "dependencies": { - "@octokit/request": "^8.3.0", + "@octokit/request": "^8.4.1", "@octokit/types": "^13.0.0", "universal-user-agent": "^6.0.0" }, @@ -4372,16 +4427,16 @@ } }, "node_modules/@octokit/openapi-types": { - "version": "22.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-22.2.0.tgz", - "integrity": "sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg==" + "version": "23.0.1", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-23.0.1.tgz", + "integrity": "sha512-izFjMJ1sir0jn0ldEKhZ7xegCTj/ObmEDlEfpFrx4k/JyZSMRHbO3/rBwgE7f3m2DHt+RrNGIVw4wSmwnm3t/g==" }, "node_modules/@octokit/plugin-paginate-rest": { - "version": "11.3.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.3.1.tgz", - "integrity": "sha512-ryqobs26cLtM1kQxqeZui4v8FeznirUsksiA+RYemMPJ7Micju0WSkv50dBksTuZks9O5cg4wp+t8fZ/cLY56g==", + "version": "11.4.4-cjs.2", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.4.4-cjs.2.tgz", + "integrity": "sha512-2dK6z8fhs8lla5PaOTgqfCGBxgAv/le+EhPs27KklPhm1bKObpu6lXzwfUEQ16ajXzqNrKMujsFyo9K2eaoISw==", "dependencies": { - "@octokit/types": "^13.5.0" + "@octokit/types": "^13.7.0" }, "engines": { "node": ">= 18" @@ -4402,11 +4457,11 @@ } }, "node_modules/@octokit/plugin-rest-endpoint-methods": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-13.2.2.tgz", - "integrity": "sha512-EI7kXWidkt3Xlok5uN43suK99VWqc8OaIMktY9d9+RNKl69juoTyxmLoWPIZgJYzi41qj/9zU7G/ljnNOJ5AFA==", + "version": "13.3.2-cjs.1", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-13.3.2-cjs.1.tgz", + "integrity": "sha512-VUjIjOOvF2oELQmiFpWA1aOPdawpyaCUqcEBc/UOUnj3Xp6DJGrJ1+bjUIIDzdHjnFNO6q57ODMfdEZnoBkCwQ==", "dependencies": { - "@octokit/types": "^13.5.0" + "@octokit/types": "^13.8.0" }, "engines": { "node": ">= 18" @@ -4416,12 +4471,12 @@ } }, "node_modules/@octokit/request": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.4.0.tgz", - "integrity": "sha512-9Bb014e+m2TgBeEJGEbdplMVWwPmL1FPtggHQRkV+WVsMggPtEkLKPlcVYm/o8xKLkpJ7B+6N8WfQMtDLX2Dpw==", + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.4.1.tgz", + "integrity": "sha512-qnB2+SY3hkCmBxZsR/MPCybNmbJe4KAlfWErXq+rBKkQJlbjdJeS85VI9r8UqeLYLvnAenU8Q1okM/0MBsAGXw==", "dependencies": { - "@octokit/endpoint": "^9.0.1", - "@octokit/request-error": "^5.1.0", + "@octokit/endpoint": "^9.0.6", + "@octokit/request-error": "^5.1.1", "@octokit/types": "^13.1.0", "universal-user-agent": "^6.0.0" }, @@ -4430,9 +4485,9 @@ } }, "node_modules/@octokit/request-error": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.1.0.tgz", - "integrity": "sha512-GETXfE05J0+7H2STzekpKObFe765O5dlAKUTLNGeH+x47z7JjXHfsHKo5z21D/o/IOZTUEI6nyWyR+bZVP/n5Q==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.1.1.tgz", + "integrity": "sha512-v9iyEQJH6ZntoENr9/yXxjuezh4My67CBSu9r6Ve/05Iu5gNgnisNWOsoJHTP6k0Rr0+HQIpnH+kyammu90q/g==", "dependencies": { "@octokit/types": "^13.1.0", "deprecation": "^2.0.0", @@ -4443,25 +4498,25 @@ } }, "node_modules/@octokit/rest": { - "version": "20.1.1", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-20.1.1.tgz", - "integrity": "sha512-MB4AYDsM5jhIHro/dq4ix1iWTLGToIGk6cWF5L6vanFaMble5jTX/UBQyiv05HsWnwUtY8JrfHy2LWfKwihqMw==", + "version": "20.1.2", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-20.1.2.tgz", + "integrity": "sha512-GmYiltypkHHtihFwPRxlaorG5R9VAHuk/vbszVoRTGXnAsY60wYLkh/E2XiFmdZmqrisw+9FaazS1i5SbdWYgA==", "dependencies": { "@octokit/core": "^5.0.2", - "@octokit/plugin-paginate-rest": "11.3.1", + "@octokit/plugin-paginate-rest": "11.4.4-cjs.2", "@octokit/plugin-request-log": "^4.0.0", - "@octokit/plugin-rest-endpoint-methods": "13.2.2" + "@octokit/plugin-rest-endpoint-methods": "13.3.2-cjs.1" }, "engines": { "node": ">= 18" } }, "node_modules/@octokit/types": { - "version": "13.6.2", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.6.2.tgz", - "integrity": "sha512-WpbZfZUcZU77DrSW4wbsSgTPfKcp286q3ItaIgvSbBpZJlu6mnYXAkjZz6LVZPXkEvLIM8McanyZejKTYUHipA==", + "version": "13.8.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.8.0.tgz", + "integrity": "sha512-x7DjTIbEpEWXK99DMd01QfWy0hd5h4EN+Q7shkdKds3otGQP+oWE/y0A76i1OvH9fygo4ddvNf7ZvF0t78P98A==", "dependencies": { - "@octokit/openapi-types": "^22.2.0" + "@octokit/openapi-types": "^23.0.1" } }, "node_modules/@pkgjs/parseargs": { @@ -4549,9 +4604,9 @@ } }, "node_modules/@puppeteer/browsers/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", "bin": { "semver": "bin/semver.js" }, @@ -4590,579 +4645,594 @@ } }, "node_modules/@smithy/abort-controller": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.9.tgz", - "integrity": "sha512-yiW0WI30zj8ZKoSYNx90no7ugVn3khlyH/z5W8qtKBtVE6awRALbhSG+2SAHA1r6bO/6M9utxYKVZ3PCJ1rWxw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.1.tgz", + "integrity": "sha512-fiUIYgIgRjMWznk6iLJz35K2YxSLHzLBA/RC6lBrKfQ8fHbPfvk7Pk9UvpKoHgJjI18MnbPuEju53zcVy6KF1g==", "dependencies": { - "@smithy/types": "^3.7.2", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/config-resolver": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-3.0.13.tgz", - "integrity": "sha512-Gr/qwzyPaTL1tZcq8WQyHhTZREER5R1Wytmz4WnVGL4onA3dNk6Btll55c8Vr58pLdvWZmtG8oZxJTw3t3q7Jg==", - "dependencies": { - "@smithy/node-config-provider": "^3.1.12", - "@smithy/types": "^3.7.2", - "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.11", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.0.1.tgz", + "integrity": "sha512-Igfg8lKu3dRVkTSEm98QpZUvKEOa71jDX4vKRcvJVyRc3UgN3j7vFMf0s7xLQhYmKa8kyJGQgUJDOV5V3neVlQ==", + "dependencies": { + "@smithy/node-config-provider": "^4.0.1", + "@smithy/types": "^4.1.0", + "@smithy/util-config-provider": "^4.0.0", + "@smithy/util-middleware": "^4.0.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/core": { - "version": "2.5.5", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-2.5.5.tgz", - "integrity": "sha512-G8G/sDDhXA7o0bOvkc7bgai6POuSld/+XhNnWAbpQTpLv2OZPvyqQ58tLPPlz0bSNsXktldDDREIv1LczFeNEw==", - "dependencies": { - "@smithy/middleware-serde": "^3.0.11", - "@smithy/protocol-http": "^4.1.8", - "@smithy/types": "^3.7.2", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-middleware": "^3.0.11", - "@smithy/util-stream": "^3.3.2", - "@smithy/util-utf8": "^3.0.0", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.1.5.tgz", + "integrity": "sha512-HLclGWPkCsekQgsyzxLhCQLa8THWXtB5PxyYN+2O6nkyLt550KQKTlbV2D1/j5dNIQapAZM1+qFnpBFxZQkgCA==", + "dependencies": { + "@smithy/middleware-serde": "^4.0.2", + "@smithy/protocol-http": "^5.0.1", + "@smithy/types": "^4.1.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-middleware": "^4.0.1", + "@smithy/util-stream": "^4.1.2", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/credential-provider-imds": { - "version": "3.2.8", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-3.2.8.tgz", - "integrity": "sha512-ZCY2yD0BY+K9iMXkkbnjo+08T2h8/34oHd0Jmh6BZUSZwaaGlGCyBT/3wnS7u7Xl33/EEfN4B6nQr3Gx5bYxgw==", - "dependencies": { - "@smithy/node-config-provider": "^3.1.12", - "@smithy/property-provider": "^3.1.11", - "@smithy/types": "^3.7.2", - "@smithy/url-parser": "^3.0.11", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.0.1.tgz", + "integrity": "sha512-l/qdInaDq1Zpznpmev/+52QomsJNZ3JkTl5yrTl02V6NBgJOQ4LY0SFw/8zsMwj3tLe8vqiIuwF6nxaEwgf6mg==", + "dependencies": { + "@smithy/node-config-provider": "^4.0.1", + "@smithy/property-provider": "^4.0.1", + "@smithy/types": "^4.1.0", + "@smithy/url-parser": "^4.0.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/eventstream-codec": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-3.1.10.tgz", - "integrity": "sha512-323B8YckSbUH0nMIpXn7HZsAVKHYHFUODa8gG9cHo0ySvA1fr5iWaNT+iIL0UCqUzG6QPHA3BSsBtRQou4mMqQ==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-4.0.1.tgz", + "integrity": "sha512-Q2bCAAR6zXNVtJgifsU16ZjKGqdw/DyecKNgIgi7dlqw04fqDu0mnq+JmGphqheypVc64CYq3azSuCpAdFk2+A==", "dependencies": { "@aws-crypto/crc32": "5.2.0", - "@smithy/types": "^3.7.2", - "@smithy/util-hex-encoding": "^3.0.0", + "@smithy/types": "^4.1.0", + "@smithy/util-hex-encoding": "^4.0.0", "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, "node_modules/@smithy/eventstream-serde-browser": { - "version": "3.0.14", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-3.0.14.tgz", - "integrity": "sha512-kbrt0vjOIihW3V7Cqj1SXQvAI5BR8SnyQYsandva0AOR307cXAc+IhPngxIPslxTLfxwDpNu0HzCAq6g42kCPg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.0.1.tgz", + "integrity": "sha512-HbIybmz5rhNg+zxKiyVAnvdM3vkzjE6ccrJ620iPL8IXcJEntd3hnBl+ktMwIy12Te/kyrSbUb8UCdnUT4QEdA==", "dependencies": { - "@smithy/eventstream-serde-universal": "^3.0.13", - "@smithy/types": "^3.7.2", + "@smithy/eventstream-serde-universal": "^4.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/eventstream-serde-config-resolver": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-3.0.11.tgz", - "integrity": "sha512-P2pnEp4n75O+QHjyO7cbw/vsw5l93K/8EWyjNCAAybYwUmj3M+hjSQZ9P5TVdUgEG08ueMAP5R4FkuSkElZ5tQ==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.0.1.tgz", + "integrity": "sha512-lSipaiq3rmHguHa3QFF4YcCM3VJOrY9oq2sow3qlhFY+nBSTF/nrO82MUQRPrxHQXA58J5G1UnU2WuJfi465BA==", "dependencies": { - "@smithy/types": "^3.7.2", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/eventstream-serde-node": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-3.0.13.tgz", - "integrity": "sha512-zqy/9iwbj8Wysmvi7Lq7XFLeDgjRpTbCfwBhJa8WbrylTAHiAu6oQTwdY7iu2lxigbc9YYr9vPv5SzYny5tCXQ==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.0.1.tgz", + "integrity": "sha512-o4CoOI6oYGYJ4zXo34U8X9szDe3oGjmHgsMGiZM0j4vtNoT+h80TLnkUcrLZR3+E6HIxqW+G+9WHAVfl0GXK0Q==", "dependencies": { - "@smithy/eventstream-serde-universal": "^3.0.13", - "@smithy/types": "^3.7.2", + "@smithy/eventstream-serde-universal": "^4.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/eventstream-serde-universal": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-3.0.13.tgz", - "integrity": "sha512-L1Ib66+gg9uTnqp/18Gz4MDpJPKRE44geOjOQ2SVc0eiaO5l255ADziATZgjQjqumC7yPtp1XnjHlF1srcwjKw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.0.1.tgz", + "integrity": "sha512-Z94uZp0tGJuxds3iEAZBqGU2QiaBHP4YytLUjwZWx+oUeohCsLyUm33yp4MMBmhkuPqSbQCXq5hDet6JGUgHWA==", "dependencies": { - "@smithy/eventstream-codec": "^3.1.10", - "@smithy/types": "^3.7.2", + "@smithy/eventstream-codec": "^4.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/fetch-http-handler": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-4.1.2.tgz", - "integrity": "sha512-R7rU7Ae3ItU4rC0c5mB2sP5mJNbCfoDc8I5XlYjIZnquyUwec7fEo78F6DA3SmgJgkU1qTMcZJuGblxZsl10ZA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.0.1.tgz", + "integrity": "sha512-3aS+fP28urrMW2KTjb6z9iFow6jO8n3MFfineGbndvzGZit3taZhKWtTorf+Gp5RpFDDafeHlhfsGlDCXvUnJA==", "dependencies": { - "@smithy/protocol-http": "^4.1.8", - "@smithy/querystring-builder": "^3.0.11", - "@smithy/types": "^3.7.2", - "@smithy/util-base64": "^3.0.0", + "@smithy/protocol-http": "^5.0.1", + "@smithy/querystring-builder": "^4.0.1", + "@smithy/types": "^4.1.0", + "@smithy/util-base64": "^4.0.0", "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, "node_modules/@smithy/hash-node": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-3.0.11.tgz", - "integrity": "sha512-emP23rwYyZhQBvklqTtwetkQlqbNYirDiEEwXl2v0GYWMnCzxst7ZaRAnWuy28njp5kAH54lvkdG37MblZzaHA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.0.1.tgz", + "integrity": "sha512-TJ6oZS+3r2Xu4emVse1YPB3Dq3d8RkZDKcPr71Nj/lJsdAP1c7oFzYqEn1IBc915TsgLl2xIJNuxCz+gLbLE0w==", "dependencies": { - "@smithy/types": "^3.7.2", - "@smithy/util-buffer-from": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", + "@smithy/types": "^4.1.0", + "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/invalid-dependency": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-3.0.11.tgz", - "integrity": "sha512-NuQmVPEJjUX6c+UELyVz8kUx8Q539EDeNwbRyu4IIF8MeV7hUtq1FB3SHVyki2u++5XLMFqngeMKk7ccspnNyQ==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.0.1.tgz", + "integrity": "sha512-gdudFPf4QRQ5pzj7HEnu6FhKRi61BfH/Gk5Yf6O0KiSbr1LlVhgjThcvjdu658VE6Nve8vaIWB8/fodmS1rBPQ==", "dependencies": { - "@smithy/types": "^3.7.2", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, "node_modules/@smithy/is-array-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", - "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.0.0.tgz", + "integrity": "sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw==", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/middleware-content-length": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-3.0.13.tgz", - "integrity": "sha512-zfMhzojhFpIX3P5ug7jxTjfUcIPcGjcQYzB9t+rv0g1TX7B0QdwONW+ATouaLoD7h7LOw/ZlXfkq4xJ/g2TrIw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.0.1.tgz", + "integrity": "sha512-OGXo7w5EkB5pPiac7KNzVtfCW2vKBTZNuCctn++TTSOMpe6RZO/n6WEC1AxJINn3+vWLKW49uad3lo/u0WJ9oQ==", "dependencies": { - "@smithy/protocol-http": "^4.1.8", - "@smithy/types": "^3.7.2", + "@smithy/protocol-http": "^5.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/middleware-endpoint": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-3.2.5.tgz", - "integrity": "sha512-VhJNs/s/lyx4weiZdXSloBgoLoS8osV0dKIain8nGmx7of3QFKu5BSdEuk1z/U8x9iwes1i+XCiNusEvuK1ijg==", - "dependencies": { - "@smithy/core": "^2.5.5", - "@smithy/middleware-serde": "^3.0.11", - "@smithy/node-config-provider": "^3.1.12", - "@smithy/shared-ini-file-loader": "^3.1.12", - "@smithy/types": "^3.7.2", - "@smithy/url-parser": "^3.0.11", - "@smithy/util-middleware": "^3.0.11", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.0.6.tgz", + "integrity": "sha512-ftpmkTHIFqgaFugcjzLZv3kzPEFsBFSnq1JsIkr2mwFzCraZVhQk2gqN51OOeRxqhbPTkRFj39Qd2V91E/mQxg==", + "dependencies": { + "@smithy/core": "^3.1.5", + "@smithy/middleware-serde": "^4.0.2", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/shared-ini-file-loader": "^4.0.1", + "@smithy/types": "^4.1.0", + "@smithy/url-parser": "^4.0.1", + "@smithy/util-middleware": "^4.0.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/middleware-retry": { - "version": "3.0.30", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-3.0.30.tgz", - "integrity": "sha512-6323RL2BvAR3VQpTjHpa52kH/iSHyxd/G9ohb2MkBk2Ucu+oMtRXT8yi7KTSIS9nb58aupG6nO0OlXnQOAcvmQ==", - "dependencies": { - "@smithy/node-config-provider": "^3.1.12", - "@smithy/protocol-http": "^4.1.8", - "@smithy/service-error-classification": "^3.0.11", - "@smithy/smithy-client": "^3.5.0", - "@smithy/types": "^3.7.2", - "@smithy/util-middleware": "^3.0.11", - "@smithy/util-retry": "^3.0.11", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.0.7.tgz", + "integrity": "sha512-58j9XbUPLkqAcV1kHzVX/kAR16GT+j7DUZJqwzsxh1jtz7G82caZiGyyFgUvogVfNTg3TeAOIJepGc8TXF4AVQ==", + "dependencies": { + "@smithy/node-config-provider": "^4.0.1", + "@smithy/protocol-http": "^5.0.1", + "@smithy/service-error-classification": "^4.0.1", + "@smithy/smithy-client": "^4.1.6", + "@smithy/types": "^4.1.0", + "@smithy/util-middleware": "^4.0.1", + "@smithy/util-retry": "^4.0.1", "tslib": "^2.6.2", "uuid": "^9.0.1" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/middleware-serde": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.11.tgz", - "integrity": "sha512-KzPAeySp/fOoQA82TpnwItvX8BBURecpx6ZMu75EZDkAcnPtO6vf7q4aH5QHs/F1s3/snQaSFbbUMcFFZ086Mw==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.2.tgz", + "integrity": "sha512-Sdr5lOagCn5tt+zKsaW+U2/iwr6bI9p08wOkCp6/eL6iMbgdtc2R5Ety66rf87PeohR0ExI84Txz9GYv5ou3iQ==", "dependencies": { - "@smithy/types": "^3.7.2", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/middleware-stack": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-3.0.11.tgz", - "integrity": "sha512-1HGo9a6/ikgOMrTrWL/WiN9N8GSVYpuRQO5kjstAq4CvV59bjqnh7TbdXGQ4vxLD3xlSjfBjq5t1SOELePsLnA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.1.tgz", + "integrity": "sha512-dHwDmrtR/ln8UTHpaIavRSzeIk5+YZTBtLnKwDW3G2t6nAupCiQUvNzNoHBpik63fwUaJPtlnMzXbQrNFWssIA==", "dependencies": { - "@smithy/types": "^3.7.2", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/node-config-provider": { - "version": "3.1.12", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.12.tgz", - "integrity": "sha512-O9LVEu5J/u/FuNlZs+L7Ikn3lz7VB9hb0GtPT9MQeiBmtK8RSY3ULmsZgXhe6VAlgTw0YO+paQx4p8xdbs43vQ==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.0.1.tgz", + "integrity": "sha512-8mRTjvCtVET8+rxvmzRNRR0hH2JjV0DFOmwXPrISmTIJEfnCBugpYYGAsCj8t41qd+RB5gbheSQ/6aKZCQvFLQ==", "dependencies": { - "@smithy/property-provider": "^3.1.11", - "@smithy/shared-ini-file-loader": "^3.1.12", - "@smithy/types": "^3.7.2", + "@smithy/property-provider": "^4.0.1", + "@smithy/shared-ini-file-loader": "^4.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/node-http-handler": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.3.2.tgz", - "integrity": "sha512-t4ng1DAd527vlxvOfKFYEe6/QFBcsj7WpNlWTyjorwXXcKw3XlltBGbyHfSJ24QT84nF+agDha9tNYpzmSRZPA==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.0.3.tgz", + "integrity": "sha512-dYCLeINNbYdvmMLtW0VdhW1biXt+PPCGazzT5ZjKw46mOtdgToQEwjqZSS9/EN8+tNs/RO0cEWG044+YZs97aA==", "dependencies": { - "@smithy/abort-controller": "^3.1.9", - "@smithy/protocol-http": "^4.1.8", - "@smithy/querystring-builder": "^3.0.11", - "@smithy/types": "^3.7.2", + "@smithy/abort-controller": "^4.0.1", + "@smithy/protocol-http": "^5.0.1", + "@smithy/querystring-builder": "^4.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/property-provider": { - "version": "3.1.11", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.11.tgz", - "integrity": "sha512-I/+TMc4XTQ3QAjXfOcUWbSS073oOEAxgx4aZy8jHaf8JQnRkq2SZWw8+PfDtBvLUjcGMdxl+YwtzWe6i5uhL/A==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.1.tgz", + "integrity": "sha512-o+VRiwC2cgmk/WFV0jaETGOtX16VNPp2bSQEzu0whbReqE1BMqsP2ami2Vi3cbGVdKu1kq9gQkDAGKbt0WOHAQ==", "dependencies": { - "@smithy/types": "^3.7.2", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/protocol-http": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.8.tgz", - "integrity": "sha512-hmgIAVyxw1LySOwkgMIUN0kjN8TG9Nc85LJeEmEE/cNEe2rkHDUWhnJf2gxcSRFLWsyqWsrZGw40ROjUogg+Iw==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.0.1.tgz", + "integrity": "sha512-TE4cpj49jJNB/oHyh/cRVEgNZaoPaxd4vteJNB0yGidOCVR0jCw/hjPVsT8Q8FRmj8Bd3bFZt8Dh7xGCT+xMBQ==", "dependencies": { - "@smithy/types": "^3.7.2", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/querystring-builder": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-3.0.11.tgz", - "integrity": "sha512-u+5HV/9uJaeLj5XTb6+IEF/dokWWkEqJ0XiaRRogyREmKGUgZnNecLucADLdauWFKUNbQfulHFEZEdjwEBjXRg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.1.tgz", + "integrity": "sha512-wU87iWZoCbcqrwszsOewEIuq+SU2mSoBE2CcsLwE0I19m0B2gOJr1MVjxWcDQYOzHbR1xCk7AcOBbGFUYOKvdg==", "dependencies": { - "@smithy/types": "^3.7.2", - "@smithy/util-uri-escape": "^3.0.0", + "@smithy/types": "^4.1.0", + "@smithy/util-uri-escape": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/querystring-parser": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-3.0.11.tgz", - "integrity": "sha512-Je3kFvCsFMnso1ilPwA7GtlbPaTixa3WwC+K21kmMZHsBEOZYQaqxcMqeFFoU7/slFjKDIpiiPydvdJm8Q/MCw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.1.tgz", + "integrity": "sha512-Ma2XC7VS9aV77+clSFylVUnPZRindhB7BbmYiNOdr+CHt/kZNJoPP0cd3QxCnCFyPXC4eybmyE98phEHkqZ5Jw==", "dependencies": { - "@smithy/types": "^3.7.2", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/service-error-classification": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-3.0.11.tgz", - "integrity": "sha512-QnYDPkyewrJzCyaeI2Rmp7pDwbUETe+hU8ADkXmgNusO1bgHBH7ovXJiYmba8t0fNfJx75fE8dlM6SEmZxheog==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.0.1.tgz", + "integrity": "sha512-3JNjBfOWpj/mYfjXJHB4Txc/7E4LVq32bwzE7m28GN79+M1f76XHflUaSUkhOriprPDzev9cX/M+dEB80DNDKA==", "dependencies": { - "@smithy/types": "^3.7.2" + "@smithy/types": "^4.1.0" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/shared-ini-file-loader": { - "version": "3.1.12", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.12.tgz", - "integrity": "sha512-1xKSGI+U9KKdbG2qDvIR9dGrw3CNx+baqJfyr0igKEpjbHL5stsqAesYBzHChYHlelWtb87VnLWlhvfCz13H8Q==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.1.tgz", + "integrity": "sha512-hC8F6qTBbuHRI/uqDgqqi6J0R4GtEZcgrZPhFQnMhfJs3MnUTGSnR1NSJCJs5VWlMydu0kJz15M640fJlRsIOw==", "dependencies": { - "@smithy/types": "^3.7.2", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/signature-v4": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-4.2.4.tgz", - "integrity": "sha512-5JWeMQYg81TgU4cG+OexAWdvDTs5JDdbEZx+Qr1iPbvo91QFGzjy0IkXAKaXUHqmKUJgSHK0ZxnCkgZpzkeNTA==", - "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", - "@smithy/protocol-http": "^4.1.8", - "@smithy/types": "^3.7.2", - "@smithy/util-hex-encoding": "^3.0.0", - "@smithy/util-middleware": "^3.0.11", - "@smithy/util-uri-escape": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.0.1.tgz", + "integrity": "sha512-nCe6fQ+ppm1bQuw5iKoeJ0MJfz2os7Ic3GBjOkLOPtavbD1ONoyE3ygjBfz2ythFWm4YnRm6OxW+8p/m9uCoIA==", + "dependencies": { + "@smithy/is-array-buffer": "^4.0.0", + "@smithy/protocol-http": "^5.0.1", + "@smithy/types": "^4.1.0", + "@smithy/util-hex-encoding": "^4.0.0", + "@smithy/util-middleware": "^4.0.1", + "@smithy/util-uri-escape": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/smithy-client": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.5.0.tgz", - "integrity": "sha512-Y8FeOa7gbDfCWf7njrkoRATPa5eNLUEjlJS5z5rXatYuGkCb80LbHcu8AQR8qgAZZaNHCLyo2N+pxPsV7l+ivg==", - "dependencies": { - "@smithy/core": "^2.5.5", - "@smithy/middleware-endpoint": "^3.2.5", - "@smithy/middleware-stack": "^3.0.11", - "@smithy/protocol-http": "^4.1.8", - "@smithy/types": "^3.7.2", - "@smithy/util-stream": "^3.3.2", + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.1.6.tgz", + "integrity": "sha512-UYDolNg6h2O0L+cJjtgSyKKvEKCOa/8FHYJnBobyeoeWDmNpXjwOAtw16ezyeu1ETuuLEOZbrynK0ZY1Lx9Jbw==", + "dependencies": { + "@smithy/core": "^3.1.5", + "@smithy/middleware-endpoint": "^4.0.6", + "@smithy/middleware-stack": "^4.0.1", + "@smithy/protocol-http": "^5.0.1", + "@smithy/types": "^4.1.0", + "@smithy/util-stream": "^4.1.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/types": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.7.2.tgz", - "integrity": "sha512-bNwBYYmN8Eh9RyjS1p2gW6MIhSO2rl7X9QeLM8iTdcGRP+eDiIWDt66c9IysCc22gefKszZv+ubV9qZc7hdESg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.1.0.tgz", + "integrity": "sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw==", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/url-parser": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-3.0.11.tgz", - "integrity": "sha512-TmlqXkSk8ZPhfc+SQutjmFr5FjC0av3GZP4B/10caK1SbRwe/v+Wzu/R6xEKxoNqL+8nY18s1byiy6HqPG37Aw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.1.tgz", + "integrity": "sha512-gPXcIEUtw7VlK8f/QcruNXm7q+T5hhvGu9tl63LsJPZ27exB6dtNwvh2HIi0v7JcXJ5emBxB+CJxwaLEdJfA+g==", "dependencies": { - "@smithy/querystring-parser": "^3.0.11", - "@smithy/types": "^3.7.2", + "@smithy/querystring-parser": "^4.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, "node_modules/@smithy/util-base64": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-3.0.0.tgz", - "integrity": "sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.0.0.tgz", + "integrity": "sha512-CvHfCmO2mchox9kjrtzoHkWHxjHZzaFojLc8quxXY7WAAMAg43nuxwv95tATVgQFNDwd4M9S1qFzj40Ul41Kmg==", "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", + "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/util-body-length-browser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-3.0.0.tgz", - "integrity": "sha512-cbjJs2A1mLYmqmyVl80uoLTJhAcfzMOyPgjwAYusWKMdLeNtzmMz9YxNl3/jRLoxSS3wkqkf0jwNdtXWtyEBaQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.0.0.tgz", + "integrity": "sha512-sNi3DL0/k64/LO3A256M+m3CDdG6V7WKWHdAiBBMUN8S3hK3aMPhwnPik2A/a2ONN+9doY9UxaLfgqsIRg69QA==", "dependencies": { "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, "node_modules/@smithy/util-body-length-node": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-3.0.0.tgz", - "integrity": "sha512-Tj7pZ4bUloNUP6PzwhN7K386tmSmEET9QtQg0TgdNOnxhZvCssHji+oZTUIuzxECRfG8rdm2PMw2WCFs6eIYkA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.0.0.tgz", + "integrity": "sha512-q0iDP3VsZzqJyje8xJWEJCNIu3lktUGVoSy1KB0UWym2CL1siV3artm+u1DFYTLejpsrdGyCSWBdGNjJzfDPjg==", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/util-buffer-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", - "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.0.0.tgz", + "integrity": "sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug==", "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", + "@smithy/is-array-buffer": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/util-config-provider": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-3.0.0.tgz", - "integrity": "sha512-pbjk4s0fwq3Di/ANL+rCvJMKM5bzAQdE5S/6RL5NXgMExFAi6UgQMPOm5yPaIWPpr+EOXKXRonJ3FoxKf4mCJQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.0.0.tgz", + "integrity": "sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w==", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/util-defaults-mode-browser": { - "version": "3.0.30", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.30.tgz", - "integrity": "sha512-nLuGmgfcr0gzm64pqF2UT4SGWVG8UGviAdayDlVzJPNa6Z4lqvpDzdRXmLxtOdEjVlTOEdpZ9dd3ZMMu488mzg==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.7.tgz", + "integrity": "sha512-CZgDDrYHLv0RUElOsmZtAnp1pIjwDVCSuZWOPhIOBvG36RDfX1Q9+6lS61xBf+qqvHoqRjHxgINeQz47cYFC2Q==", "dependencies": { - "@smithy/property-provider": "^3.1.11", - "@smithy/smithy-client": "^3.5.0", - "@smithy/types": "^3.7.2", + "@smithy/property-provider": "^4.0.1", + "@smithy/smithy-client": "^4.1.6", + "@smithy/types": "^4.1.0", "bowser": "^2.11.0", "tslib": "^2.6.2" }, "engines": { - "node": ">= 10.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/util-defaults-mode-node": { - "version": "3.0.30", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.30.tgz", - "integrity": "sha512-OD63eWoH68vp75mYcfYyuVH+p7Li/mY4sYOROnauDrtObo1cS4uWfsy/zhOTW8F8ZPxQC1ZXZKVxoxvMGUv2Ow==", - "dependencies": { - "@smithy/config-resolver": "^3.0.13", - "@smithy/credential-provider-imds": "^3.2.8", - "@smithy/node-config-provider": "^3.1.12", - "@smithy/property-provider": "^3.1.11", - "@smithy/smithy-client": "^3.5.0", - "@smithy/types": "^3.7.2", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.7.tgz", + "integrity": "sha512-79fQW3hnfCdrfIi1soPbK3zmooRFnLpSx3Vxi6nUlqaaQeC5dm8plt4OTNDNqEEEDkvKghZSaoti684dQFVrGQ==", + "dependencies": { + "@smithy/config-resolver": "^4.0.1", + "@smithy/credential-provider-imds": "^4.0.1", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/property-provider": "^4.0.1", + "@smithy/smithy-client": "^4.1.6", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">= 10.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/util-endpoints": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-2.1.7.tgz", - "integrity": "sha512-tSfcqKcN/Oo2STEYCABVuKgJ76nyyr6skGl9t15hs+YaiU06sgMkN7QYjo0BbVw+KT26zok3IzbdSOksQ4YzVw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.0.1.tgz", + "integrity": "sha512-zVdUENQpdtn9jbpD9SCFK4+aSiavRb9BxEtw9ZGUR1TYo6bBHbIoi7VkrFQ0/RwZlzx0wRBaRmPclj8iAoJCLA==", "dependencies": { - "@smithy/node-config-provider": "^3.1.12", - "@smithy/types": "^3.7.2", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/util-hex-encoding": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-3.0.0.tgz", - "integrity": "sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.0.0.tgz", + "integrity": "sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw==", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/util-middleware": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.11.tgz", - "integrity": "sha512-dWpyc1e1R6VoXrwLoLDd57U1z6CwNSdkM69Ie4+6uYh2GC7Vg51Qtan7ITzczuVpqezdDTKJGJB95fFvvjU/ow==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.1.tgz", + "integrity": "sha512-HiLAvlcqhbzhuiOa0Lyct5IIlyIz0PQO5dnMlmQ/ubYM46dPInB+3yQGkfxsk6Q24Y0n3/JmcA1v5iEhmOF5mA==", "dependencies": { - "@smithy/types": "^3.7.2", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/util-retry": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-3.0.11.tgz", - "integrity": "sha512-hJUC6W7A3DQgaee3Hp9ZFcOxVDZzmBIRBPlUAk8/fSOEl7pE/aX7Dci0JycNOnm9Mfr0KV2XjIlUOcGWXQUdVQ==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.0.1.tgz", + "integrity": "sha512-WmRHqNVwn3kI3rKk1LsKcVgPBG6iLTBGC1iYOV3GQegwJ3E8yjzHytPt26VNzOWr1qu0xE03nK0Ug8S7T7oufw==", "dependencies": { - "@smithy/service-error-classification": "^3.0.11", - "@smithy/types": "^3.7.2", + "@smithy/service-error-classification": "^4.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/util-stream": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.3.2.tgz", - "integrity": "sha512-sInAqdiVeisUGYAv/FrXpmJ0b4WTFmciTRqzhb7wVuem9BHvhIG7tpiYHLDWrl2stOokNZpTTGqz3mzB2qFwXg==", - "dependencies": { - "@smithy/fetch-http-handler": "^4.1.2", - "@smithy/node-http-handler": "^3.3.2", - "@smithy/types": "^3.7.2", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-buffer-from": "^3.0.0", - "@smithy/util-hex-encoding": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.1.2.tgz", + "integrity": "sha512-44PKEqQ303d3rlQuiDpcCcu//hV8sn+u2JBo84dWCE0rvgeiVl0IlLMagbU++o0jCWhYCsHaAt9wZuZqNe05Hw==", + "dependencies": { + "@smithy/fetch-http-handler": "^5.0.1", + "@smithy/node-http-handler": "^4.0.3", + "@smithy/types": "^4.1.0", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-hex-encoding": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/util-uri-escape": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-3.0.0.tgz", - "integrity": "sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.0.0.tgz", + "integrity": "sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg==", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/util-utf8": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", - "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.0.0.tgz", + "integrity": "sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==", "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-buffer-from": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@socket.io/component-emitter": { @@ -5385,9 +5455,9 @@ "peer": true }, "node_modules/@types/pg": { - "version": "8.11.10", - "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.11.10.tgz", - "integrity": "sha512-LczQUW4dbOQzsH2RQ5qoeJ6qJPdrcM/DcMLoqWQkMLMsq83J5lAX3LXjdkWdpscFy67JSOWDnh7Ny/sPFykmkg==", + "version": "8.11.11", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.11.11.tgz", + "integrity": "sha512-kGT1qKM8wJQ5qlawUrEkXgvMSXoV213KfMGXcwfDwUIfUHXqXYXOfS1nE1LINRJVVVx5wCm70XnFlMHaIcQAfw==", "dev": true, "dependencies": { "@types/node": "*", @@ -5422,20 +5492,42 @@ } }, "node_modules/@types/request/node_modules/form-data": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.2.tgz", - "integrity": "sha512-GgwY0PS7DbXqajuGf4OYlsrIu3zgxD6Vvql43IBhm6MahqA5SK/7mwhtNj2AdH2z35YR34ujJ7BN+3fFC3jP5Q==", + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.3.tgz", + "integrity": "sha512-XHIrMD0NpDrNM/Ckf7XJiBbLl57KEhT3+i3yY+eWm+cqYZJQTZrKo8Y8AWKnuV5GT4scfuUGt9LzNoIx3dU1nQ==", "dev": true, "dependencies": { "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "mime-types": "^2.1.35", "safe-buffer": "^5.2.1" }, "engines": { "node": ">= 0.12" } }, + "node_modules/@types/request/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==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@types/request/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==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/@types/sizzle": { "version": "2.3.9", "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.9.tgz", @@ -5645,9 +5737,9 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", "bin": { "semver": "bin/semver.js" }, @@ -5693,9 +5785,9 @@ } }, "node_modules/@ungap/structured-clone": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.1.tgz", - "integrity": "sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==" + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==" }, "node_modules/@xenova/transformers": { "version": "2.14.0", @@ -5739,10 +5831,22 @@ "node": ">=6.5" } }, + "node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/acorn": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", + "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", "bin": { "acorn": "bin/acorn" }, @@ -5797,9 +5901,9 @@ } }, "node_modules/agentkeepalive": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", - "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.6.0.tgz", + "integrity": "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==", "dependencies": { "humanize-ms": "^1.2.1" }, @@ -5954,13 +6058,13 @@ } }, "node_modules/array-buffer-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", - "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", "peer": true, "dependencies": { - "call-bind": "^1.0.5", - "is-array-buffer": "^3.0.4" + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" }, "engines": { "node": ">= 0.4" @@ -6023,15 +6127,15 @@ } }, "node_modules/array.prototype.flat": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", "peer": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -6041,15 +6145,15 @@ } }, "node_modules/array.prototype.flatmap": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", "peer": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -6059,19 +6163,18 @@ } }, "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", - "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", "peer": true, "dependencies": { "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.5", + "call-bind": "^1.0.8", "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.2.1", - "get-intrinsic": "^1.2.3", - "is-array-buffer": "^3.0.4", - "is-shared-array-buffer": "^1.0.2" + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" }, "engines": { "node": ">= 0.4" @@ -6113,6 +6216,15 @@ "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", "dev": true }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "peer": true, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/async-mutex": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/async-mutex/-/async-mutex-0.5.0.tgz", @@ -6163,10 +6275,9 @@ "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==" }, "node_modules/axios": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.2.tgz", - "integrity": "sha512-ls4GYBm5aig9vWx8AWDSGLpnpDQRtWAfrjU+EuytuODrFBkqesN2RkOQCBzrA1RQNHw1SmRMSDDDSwzNAYQ6Rg==", - "license": "MIT", + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.3.tgz", + "integrity": "sha512-iP4DebzoNlP/YN2dpwCgb8zoCmhtkajzS48JvwmkSkXvPI3DHc7m+XYL5tGnSlJtR6nImXZmdCuN5aP8dh1d8A==", "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", @@ -6261,13 +6372,13 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.10.6", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz", - "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.11.1.tgz", + "integrity": "sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.2", - "core-js-compat": "^3.38.0" + "@babel/helper-define-polyfill-provider": "^0.6.3", + "core-js-compat": "^3.40.0" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -6333,44 +6444,62 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "node_modules/bare-events": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.0.tgz", - "integrity": "sha512-/E8dDe9dsbLyh2qrZ64PEPadOQ0F4gbl1sUJOrmph7xOiIxfY8vwab/4bFLh4Y88/Hk/ujKcrQKc+ps0mv873A==", + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz", + "integrity": "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==", "optional": true }, "node_modules/bare-fs": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.3.5.tgz", - "integrity": "sha512-SlE9eTxifPDJrT6YgemQ1WGFleevzwY+XAP1Xqgl56HtcrisC2CHCZ2tq6dBpcH2TnNxwUEUGhweo+lrQtYuiw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.0.1.tgz", + "integrity": "sha512-ilQs4fm/l9eMfWY2dY0WCIUplSUp7U0CT1vrqMg1MUdeZl4fypu5UP0XcDBK5WBQPJAKP1b7XEodISmekH/CEg==", "optional": true, "dependencies": { "bare-events": "^2.0.0", - "bare-path": "^2.0.0", + "bare-path": "^3.0.0", "bare-stream": "^2.0.0" + }, + "engines": { + "bare": ">=1.7.0" } }, "node_modules/bare-os": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.4.4.tgz", - "integrity": "sha512-z3UiI2yi1mK0sXeRdc4O1Kk8aOa/e+FNWZcTiPB/dfTWyLypuE99LibgRaQki914Jq//yAWylcAt+mknKdixRQ==", - "optional": true + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.0.tgz", + "integrity": "sha512-BUrFS5TqSBdA0LwHop4OjPJwisqxGy6JsWVqV6qaFoe965qqtaKfDzHY5T2YA1gUL0ZeeQeA+4BBc1FJTcHiPw==", + "optional": true, + "engines": { + "bare": ">=1.14.0" + } }, "node_modules/bare-path": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-2.1.3.tgz", - "integrity": "sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", + "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", "optional": true, "dependencies": { - "bare-os": "^2.1.0" + "bare-os": "^3.0.1" } }, "node_modules/bare-stream": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.4.2.tgz", - "integrity": "sha512-XZ4ln/KV4KT+PXdIWTKjsLY+quqCaEtqqtgGJVPw9AoM73By03ij64YjepK0aQvHSWDb6AfAZwqKaFu68qkrdA==", + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.6.5.tgz", + "integrity": "sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA==", "optional": true, "dependencies": { - "streamx": "^2.20.0" + "streamx": "^2.21.0" + }, + "peerDependencies": { + "bare-buffer": "*", + "bare-events": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + }, + "bare-events": { + "optional": true + } } }, "node_modules/base64-js": { @@ -6430,9 +6559,9 @@ } }, "node_modules/bl": { - "version": "6.0.16", - "resolved": "https://registry.npmjs.org/bl/-/bl-6.0.16.tgz", - "integrity": "sha512-V/kz+z2Mx5/6qDfRCilmrukUXcXuCoXKg3/3hDvzKKoSUx8CJKudfIoT29XZc3UE9xBvxs5qictiHdprwtteEg==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-6.1.0.tgz", + "integrity": "sha512-ClDyJGQkc8ZtzdAAbAwBmhMSpwN/sC9HA8jxdYm6nVUbCfZbe2mgza4qh7AuEYyEPB/c4Kznf9s66bnsKMQDjw==", "dependencies": { "@types/readable-stream": "^4.0.0", "buffer": "^6.0.3", @@ -6440,6 +6569,50 @@ "readable-stream": "^4.2.0" } }, + "node_modules/body-parser": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.1.0.tgz", + "integrity": "sha512-/hPxh61E+ll0Ujp24Ilm64cykicul1ypfwjVttduAiEdtnJFvLePSrIPk+HMImtNv5270wOGCb1Tns2rybMkoQ==", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.0", + "http-errors": "^2.0.0", + "iconv-lite": "^0.5.2", + "on-finished": "^2.4.1", + "qs": "^6.14.0", + "raw-body": "^3.0.0", + "type-is": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/body-parser/node_modules/iconv-lite": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.5.2.tgz", + "integrity": "sha512-kERHXvpSaB4aU3eANwidg79K8FlrN77m8G9V+0vOR3HYaRifrlwMEpT7ZBJqLSEIHnEgJTHcWK82wwLwwKwtag==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/body-parser/node_modules/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", @@ -6470,9 +6643,9 @@ } }, "node_modules/browserslist": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", - "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", "dev": true, "funding": [ { @@ -6489,9 +6662,9 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001669", - "electron-to-chromium": "^1.5.41", - "node-releases": "^2.0.18", + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.1" }, "bin": { @@ -6564,6 +6737,20 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -6669,9 +6856,9 @@ } }, "node_modules/call-bind-apply-helpers": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", - "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" @@ -6680,6 +6867,21 @@ "node": ">= 0.4" } }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -6698,9 +6900,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001687", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001687.tgz", - "integrity": "sha512-0S/FDhf4ZiqrTUiQ39dKeUjYRjkv7lOZU1Dgif2rIqrTzX/1wV2hfKu9TOm1IHkdSijfLswxTFzl/cvir+SLSQ==", + "version": "1.0.30001703", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001703.tgz", + "integrity": "sha512-kRlAGTRWgPsOj7oARC9m1okJEXdL/8fekFVcxA8Hl7GH4r/sN4OJn/i6Flde373T50KS7Y37oFbMwlE8+F42kQ==", "dev": true, "funding": [ { @@ -6846,9 +7048,9 @@ } }, "node_modules/cjs-module-lexer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz", - "integrity": "sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", + "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", "dev": true }, "node_modules/clean-stack": { @@ -7031,6 +7233,17 @@ "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" }, + "node_modules/content-disposition": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", + "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/content-type": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", @@ -7045,13 +7258,29 @@ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true }, + "node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "engines": { + "node": ">=6.6.0" + } + }, "node_modules/core-js-compat": { - "version": "3.39.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.39.0.tgz", - "integrity": "sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw==", + "version": "3.41.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.41.0.tgz", + "integrity": "sha512-RFsU9LySVue9RTwdDVX/T0e2Y6jRYWXERKElIjpuEOEnxaXffI0X7RUwVzfYLfzuLXSNJDYoRYUAmRUcyln20A==", "dev": true, "dependencies": { - "browserslist": "^4.24.2" + "browserslist": "^4.24.4" }, "funding": { "type": "opencollective", @@ -7063,6 +7292,18 @@ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/cosmiconfig": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", @@ -7173,16 +7414,22 @@ "dev": true }, "node_modules/cssstyle": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.1.0.tgz", - "integrity": "sha512-h66W1URKpBS5YMI/V8PyXvTMFT8SupJ1IzoIV8IeBC/ji8WVmrO8dGlTi+2dh6whmdk6BiKJLD/ZBkhWbcg6nA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.3.0.tgz", + "integrity": "sha512-6r0NiY0xizYqfBvWp1G7WXJ06/bZyrk7Dc6PHql82C/pKGUTKu4yAX4Y8JPamb1ob9nBKuxWzCGTRuGwU3yxJQ==", "dependencies": { - "rrweb-cssom": "^0.7.1" + "@asamuzakjp/css-color": "^3.1.1", + "rrweb-cssom": "^0.8.0" }, "engines": { "node": ">=18" } }, + "node_modules/cssstyle/node_modules/rrweb-cssom": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz", + "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==" + }, "node_modules/dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -7215,14 +7462,14 @@ } }, "node_modules/data-view-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", - "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", "peer": true, "dependencies": { - "call-bind": "^1.0.6", + "call-bound": "^1.0.3", "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" + "is-data-view": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -7232,29 +7479,29 @@ } }, "node_modules/data-view-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", - "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", "peer": true, "dependencies": { - "call-bind": "^1.0.7", + "call-bound": "^1.0.3", "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" + "is-data-view": "^1.0.2" }, "engines": { "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/inspect-js" } }, "node_modules/data-view-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", - "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", "peer": true, "dependencies": { - "call-bind": "^1.0.6", + "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-data-view": "^1.0.1" }, @@ -7293,9 +7540,9 @@ } }, "node_modules/decimal.js": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", - "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==" + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.5.0.tgz", + "integrity": "sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==" }, "node_modules/decompress-response": { "version": "6.0.0", @@ -7347,6 +7594,32 @@ "node": ">=0.10.0" } }, + "node_modules/default-browser": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", + "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", + "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/define-data-property": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", @@ -7364,11 +7637,14 @@ } }, "node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/define-properties": { @@ -7435,6 +7711,15 @@ "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==" }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, "node_modules/detect-libc": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", @@ -7548,9 +7833,9 @@ } }, "node_modules/domutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", @@ -7572,11 +7857,11 @@ } }, "node_modules/dunder-proto": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.0.tgz", - "integrity": "sha512-9+Sj30DIu+4KvHqMfLUGLFYL2PkURSYMVXJyXe92nFRvlYq5hBjLEhblKB+vkd/WVlUYMWigiY07T91Fkk0+4A==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", "dependencies": { - "call-bind-apply-helpers": "^1.0.0", + "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" }, @@ -7611,6 +7896,11 @@ "safe-buffer": "^5.0.1" } }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, "node_modules/eight-colors": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/eight-colors/-/eight-colors-1.3.1.tgz", @@ -7632,9 +7922,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.72", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.72.tgz", - "integrity": "sha512-ZpSAUOZ2Izby7qnZluSrAlGgGQzucmFbN0n64dYzocYxnxV5ufurpj3VgEe4cUp7ir9LmeLxNYo8bVnlM8bQHw==", + "version": "1.5.115", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.115.tgz", + "integrity": "sha512-MN1nahVHAQMOz6dz6bNZ7apgqc9InZy7Ja4DBEVCTdeiUcegbyOYE9bi/f2Z/z6ZxLi0RxLpyJ3EGe+4h3w73A==", "dev": true }, "node_modules/emittery": { @@ -7654,6 +7944,14 @@ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/encoding": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", @@ -7684,9 +7982,9 @@ } }, "node_modules/engine.io-client": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.6.2.tgz", - "integrity": "sha512-TAr+NKeoVTjEVW8P3iHguO1LO6RlUz9O5Y8o7EY0fU+gY1NYqas7NN3slpFtbXEsLMHk0h90fJMfKjRkQ0qUIw==", + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.6.3.tgz", + "integrity": "sha512-T0iLjnyNWahNyv/lcjS2y4oE358tVS/SYQNxYXGAJ9/GLgH4VCvOQ/mhTjqU88mLZCQgiG8RIegFHYCdVC+j5w==", "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.1", @@ -7773,57 +8071,62 @@ } }, "node_modules/es-abstract": { - "version": "1.23.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.5.tgz", - "integrity": "sha512-vlmniQ0WNPwXqA0BnmwV3Ng7HxiGlh6r5U6JcTMNx8OilcAGqVJBHJcPjqOMaczU9fRuRK5Px2BdVyPRnKMMVQ==", + "version": "1.23.9", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.9.tgz", + "integrity": "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==", "peer": true, "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "arraybuffer.prototype.slice": "^1.0.3", + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "data-view-buffer": "^1.0.1", - "data-view-byte-length": "^1.0.1", - "data-view-byte-offset": "^1.0.0", - "es-define-property": "^1.0.0", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", - "es-set-tostringtag": "^2.0.3", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.4", - "get-symbol-description": "^1.0.2", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.0", + "get-symbol-description": "^1.1.0", "globalthis": "^1.0.4", - "gopd": "^1.0.1", + "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", "hasown": "^2.0.2", - "internal-slot": "^1.0.7", - "is-array-buffer": "^3.0.4", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", "is-callable": "^1.2.7", - "is-data-view": "^1.0.1", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.3", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.13", - "is-weakref": "^1.0.2", + "is-data-view": "^1.0.2", + "is-regex": "^1.2.1", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.0", + "math-intrinsics": "^1.1.0", "object-inspect": "^1.13.3", "object-keys": "^1.1.1", - "object.assign": "^4.1.5", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", "regexp.prototype.flags": "^1.5.3", - "safe-array-concat": "^1.1.2", - "safe-regex-test": "^1.0.3", - "string.prototype.trim": "^1.2.9", - "string.prototype.trimend": "^1.0.8", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.2", - "typed-array-byte-length": "^1.0.1", - "typed-array-byte-offset": "^1.0.2", - "typed-array-length": "^1.0.6", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.15" + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.18" }, "engines": { "node": ">= 0.4" @@ -7849,9 +8152,9 @@ } }, "node_modules/es-object-atoms": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", - "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", "dependencies": { "es-errors": "^1.3.0" }, @@ -7860,26 +8163,29 @@ } }, "node_modules/es-set-tostringtag": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", - "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", - "peer": true, + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", "dependencies": { - "get-intrinsic": "^1.2.4", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", - "hasown": "^2.0.1" + "hasown": "^2.0.2" }, "engines": { "node": ">= 0.4" } }, "node_modules/es-shim-unscopables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", "peer": true, "dependencies": { - "hasown": "^2.0.0" + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/es-to-primitive": { @@ -7944,6 +8250,11 @@ "node": ">=6" } }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -8319,6 +8630,14 @@ "node": ">=0.10.0" } }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/event-target-shim": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", @@ -8410,6 +8729,83 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/express": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/express/-/express-5.0.1.tgz", + "integrity": "sha512-ORF7g6qGnD+YtUG9yx4DFoqCShNMmUKiXuT5oWMHiOvt/4WFbHC6yCwQMTSBMno7AqntNCAzzcnnjowRkTL9eQ==", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.0.1", + "content-disposition": "^1.0.0", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "^1.2.1", + "debug": "4.3.6", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "^2.0.0", + "fresh": "2.0.0", + "http-errors": "2.0.0", + "merge-descriptors": "^2.0.0", + "methods": "~1.1.2", + "mime-types": "^3.0.0", + "on-finished": "2.4.1", + "once": "1.4.0", + "parseurl": "~1.3.3", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "router": "^2.0.0", + "safe-buffer": "5.2.1", + "send": "^1.1.0", + "serve-static": "^2.1.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "^2.0.0", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/express-rate-limit": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.0.tgz", + "integrity": "sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/express-rate-limit" + }, + "peerDependencies": { + "express": "^4.11 || 5 || ^5.0.0-beta.1" + } + }, + "node_modules/express/node_modules/debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -8467,15 +8863,15 @@ "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==" }, "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "micromatch": "^4.0.8" }, "engines": { "node": ">=8.6.0" @@ -8532,9 +8928,9 @@ } }, "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", "dependencies": { "reusify": "^1.0.4" } @@ -8626,6 +9022,22 @@ "node": ">=8" } }, + "node_modules/finalhandler": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", + "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/find-replace": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", @@ -8673,9 +9085,9 @@ "peer": true }, "node_modules/flatted": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", - "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==" + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==" }, "node_modules/follow-redirects": { "version": "1.15.9", @@ -8697,20 +9109,26 @@ } }, "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", "peer": true, "dependencies": { - "is-callable": "^1.1.3" + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "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==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", "dependencies": { - "cross-spawn": "^7.0.0", + "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" }, "engines": { @@ -8740,12 +9158,13 @@ } }, "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==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", + "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", "mime-types": "^2.1.12" }, "engines": { @@ -8757,6 +9176,25 @@ "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.2.tgz", "integrity": "sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==" }, + "node_modules/form-data/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==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/form-data/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==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/formdata-node": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-4.4.1.tgz", @@ -8788,6 +9226,22 @@ "node": ">=12.20.0" } }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", @@ -8843,15 +9297,17 @@ } }, "node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", "peer": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" }, "engines": { "node": ">= 0.4" @@ -8953,11 +9409,12 @@ } }, "node_modules/gcp-metadata": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.0.tgz", - "integrity": "sha512-Jh/AIwwgaxan+7ZUUmRLCjtchyDiqh4KjBJ5tW3plBZb5iL/BPcso8A5DlzeD9qlw0duCamnNdpFjxwaT0KyKg==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.1.tgz", + "integrity": "sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==", "dependencies": { - "gaxios": "^6.0.0", + "gaxios": "^6.1.1", + "google-logging-utils": "^0.0.2", "json-bigint": "^1.0.0" }, "engines": { @@ -8990,18 +9447,20 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.5.tgz", - "integrity": "sha512-Y4+pKa7XeRUPWFNvOOYHkRYrfzW07oraURSvjDmRVOJ748OrVmeXtpE4+GCEHncjCjkTxPNRt8kEbxDhsn6VTg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "dependencies": { - "call-bind-apply-helpers": "^1.0.0", - "dunder-proto": "^1.0.0", + "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", + "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", - "hasown": "^2.0.2" + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -9019,6 +9478,18 @@ "node": ">=8.0.0" } }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", @@ -9032,14 +9503,14 @@ } }, "node_modules/get-symbol-description": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", - "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", "peer": true, "dependencies": { - "call-bind": "^1.0.5", + "call-bound": "^1.0.3", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4" + "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" @@ -9178,9 +9649,9 @@ } }, "node_modules/google-auth-library": { - "version": "9.15.0", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.15.0.tgz", - "integrity": "sha512-7ccSEJFDFO7exFbO6NRyC+xH8/mZ1GZGG2xxx9iHxZWcjUjJpjWxIMw3cofAKcueZ6DATiukmmprD7yavQHOyQ==", + "version": "9.15.1", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.15.1.tgz", + "integrity": "sha512-Jb6Z0+nvECVz+2lzSMt9u98UsoakXxA2HGHMCxh+so3n90XgYWkq5dur19JAJV7ONiJY22yBTyJB1TSkvPq9Ng==", "dependencies": { "base64-js": "^1.3.0", "ecdsa-sig-formatter": "^1.0.11", @@ -9193,6 +9664,14 @@ "node": ">=14" } }, + "node_modules/google-logging-utils": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-0.0.2.tgz", + "integrity": "sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==", + "engines": { + "node": ">=14" + } + }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -9339,10 +9818,13 @@ } }, "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", "peer": true, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -9404,7 +9886,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "peer": true, "dependencies": { "has-symbols": "^1.0.3" }, @@ -9589,9 +10070,9 @@ } }, "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -9666,14 +10147,14 @@ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" }, "node_modules/internal-slot": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", - "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", "peer": true, "dependencies": { "es-errors": "^1.3.0", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" + "hasown": "^2.0.2", + "side-channel": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -9691,14 +10172,23 @@ "node": ">= 12" } }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, "node_modules/is-array-buffer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", - "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", "peer": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" @@ -9713,12 +10203,16 @@ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, "node_modules/is-async-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", - "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", "peer": true, "dependencies": { - "has-tostringtag": "^1.0.0" + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -9743,12 +10237,12 @@ } }, "node_modules/is-boolean-object": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.0.tgz", - "integrity": "sha512-kR5g0+dXf/+kXnqI+lu0URKYPKgICtHGGNCDSB10AaUFj3o/HkB3u7WfpRBJGFopxxY0oH3ux7ZsDjLtK7xqvw==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", "peer": true, "dependencies": { - "call-bind": "^1.0.7", + "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" }, "engines": { @@ -9771,9 +10265,9 @@ } }, "node_modules/is-core-module": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", - "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "dependencies": { "hasown": "^2.0.2" }, @@ -9785,11 +10279,13 @@ } }, "node_modules/is-data-view": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", - "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", "peer": true, "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", "is-typed-array": "^1.1.13" }, "engines": { @@ -9800,12 +10296,13 @@ } }, "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", "peer": true, "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -9815,14 +10312,14 @@ } }, "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", "bin": { "is-docker": "cli.js" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -9842,12 +10339,12 @@ } }, "node_modules/is-finalizationregistry": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.0.tgz", - "integrity": "sha512-qfMdqbAQEwBw78ZyReKnlA8ezmPdb9BemzIIip/JkjaZUhitfXDkkr+3QTboW0JrSXT1QWyYShpvnNHGZ4c4yA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", "peer": true, "dependencies": { - "call-bind": "^1.0.7" + "call-bound": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -9874,12 +10371,15 @@ } }, "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", "peer": true, "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -9899,6 +10399,23 @@ "node": ">=0.10.0" } }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-lambda": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", @@ -9917,18 +10434,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", - "peer": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -9938,12 +10443,12 @@ } }, "node_modules/is-number-object": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.0.tgz", - "integrity": "sha512-KVSZV0Dunv9DTPkhXwcZ3Q+tUc9TsaE1ZwX5J2WMvsSGS6Md8TFPun5uwh0yRdrNerI6vf/tbJxqSx4c1ZI1Lw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", "peer": true, "dependencies": { - "call-bind": "^1.0.7", + "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" }, "engines": { @@ -9966,19 +10471,24 @@ "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==" + }, "node_modules/is-property": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==" }, "node_modules/is-regex": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.0.tgz", - "integrity": "sha512-B6ohK4ZmoftlUe+uvenXSbPJFo6U37BH7oO1B3nQH8f/7h27N56s85MhUtbFJAziz5dcmuR3i8ovUl35zp8pFA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", "peer": true, "dependencies": { - "call-bind": "^1.0.7", - "gopd": "^1.1.0", + "call-bound": "^1.0.2", + "gopd": "^1.2.0", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" }, @@ -10002,12 +10512,12 @@ } }, "node_modules/is-shared-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", - "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", "peer": true, "dependencies": { - "call-bind": "^1.0.7" + "call-bound": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -10028,12 +10538,12 @@ } }, "node_modules/is-string": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.0.tgz", - "integrity": "sha512-PlfzajuF9vSo5wErv3MJAKD/nqf9ngAs1NFQYm16nUYFO2IzxJ2hcm+IOCg+EEopdykNNUhVq5cz35cAUxU8+g==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", "peer": true, "dependencies": { - "call-bind": "^1.0.7", + "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" }, "engines": { @@ -10044,14 +10554,14 @@ } }, "node_modules/is-symbol": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.0.tgz", - "integrity": "sha512-qS8KkNNXUZ/I+nX6QT8ZS1/Yx0A444yhzdTKxCzKkNjQ9sHErBxJnJAgh+f5YhusYECEcjo4XcyH87hn6+ks0A==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", "peer": true, "dependencies": { - "call-bind": "^1.0.7", - "has-symbols": "^1.0.3", - "safe-regex-test": "^1.0.3" + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -10061,12 +10571,12 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", - "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", "peer": true, "dependencies": { - "which-typed-array": "^1.1.14" + "which-typed-array": "^1.1.16" }, "engines": { "node": ">= 0.4" @@ -10093,25 +10603,28 @@ } }, "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", "peer": true, "dependencies": { - "call-bind": "^1.0.2" + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-weakset": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", - "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", "peer": true, "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4" + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" @@ -10121,14 +10634,17 @@ } }, "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", "dependencies": { - "is-docker": "^2.0.0" + "is-inside-container": "^1.0.0" }, "engines": { - "node": ">=8" + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/isarray": { @@ -10173,9 +10689,9 @@ } }, "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -11054,9 +11570,9 @@ } }, "node_modules/jest-snapshot/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -11174,9 +11690,9 @@ "integrity": "sha512-/GDnfQYsltsjRswQhN9fhv3EMw2sCpUdrdxyWDOUK7eyD++r3gRhzgiQgc/x4MAv2i1iuQ4lxO5mvqM3vj4bwA==" }, "node_modules/js-tiktoken": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/js-tiktoken/-/js-tiktoken-1.0.15.tgz", - "integrity": "sha512-65ruOWWXDEZHHbAo7EjOcNxOGasQKbL4Fq3jEr2xsCqSsoOo6VVSqzWQb6PRIqypFSDcma4jO90YP0w5X8qVXQ==", + "version": "1.0.19", + "resolved": "https://registry.npmjs.org/js-tiktoken/-/js-tiktoken-1.0.19.tgz", + "integrity": "sha512-XC63YQeEcS47Y53gg950xiZ4IWmkfMe4p2V9OSaBt26q+p47WHn18izuXzSclCI73B7yGqtfRsT6jcZQI0y08g==", "dependencies": { "base64-js": "^1.5.1" } @@ -11242,9 +11758,9 @@ } }, "node_modules/jsesc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", - "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "dev": true, "bin": { "jsesc": "bin/jsesc" @@ -11353,9 +11869,9 @@ } }, "node_modules/jsonwebtoken/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", "bin": { "semver": "bin/semver.js" }, @@ -11573,9 +12089,9 @@ "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" }, "node_modules/long": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", - "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/long/-/long-5.3.1.tgz", + "integrity": "sha512-ka87Jz3gcx/I7Hal94xaN2tZEOPoUOEVftkQqZx2EeQRN7LGdfLlI3FvZ+7WDplm+vK2Urx9ULrvSowtdCieng==" }, "node_modules/lru-cache": { "version": "11.0.2", @@ -11586,9 +12102,9 @@ } }, "node_modules/lru.min": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/lru.min/-/lru.min-1.1.1.tgz", - "integrity": "sha512-FbAj6lXil6t8z4z3j0E5mfRlPzxkySotzUHwRXjlpRh10vc6AI6WN62ehZj82VG7M20rqogJ0GLwar2Xa05a8Q==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/lru.min/-/lru.min-1.1.2.tgz", + "integrity": "sha512-Nv9KddBcQSlQopmBHXSsZVY5xsdlZkdH/Iey0BlcBYggMd4two7cZnKOK9vmy3nY0O5RGH99z1PCeTpPqszUYg==", "engines": { "bun": ">=1.0.0", "deno": ">=1.30.0", @@ -11600,9 +12116,9 @@ } }, "node_modules/mac-ca": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mac-ca/-/mac-ca-3.1.0.tgz", - "integrity": "sha512-ts8slRarTfSQhtEYRVRjfLMEOsvFBtZdlnI6jvqAcWAS8dSQwyrcACkFz5GvV4bshe3WAOcPHwN8fuovdqsxOQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/mac-ca/-/mac-ca-3.1.1.tgz", + "integrity": "sha512-OmXW0O2HdZrL+CPbjvDJ68UxNdAtRfzzUaGqzRqwaFoU+BXlk6BFoJmNJSZv9wEAjMClIFoRA/GtGcbqgHY3kQ==", "dependencies": { "node-forge": "^1.3.1", "undici": "^6.16.1" @@ -11644,9 +12160,9 @@ } }, "node_modules/make-dir/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -11760,6 +12276,15 @@ "node": ">=8" } }, + "node_modules/make-fetch-happen/node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "optional": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/make-fetch-happen/node_modules/socks-proxy-agent": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz", @@ -11783,6 +12308,33 @@ "tmpl": "1.0.5" } }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -11797,6 +12349,14 @@ "node": ">= 8" } }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/micromatch": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", @@ -11810,19 +12370,19 @@ } }, "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==", + "version": "1.53.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.53.0.tgz", + "integrity": "sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==", "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==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.0.tgz", + "integrity": "sha512-XqoSHeCGjVClAmoGFG3lVFqQFRIrTVw2OH3axRqAcfaw+gHWIfnASS92AV+Rl/mk0MupgZTRHQOjxY6YVnzK5w==", "dependencies": { - "mime-db": "1.52.0" + "mime-db": "^1.53.0" }, "engines": { "node": ">= 0.6" @@ -12098,9 +12658,9 @@ } }, "node_modules/mysql2": { - "version": "3.11.5", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.11.5.tgz", - "integrity": "sha512-0XFu8rUmFN9vC0ME36iBvCUObftiMHItrYFhlCRvFWbLgpNqtC4Br/NmZX1HNCszxT0GGy5QtP+k3Q3eCJPaYA==", + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.13.0.tgz", + "integrity": "sha512-M6DIQjTqKeqXH5HLbLMxwcK5XfXHw30u5ap6EZmu7QVmcF/gnh2wS/EOiQ4MTbXz/vQeoXrmycPlVRM00WSslg==", "dependencies": { "aws-ssl-profiles": "^1.1.1", "denque": "^2.1.0", @@ -12136,9 +12696,9 @@ } }, "node_modules/napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", + "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==" }, "node_modules/native-duplexpair": { "version": "1.0.0", @@ -12151,10 +12711,9 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" }, "node_modules/negotiator": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", - "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", - "optional": true, + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", "engines": { "node": ">= 0.6" } @@ -12173,9 +12732,9 @@ } }, "node_modules/node-abi": { - "version": "3.71.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.71.0.tgz", - "integrity": "sha512-SZ40vRiy/+wRTf21hxkkEjPJZpARzUMVcJoQse2EF8qkUWbbO2z7vd5oA/H6bVH6SZQ5STGcu0KRDS7biNRfxw==", + "version": "3.74.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.74.0.tgz", + "integrity": "sha512-c5XK0MjkGBrQPGYG24GBADZud0NCbznxNx0ZkS+ebUTrmV1qTDxPxSL8zEAPURXSbLRWVexxmP4986BziahL5w==", "dependencies": { "semver": "^7.3.5" }, @@ -12184,9 +12743,9 @@ } }, "node_modules/node-abi/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", "bin": { "semver": "bin/semver.js" }, @@ -12276,9 +12835,9 @@ } }, "node_modules/node-gyp/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", "optional": true, "bin": { "semver": "bin/semver.js" @@ -12352,9 +12911,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", - "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", "dev": true }, "node_modules/nopt": { @@ -12441,9 +13000,9 @@ } }, "node_modules/nwsapi": { - "version": "2.2.16", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.16.tgz", - "integrity": "sha512-F1I/bimDpj3ncaNDhfyMWuFqmQDBwDB0Fogc2qpL3BWvkQteFD/8BzWuIRl83rq0DXfm8SGt/HFhLXZyljTXcQ==" + "version": "2.2.18", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.18.tgz", + "integrity": "sha512-p1TRH/edngVEHVbwqWnxUViEmq5znDvyB+Sik5cmuLpGOIfDf/39zLiq3swPF8Vakqn+gvNiOQAZu8djYlQILA==" }, "node_modules/oauth-sign": { "version": "0.9.0", @@ -12453,11 +13012,18 @@ "node": "*" } }, + "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==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/object-inspect": { - "version": "1.13.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", - "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", - "peer": true, + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "engines": { "node": ">= 0.4" }, @@ -12474,13 +13040,15 @@ } }, "node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", "dependencies": { - "call-bind": "^1.0.5", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", "object-keys": "^1.1.1" }, "engines": { @@ -12536,12 +13104,13 @@ } }, "node_modules/object.values": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", - "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", "peer": true, "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" }, @@ -12553,9 +13122,9 @@ } }, "node_modules/obliterator": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz", - "integrity": "sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==" + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.5.tgz", + "integrity": "sha512-42CPE9AhahZRsMNslczq0ctAEtqk8Eka26QofnqC346BZdHDySk3LWka23LI7ULIw11NmltpiLagIq8gBozxTw==" }, "node_modules/obuf": { "version": "1.1.2", @@ -12571,6 +13140,17 @@ "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", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -12644,25 +13224,26 @@ "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" }, "node_modules/open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-10.1.0.tgz", + "integrity": "sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==", "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^3.1.0" }, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/openai": { - "version": "4.76.0", - "resolved": "https://registry.npmjs.org/openai/-/openai-4.76.0.tgz", - "integrity": "sha512-QBGIetjX1C9xDp5XGa/3mPnfKI9BgAe2xHQX6PmO98wuW9qQaurBaumcYptQWc9LHZZq7cH/Y1Rjnsr6uUDdVw==", + "version": "4.87.3", + "resolved": "https://registry.npmjs.org/openai/-/openai-4.87.3.tgz", + "integrity": "sha512-d2D54fzMuBYTxMW8wcNmhT1rYKcTfMJ8t+4KjH2KtvYenygITiGBgHoIrzHwnDQWW+C5oCA+ikIR2jgPCFqcKQ==", "dependencies": { "@types/node": "^18.11.18", "@types/node-fetch": "^2.6.4", @@ -12676,18 +13257,22 @@ "openai": "bin/cli" }, "peerDependencies": { + "ws": "^8.18.0", "zod": "^3.23.8" }, "peerDependenciesMeta": { + "ws": { + "optional": true + }, "zod": { "optional": true } } }, "node_modules/openai/node_modules/@types/node": { - "version": "18.19.67", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.67.tgz", - "integrity": "sha512-wI8uHusga+0ZugNp0Ol/3BqQfEcCCNfojtO6Oou9iVNGPTL6QNSdnUdqq85fRgIorLhLMuPIKpsN98QE9Nh+KQ==", + "version": "18.19.80", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.80.tgz", + "integrity": "sha512-kEWeMwMeIvxYkeg1gTc01awpwLbfMRZXdIhwRcakd/KlK53jmRC26LqcbIt7fnAQTu5GzlnWmzA3H6+l1u6xxQ==", "dependencies": { "undici-types": "~5.26.4" } @@ -12746,10 +13331,27 @@ "node": ">= 0.8.0" } }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "peer": true, + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/p-limit": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-6.1.0.tgz", - "integrity": "sha512-H0jc0q1vOzlEk0TqAKXKZxdl7kX3OFUzCnNVUnq5Pc3DGo0kpeaMuPqxQn235HibwBEb0/pm9dgKTjXy66fBkg==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-6.2.0.tgz", + "integrity": "sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA==", "dependencies": { "yocto-queue": "^1.1.1" }, @@ -12824,9 +13426,9 @@ } }, "node_modules/pac-proxy-agent": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.1.0.tgz", - "integrity": "sha512-Z5FnLVVZSnX7WjBg0mhDtydeRZ1xMcATZThjySQUHqr+0ksP8kqaw23fNKkaaN/Z8gwLUs/W7xdl0I75eP2Xyw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz", + "integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==", "dependencies": { "@tootallnate/quickjs-emscripten": "^0.23.0", "agent-base": "^7.1.2", @@ -12932,6 +13534,14 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/partial-json": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/partial-json/-/partial-json-0.1.7.tgz", @@ -12994,6 +13604,14 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/path-to-regexp": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", + "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", + "engines": { + "node": ">=16" + } + }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -13013,13 +13631,13 @@ "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" }, "node_modules/pg": { - "version": "8.13.1", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.13.1.tgz", - "integrity": "sha512-OUir1A0rPNZlX//c7ksiu7crsGZTKSOXJPgtNiHGIlC9H0lO+NC6ZDYksSgBYY/thSWhnSRBv8w1lieNNGATNQ==", + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.14.0.tgz", + "integrity": "sha512-nXbVpyoaXVmdqlKEzToFf37qzyeeh7mbiXsnoWvstSqohj88yaa/I/Rq/HEVn2QPSZEuLIJa/jSpRDyzjEx4FQ==", "dependencies": { "pg-connection-string": "^2.7.0", - "pg-pool": "^3.7.0", - "pg-protocol": "^1.7.0", + "pg-pool": "^3.8.0", + "pg-protocol": "^1.8.0", "pg-types": "^2.1.0", "pgpass": "1.x" }, @@ -13067,17 +13685,17 @@ } }, "node_modules/pg-pool": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.7.0.tgz", - "integrity": "sha512-ZOBQForurqh4zZWjrgSwwAtzJ7QiRX0ovFkZr2klsen3Nm0aoh33Ls0fzfv3imeH/nw/O27cjdz5kzYJfeGp/g==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.8.0.tgz", + "integrity": "sha512-VBw3jiVm6ZOdLBTIcXLNdSotb6Iy3uOCwDGFAksZCXmi10nyRvnP2v3jl4d+IsLYRyXf6o9hIm/ZtUzlByNUdw==", "peerDependencies": { "pg": ">=8.0" } }, "node_modules/pg-protocol": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.7.0.tgz", - "integrity": "sha512-hTK/mE36i8fDDhgDFjy6xNOG+LCorxLG3WO17tku+ij6sVHXh1jQUJ8hYAnRhNla4QVD2H8er/FOjc/+EgC6yQ==" + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.8.0.tgz", + "integrity": "sha512-jvuYlEkL03NRvOoyoRktBK7+qU5kOvlAwvmrH8sr3wbLrOdVWsRxQfz8mMy9sZFsqJ1hEWNfdWKI4SAmoL+j7g==" }, "node_modules/pg-types": { "version": "4.0.2", @@ -13188,6 +13806,14 @@ "node": ">= 6" } }, + "node_modules/pkce-challenge": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-4.1.0.tgz", + "integrity": "sha512-ZBmhE1C9LcPoH9XZSdwiPtbPHZROwAnMy+kIFQVrnMCxY4Cudlz3gBOpzilgc0jOgRaiT3sIWfpMomW2ar2orQ==", + "engines": { + "node": ">=16.20.0" + } + }, "node_modules/pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", @@ -13258,18 +13884,18 @@ "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==" }, "node_modules/possible-typed-array-names": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", "peer": true, "engines": { "node": ">= 0.4" } }, "node_modules/postgres-array": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-3.0.2.tgz", - "integrity": "sha512-6faShkdFugNQCLwucjPcY5ARoW1SlbnrZjmGl0IrrqewpvxvhSLHimCVzqeuULCbG0fQv7Dtk1yDbG3xv7Veog==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-3.0.4.tgz", + "integrity": "sha512-nAUSGfSDGOaOAEGwqsRY27GPOea7CNipJPOA7lPbdEpx5Kg3qzdP0AaWC5MlhTWV9s4hFX39nomVZ+C4tnGOJQ==", "dev": true, "engines": { "node": ">=12" @@ -13324,16 +13950,16 @@ } }, "node_modules/prebuild-install": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz", - "integrity": "sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", + "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", "dependencies": { "detect-libc": "^2.0.0", "expand-template": "^2.0.3", "github-from-package": "0.0.0", "minimist": "^1.2.3", "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", + "napi-build-utils": "^2.0.0", "node-abi": "^3.3.0", "pump": "^3.0.0", "rc": "^1.2.7", @@ -13400,9 +14026,9 @@ } }, "node_modules/prebuild-install/node_modules/tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.2.tgz", + "integrity": "sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==", "dependencies": { "chownr": "^1.1.1", "mkdirp-classic": "^0.5.2", @@ -13537,6 +14163,18 @@ "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/proxy-agent": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz", @@ -13627,17 +14265,16 @@ } }, "node_modules/puppeteer-chromium-resolver/node_modules/@puppeteer/browsers": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.6.0.tgz", - "integrity": "sha512-jESwj3APl78YUWHf28s2EjL0OIxcvl1uLU6Ge68KQ9ZXNsekUcbdr9dCi6vEO8naXS18lWXCV56shVkPStzXSQ==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.8.0.tgz", + "integrity": "sha512-yTwt2KWRmCQAfhvbCRjebaSX8pV1//I0Y3g+A7f/eS7gf0l4eRJoUCvcYdVtboeU4CTOZQuqYbZNS8aBYb8ROQ==", "dependencies": { "debug": "^4.4.0", "extract-zip": "^2.0.1", "progress": "^2.0.3", "proxy-agent": "^6.5.0", - "semver": "^7.6.3", - "tar-fs": "^3.0.6", - "unbzip2-stream": "^1.4.3", + "semver": "^7.7.1", + "tar-fs": "^3.0.8", "yargs": "^17.7.2" }, "bin": { @@ -13648,12 +14285,11 @@ } }, "node_modules/puppeteer-chromium-resolver/node_modules/chromium-bidi": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.8.0.tgz", - "integrity": "sha512-uJydbGdTw0DEUjhoogGveneJVWX/9YuqkWePzMmkBYwtdAqo5d3J/ovNKFr+/2hWXYmYCr6it8mSSTIj6SS6Ug==", + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.11.0.tgz", + "integrity": "sha512-6CJWHkNRoyZyjV9Rwv2lYONZf1Xm0IuDyNq97nwSsxxP3wf5Bwy15K5rOvVKMtJ127jJBmxFUanSAOjgFRxgrA==", "dependencies": { "mitt": "3.0.1", - "urlpattern-polyfill": "10.0.0", "zod": "3.23.8" }, "peerDependencies": { @@ -13666,12 +14302,12 @@ "integrity": "sha512-XxtPuC3PGakY6PD7dG66/o8KwJ/LkH2/EKe19Dcw58w53dv4/vSQEkn/SzuyhHE2q4zPgCkxQBxus3VV4ql+Pg==" }, "node_modules/puppeteer-chromium-resolver/node_modules/puppeteer-core": { - "version": "23.10.2", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-23.10.2.tgz", - "integrity": "sha512-SEPjEbhPxRlzjGRCs8skwfnzFQj6XrZZmoMz0JIQbanj0fBpQ5HOGgyQTyh4YOW33q+461plJc5GfsQ+ErVBgQ==", + "version": "23.11.1", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-23.11.1.tgz", + "integrity": "sha512-3HZ2/7hdDKZvZQ7dhhITOUg4/wOrDRjyK2ZBllRB0ZCOi9u0cwq1ACHDjBB+nX+7+kltHjQvBRdeY7+W0T+7Gg==", "dependencies": { - "@puppeteer/browsers": "2.6.0", - "chromium-bidi": "0.8.0", + "@puppeteer/browsers": "2.6.1", + "chromium-bidi": "0.11.0", "debug": "^4.4.0", "devtools-protocol": "0.0.1367902", "typed-query-selector": "^2.12.0", @@ -13681,10 +14317,31 @@ "node": ">=18" } }, + "node_modules/puppeteer-chromium-resolver/node_modules/puppeteer-core/node_modules/@puppeteer/browsers": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.6.1.tgz", + "integrity": "sha512-aBSREisdsGH890S2rQqK82qmQYU3uFpSH8wcZWHgHzl3LfzsxAKbLNiAG9mO8v1Y0UICBeClICxPJvyr0rcuxg==", + "dependencies": { + "debug": "^4.4.0", + "extract-zip": "^2.0.1", + "progress": "^2.0.3", + "proxy-agent": "^6.5.0", + "semver": "^7.6.3", + "tar-fs": "^3.0.6", + "unbzip2-stream": "^1.4.3", + "yargs": "^17.7.2" + }, + "bin": { + "browsers": "lib/cjs/main-cli.js" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/puppeteer-chromium-resolver/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", "bin": { "semver": "bin/semver.js" }, @@ -13732,11 +14389,17 @@ ] }, "node_modules/qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "dependencies": { + "side-channel": "^1.0.6" + }, "engines": { "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/querystringify": { @@ -13763,11 +14426,6 @@ } ] }, - "node_modules/queue-tick": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", - "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==" - }, "node_modules/quick-lru": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-7.0.0.tgz", @@ -13779,6 +14437,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/raw-body": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz", @@ -13822,9 +14488,9 @@ "dev": true }, "node_modules/readable-stream": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", - "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", @@ -13837,19 +14503,19 @@ } }, "node_modules/reflect.getprototypeof": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.8.tgz", - "integrity": "sha512-B5dj6usc5dkk8uFliwjwDHM8To5/QwdKz9JcBZ8Ic4G1f0YmeeJTtE/ZTdgRFPAfxZFiUaPhZ1Jcs4qeagItGQ==", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", "peer": true, "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", - "dunder-proto": "^1.0.0", - "es-abstract": "^1.23.5", + "es-abstract": "^1.23.9", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "gopd": "^1.2.0", - "which-builtin-type": "^1.2.0" + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" }, "engines": { "node": ">= 0.4" @@ -13892,14 +14558,16 @@ } }, "node_modules/regexp.prototype.flags": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz", - "integrity": "sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", "peer": true, "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", "set-function-name": "^2.0.2" }, "engines": { @@ -13944,6 +14612,18 @@ "regjsparser": "bin/parser" } }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/repeat-string": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", @@ -14010,6 +14690,33 @@ "node": ">= 0.12" } }, + "node_modules/request/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==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/request/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==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/request/node_modules/qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "engines": { + "node": ">=0.6" + } + }, "node_modules/request/node_modules/tough-cookie": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", @@ -14045,17 +14752,20 @@ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" }, "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", "dependencies": { - "is-core-module": "^2.13.0", + "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -14108,9 +14818,9 @@ } }, "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -14136,11 +14846,35 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/router": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.1.0.tgz", + "integrity": "sha512-/m/NSLxeYEgWNtyC+WtNHCF7jbGxOibVWKnn+1Psff4dJGOfoXP+MuC/f2CwSmyiHdOIzYnYFp4W6GxWfekaLA==", + "dependencies": { + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, "node_modules/rrweb-cssom": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.7.1.tgz", "integrity": "sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==" }, + "node_modules/run-applescript": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", + "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -14169,14 +14903,15 @@ "integrity": "sha512-cLgakCUf6PedEu15t8kbsjnwIFFR2D4RfL+W3iWFJ4iac7z4B0ZI8fxy4R3J956kAI68HclCFGL8MPoUVC3qVA==" }, "node_modules/safe-array-concat": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", - "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", "peer": true, "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4", - "has-symbols": "^1.0.3", + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", "isarray": "^2.0.5" }, "engines": { @@ -14205,15 +14940,31 @@ } ] }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "peer": true, + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/safe-regex-test": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", - "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", "peer": true, "dependencies": { - "call-bind": "^1.0.6", + "call-bound": "^1.0.2", "es-errors": "^1.3.0", - "is-regex": "^1.1.4" + "is-regex": "^1.2.1" }, "engines": { "node": ">= 0.4" @@ -14246,11 +14997,74 @@ "semver": "bin/semver.js" } }, + "node_modules/send": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/send/-/send-1.1.0.tgz", + "integrity": "sha512-v67WcEouB5GxbTWL/4NeToqcZiAWEq90N888fczVArY8A79J0L4FD7vj5hm3eUMua5EpoQ59wa/oovY6TLvRUA==", + "dependencies": { + "debug": "^4.3.5", + "destroy": "^1.2.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^0.5.2", + "http-errors": "^2.0.0", + "mime-types": "^2.1.35", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/send/node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/send/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==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/send/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==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/seq-queue": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz", "integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==" }, + "node_modules/serve-static": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.1.0.tgz", + "integrity": "sha512-A3We5UfEjG8Z7VkDv6uItWw6HY2bBSBJT1KtVESn6EOoOr2jAxNhxWCLY3jDE2WcuHXByWju74ck3ZgLwL8xmA==", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.0.0" + }, + "engines": { + "node": ">= 18" + } + }, "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -14288,6 +15102,20 @@ "node": ">= 0.4" } }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "peer": true, + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -14316,9 +15144,9 @@ } }, "node_modules/sharp/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", "bin": { "semver": "bin/semver.js" }, @@ -14346,15 +15174,65 @@ } }, "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", - "peer": true, + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "dependencies": { - "call-bind": "^1.0.7", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -14515,9 +15393,9 @@ } }, "node_modules/socks": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", - "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.4.tgz", + "integrity": "sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==", "dependencies": { "ip-address": "^9.0.5", "smart-buffer": "^4.2.0" @@ -14748,12 +15626,11 @@ } }, "node_modules/streamx": { - "version": "2.21.0", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.21.0.tgz", - "integrity": "sha512-Qz6MsDZXJ6ur9u+b+4xCG18TluU7PGlRfXVAAjNiGsFrBUt/ioyLkxbFaKJygoPs+/kW4VyBj0bSj89Qu0IGyg==", + "version": "2.22.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.0.tgz", + "integrity": "sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==", "dependencies": { "fast-fifo": "^1.3.2", - "queue-tick": "^1.0.1", "text-decoder": "^1.1.0" }, "optionalDependencies": { @@ -14809,15 +15686,18 @@ } }, "node_modules/string.prototype.trim": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", - "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", "peer": true, "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", "define-properties": "^1.2.1", - "es-abstract": "^1.23.0", - "es-object-atoms": "^1.0.0" + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -14827,15 +15707,19 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", - "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", "peer": true, "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -14910,9 +15794,15 @@ } }, "node_modules/strnum": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", - "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.1.2.tgz", + "integrity": "sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ] }, "node_modules/supports-color": { "version": "7.2.0", @@ -15006,16 +15896,16 @@ } }, "node_modules/tar-fs": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.6.tgz", - "integrity": "sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.8.tgz", + "integrity": "sha512-ZoROL70jptorGAlgAYiLoBLItEKw/fUxg9BSYK/dF/GAGYFJOJJJMvjPAKDJraCXFwadD456FCuvLWgfhMsPwg==", "dependencies": { "pump": "^3.0.0", "tar-stream": "^3.1.5" }, "optionalDependencies": { - "bare-fs": "^2.1.1", - "bare-path": "^2.1.0" + "bare-fs": "^4.0.1", + "bare-path": "^3.0.0" } }, "node_modules/tar-stream": { @@ -15176,9 +16066,9 @@ } }, "node_modules/text-decoder": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.2.tgz", - "integrity": "sha512-/MDslo7ZyWTA2vnk1j7XoDVfXsGk3tp+zFEJHJGm0UjIlQifonVFwlVbQDFh8KJzTBnT8ie115TYqir6bclddA==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", + "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", "dependencies": { "b4a": "^1.6.4" } @@ -15263,9 +16153,9 @@ } }, "node_modules/ts-jest": { - "version": "29.2.5", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.2.5.tgz", - "integrity": "sha512-KD8zB2aAZrcKIdGk4OwpJggeLcH1FgrICqDSROWqlnJXGCXK4Mn6FcdK2B6670Xr73lHMG1kHw8R87A0ecZ+vA==", + "version": "29.2.6", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.2.6.tgz", + "integrity": "sha512-yTNZVZqc8lSixm+QGVFcPe6+yj7+TWZwIesuOWvfcn4B9bz5x4NDzVCQQjOs7Hfouu36aEqfEbo9Qpo+gq8dDg==", "dev": true, "dependencies": { "bs-logger": "^0.2.6", @@ -15275,7 +16165,7 @@ "json5": "^2.2.3", "lodash.memoize": "^4.1.2", "make-error": "^1.3.6", - "semver": "^7.6.3", + "semver": "^7.7.1", "yargs-parser": "^21.1.1" }, "bin": { @@ -15311,9 +16201,9 @@ } }, "node_modules/ts-jest/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -15408,31 +16298,44 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/type-is": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.0.tgz", + "integrity": "sha512-gd0sGezQYCbWSbkZr75mln4YBidWUN60+devscpLF5mtRDUpiaTvKpBNrdaCvel1NdR2k6vclXybU5fBd2i+nw==", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/typed-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", - "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", "peer": true, "dependencies": { - "call-bind": "^1.0.7", + "call-bound": "^1.0.3", "es-errors": "^1.3.0", - "is-typed-array": "^1.1.13" + "is-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" } }, "node_modules/typed-array-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", - "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", "peer": true, "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" @@ -15442,18 +16345,18 @@ } }, "node_modules/typed-array-byte-offset": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.3.tgz", - "integrity": "sha512-GsvTyUHTriq6o/bHcTd0vM7OQ9JEdlvluu9YISaA7+KzDzPaIzEeDFNkTfhdE3MYcNhNi0vq/LlegYgIs5yPAw==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", "peer": true, "dependencies": { "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13", - "reflect.getprototypeof": "^1.0.6" + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" }, "engines": { "node": ">= 0.4" @@ -15488,9 +16391,9 @@ "integrity": "sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==" }, "node_modules/typescript": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", - "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "version": "5.8.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", + "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", "peer": true, "bin": { "tsc": "bin/tsc", @@ -15522,15 +16425,18 @@ } }, "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", "peer": true, "dependencies": { - "call-bind": "^1.0.2", + "call-bound": "^1.0.3", "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -15572,7 +16478,6 @@ "version": "6.21.1", "resolved": "https://registry.npmjs.org/undici/-/undici-6.21.1.tgz", "integrity": "sha512-q/1rj5D0/zayJB2FraXdaWxbhWiNKDvu8naDT2dl1yTlvJp4BLtOcp2a5BvgGNQpYYJzau7tf1WgKv3b+7mqpQ==", - "license": "MIT", "engines": { "node": ">=18.17" } @@ -15662,9 +16567,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", - "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", "dev": true, "funding": [ { @@ -15682,7 +16587,7 @@ ], "dependencies": { "escalade": "^3.2.0", - "picocolors": "^1.1.0" + "picocolors": "^1.1.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -15718,6 +16623,14 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/uuid": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", @@ -15744,6 +16657,14 @@ "node": ">=10.12.0" } }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/vectordb": { "version": "0.4.20", "resolved": "https://registry.npmjs.org/vectordb/-/vectordb-0.4.20.tgz", @@ -15752,6 +16673,7 @@ "x64", "arm64" ], + "deprecated": "Use @lancedb/lancedb instead.", "os": [ "darwin", "linux", @@ -15857,9 +16779,9 @@ } }, "node_modules/whatwg-url": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.1.0.tgz", - "integrity": "sha512-jlf/foYIKywAt3x/XWKZ/3rz8OSJPiWktjmk891alJUEjiVxKX9LEO92qH3hv4aJ0mN3MWPvGMCy8jQi95xK4w==", + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.1.1.tgz", + "integrity": "sha512-mDGf9diDad/giZ/Sm9Xi2YcyzaFpbdLpJPr+E9fSkyQ7KpQD4SdFcugkRQYzhmfI4KeV4Qpnn2sKPdo+kmsgRQ==", "dependencies": { "tr46": "^5.0.0", "webidl-conversions": "^7.0.0" @@ -15883,16 +16805,16 @@ } }, "node_modules/which-boxed-primitive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.0.tgz", - "integrity": "sha512-Ei7Miu/AXe2JJ4iNF5j/UphAgRoma4trE6PtisM09bPygb3egMH3YLW/befsWb1A1AxvNSFidOFTB18XtnIIng==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", "peer": true, "dependencies": { "is-bigint": "^1.1.0", - "is-boolean-object": "^1.2.0", - "is-number-object": "^1.1.0", - "is-string": "^1.1.0", - "is-symbol": "^1.1.0" + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" }, "engines": { "node": ">= 0.4" @@ -15902,24 +16824,24 @@ } }, "node_modules/which-builtin-type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.0.tgz", - "integrity": "sha512-I+qLGQ/vucCby4tf5HsLmGueEla4ZhwTBSqaooS+Y0BuxN4Cp+okmGuV+8mXZ84KDI9BA+oklo+RzKg0ONdSUA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", "peer": true, "dependencies": { - "call-bind": "^1.0.7", + "call-bound": "^1.0.2", "function.prototype.name": "^1.1.6", "has-tostringtag": "^1.0.2", "is-async-function": "^2.0.0", - "is-date-object": "^1.0.5", + "is-date-object": "^1.1.0", "is-finalizationregistry": "^1.1.0", "is-generator-function": "^1.0.10", - "is-regex": "^1.1.4", + "is-regex": "^1.2.1", "is-weakref": "^1.0.2", "isarray": "^2.0.5", - "which-boxed-primitive": "^1.0.2", + "which-boxed-primitive": "^1.1.0", "which-collection": "^1.0.2", - "which-typed-array": "^1.1.15" + "which-typed-array": "^1.1.16" }, "engines": { "node": ">= 0.4" @@ -15947,15 +16869,17 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.16", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.16.tgz", - "integrity": "sha512-g+N+GAWiRj66DngFwHvISJd+ITsyphZvD1vChfVg6cEdnzy53GzB3oy0fUNlvhz7H7+MiqhYr26qxQShCpKTTQ==", + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", "peer": true, "dependencies": { "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" }, "engines": { @@ -16159,9 +17083,9 @@ } }, "node_modules/ws": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==", "engines": { "node": ">=10.0.0" }, @@ -16221,9 +17145,9 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/yaml": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.1.tgz", - "integrity": "sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz", + "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==", "bin": { "yaml": "bin.mjs" }, @@ -16266,9 +17190,9 @@ } }, "node_modules/yocto-queue": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", - "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.0.tgz", + "integrity": "sha512-KHBC7z61OJeaMGnF3wqNZj+GGNXOyypZviiKpQeiHirG5Ib1ImwcLBH70rbMSkKfSmUNBsdf2PwaEJtKvgmkNw==", "engines": { "node": ">=12.20" }, @@ -16283,6 +17207,14 @@ "funding": { "url": "https://github.com/sponsors/colinhacks" } + }, + "node_modules/zod-to-json-schema": { + "version": "3.24.3", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.3.tgz", + "integrity": "sha512-HIAfWdYIt1sssHfYZFCXp4rU1w2r8hVVXYIlmoa0r0gABLs5di3RCqPU5DDROogVz1pAdYBaz7HK5n9pSUNs3A==", + "peerDependencies": { + "zod": "^3.24.1" + } } } } diff --git a/core/protocol/passThrough.ts b/core/protocol/passThrough.ts index 7d0d51fc047..6470c1ea858 100644 --- a/core/protocol/passThrough.ts +++ b/core/protocol/passThrough.ts @@ -53,7 +53,6 @@ export const WEBVIEW_TO_CORE_PASS_THROUGH: (keyof ToCoreFromWebviewProtocol)[] = "indexing/reindex", "indexing/abort", "indexing/setPaused", - "docs/getSuggestedDocs", "docs/initStatuses", "docs/getDetails", // @@ -83,7 +82,6 @@ export const CORE_TO_WEBVIEW_PASS_THROUGH: (keyof ToWebviewFromCoreProtocol)[] = "setTTSActive", "getWebviewHistoryLength", "getCurrentSessionId", - "docs/suggestions", "didCloseFiles", "didSelectOrganization", ]; diff --git a/core/protocol/webview.ts b/core/protocol/webview.ts index eb587ae6093..3ca23639353 100644 --- a/core/protocol/webview.ts +++ b/core/protocol/webview.ts @@ -38,6 +38,5 @@ export type ToWebviewFromIdeOrCoreProtocol = { setTTSActive: [boolean, void]; getWebviewHistoryLength: [undefined, number]; getCurrentSessionId: [undefined, string]; - "docs/suggestions": [PackageDocsResult[], void]; "jetbrains/setColors": [Record, void]; }; diff --git a/extensions/intellij/src/main/kotlin/com/github/continuedev/continueintellijextension/constants/MessageTypes.kt b/extensions/intellij/src/main/kotlin/com/github/continuedev/continueintellijextension/constants/MessageTypes.kt index 945fb218c07..2cc27414d4f 100644 --- a/extensions/intellij/src/main/kotlin/com/github/continuedev/continueintellijextension/constants/MessageTypes.kt +++ b/extensions/intellij/src/main/kotlin/com/github/continuedev/continueintellijextension/constants/MessageTypes.kt @@ -70,7 +70,6 @@ class MessageTypes { "setTTSActive", "getWebviewHistoryLength", "getCurrentSessionId", - "docs/suggestions", "didCloseFiles", "didSelectOrganization" ) @@ -123,7 +122,6 @@ class MessageTypes { "indexing/reindex", "indexing/abort", "indexing/setPaused", - "docs/getSuggestedDocs", "docs/initStatuses", "docs/getDetails", // diff --git a/extensions/vscode/package-lock.json b/extensions/vscode/package-lock.json index a134a455754..a87a02c5a98 100644 --- a/extensions/vscode/package-lock.json +++ b/extensions/vscode/package-lock.json @@ -106,7 +106,7 @@ "@aws-sdk/client-sagemaker-runtime": "^3.621.0", "@aws-sdk/credential-providers": "^3.620.1", "@continuedev/config-types": "^1.0.13", - "@continuedev/config-yaml": "^1.0.57", + "@continuedev/config-yaml": "^1.0.60", "@continuedev/fetch": "^1.0.4", "@continuedev/llm-info": "^1.0.2", "@continuedev/openai-adapters": "^1.0.10", diff --git a/extensions/vscode/scripts/esbuild.js b/extensions/vscode/scripts/esbuild.js index e44fc60aff4..d8a9d4e6811 100644 --- a/extensions/vscode/scripts/esbuild.js +++ b/extensions/vscode/scripts/esbuild.js @@ -1,6 +1,7 @@ -const esbuild = require("esbuild"); const fs = require("fs"); +const esbuild = require("esbuild"); + const flags = process.argv.slice(2); const esbuildConfig = { @@ -59,9 +60,9 @@ const esbuildConfig = { // The watcher automatically notices changes to source files // so the only thing it needs to be notified about is if the // output file gets removed. - if (fs.existsSync (outFile)) { - console.log("VS Code Extension esbuild up to date"); - return; + if (fs.existsSync(outFile)) { + console.log("VS Code Extension esbuild up to date"); + return; } fs.watchFile(outFile, (current, previous) => { diff --git a/gui/src/components/dialogs/AddDocsDialog.tsx b/gui/src/components/dialogs/AddDocsDialog.tsx index eb3d3bcbb0b..5414f8a191a 100644 --- a/gui/src/components/dialogs/AddDocsDialog.tsx +++ b/gui/src/components/dialogs/AddDocsDialog.tsx @@ -1,26 +1,17 @@ -import { - CheckIcon, - InformationCircleIcon, - PencilIcon, - PlusIcon, -} from "@heroicons/react/24/outline"; -import { IndexingStatus, PackageDocsResult, SiteIndexingConfig } from "core"; -import preIndexedDocs from "core/indexing/docs/preIndexedDocs"; +import { CheckIcon, InformationCircleIcon } from "@heroicons/react/24/outline"; +import { IndexingStatus, SiteIndexingConfig } from "core"; import { usePostHog } from "posthog-js/react"; import { useContext, useLayoutEffect, useMemo, useRef, useState } from "react"; import { useDispatch } from "react-redux"; import { Input, SecondaryButton } from ".."; import { IdeMessengerContext } from "../../context/IdeMessenger"; import { useAppSelector } from "../../redux/hooks"; -import { updateConfig } from "../../redux/slices/configSlice"; import { updateIndexingStatus } from "../../redux/slices/indexingSlice"; import { setDialogMessage, setShowDialog } from "../../redux/slices/uiSlice"; -import FileIcon from "../FileIcon"; import { ToolTip } from "../gui/Tooltip"; import DocsIndexingPeeks from "../indexing/DocsIndexingPeeks"; function AddDocsDialog() { - const config = useAppSelector((store) => store.config.config); const posthog = usePostHog(); const dispatch = useDispatch(); @@ -42,36 +33,6 @@ function AddDocsDialog() { ); }, [indexingStatuses]); - const docsSuggestions = useAppSelector((store) => store.misc.docsSuggestions); - const configDocs = useAppSelector((store) => store.config.config.docs); - - const sortedDocsSuggestions = useMemo(() => { - const docsFromConfig = configDocs ?? []; - // Don't show suggestions that are already in the config, indexing, and/or pre-indexed - const filtered = docsSuggestions.filter((sug) => { - const startUrl = sug.details?.docsLink; - return ( - !docsFromConfig.find((d) => d.startUrl === startUrl) && - !docsIndexingStatuses.find((s) => s.id === startUrl) && - (startUrl ? !preIndexedDocs[startUrl] : true) - ); - }); - - filtered.sort((a, b) => { - const rank = (result: PackageDocsResult) => { - if (result.error) { - return 2; - } else if (result.details?.docsLinkWarning) { - return 1; - } else { - return 0; - } - }; - return rank(a) - rank(b); - }); - return filtered; - }, [docsSuggestions, configDocs, docsIndexingStatuses]); - const isFormValid = startUrl && title; useLayoutEffect(() => { @@ -118,59 +79,6 @@ function AddDocsDialog() { ); } - const handleSelectSuggestion = (docsResult: PackageDocsResult) => { - if (docsResult.error || !docsResult.details) { - setTitle(docsResult.packageInfo.name); - setStartUrl(""); - urlRef.current?.focus(); - return; - } - const suggestedTitle = - docsResult.details.title ?? docsResult.packageInfo.name; - - if (docsResult.details?.docsLinkWarning) { - setTitle(suggestedTitle); - setStartUrl(docsResult.details.docsLink); - urlRef.current?.focus(); - return; - } - const siteIndexingConfig: SiteIndexingConfig = { - startUrl: docsResult.details.docsLink, - title: suggestedTitle, - faviconUrl: undefined, - }; - - ideMessenger.post("context/addDocs", siteIndexingConfig); - - posthog.capture("add_docs_gui", { url: startUrl }); - - // Optimistic status update - dispatch( - updateConfig({ - ...config, - docs: [ - ...(config.docs?.filter( - (doc) => doc.startUrl !== docsResult.details.docsLink, - ) ?? []), - { - startUrl: docsResult.details.docsLink, - title: suggestedTitle, - faviconUrl: undefined, - }, - ], - }), - updateIndexingStatus({ - type: "docs", - description: "Initializing", - id: docsResult.details.docsLink, - progress: 0, - status: "indexing", - title: docsResult.details.title ?? docsResult.packageInfo.name, - url: docsResult.details.docsLink, - }), - ); - }; - return (
@@ -179,91 +87,10 @@ function AddDocsDialog() {

For the @docs context provider

- {!!sortedDocsSuggestions.length && ( -

Suggestions

- )} -
- {sortedDocsSuggestions.map((docsResult) => { - const { error, details } = docsResult; - const { language, name, version } = docsResult.packageInfo; - const id = `${language}-${name}-${version}`; - return ( -
{ - handleSelectSuggestion(docsResult); - }} - > -
- {error || details?.docsLinkWarning ? ( -
- - - This may not be a docs page - -
- ) : ( - - )} -
-
-
- -
- {name} -
-
- {error || !details?.docsLink ? ( - - No docs link found - - ) : ( -
- {/*
- -
*/} -

{ - e.stopPropagation(); - ideMessenger.post("openUrl", details.docsLink); - }} - > - {details.docsLink} -

-
- )} -
-
{ - e.stopPropagation(); - }} - > - - -

{`Version: ${version}`}

-

{`Found in ${docsResult.packageInfo.packageFile.path}`}

-
-
-
- ); - })} -
-
-
{!!args.length ? ( diff --git a/gui/src/redux/thunks/callTool.ts b/gui/src/redux/thunks/callTool.ts index 75b075288cc..34ae003905a 100644 --- a/gui/src/redux/thunks/callTool.ts +++ b/gui/src/redux/thunks/callTool.ts @@ -57,10 +57,11 @@ export const callTool = createAsyncThunk( toolCallId: toolCallState.toolCallId, toolOutput: [ { - name: "Tool Call Failed", + icon: "problems", + name: "Tool Call Error", description: "Tool Call Failed", content: `The tool call failed with the message:\n\n${result.error}\n\nPlease try something else or request further instructions.`, - hidden: true, + hidden: false, }, ], }), From acb436e0ebfe094e51d691b2adbe8649e991e31f Mon Sep 17 00:00:00 2001 From: tomasz-io Date: Thu, 20 Mar 2025 15:57:50 -0700 Subject: [PATCH 006/112] improv: simplify --- gui/src/pages/config/AccountManagement.tsx | 160 +++++++++++++++++++++ 1 file changed, 160 insertions(+) create mode 100644 gui/src/pages/config/AccountManagement.tsx diff --git a/gui/src/pages/config/AccountManagement.tsx b/gui/src/pages/config/AccountManagement.tsx new file mode 100644 index 00000000000..95214278b1d --- /dev/null +++ b/gui/src/pages/config/AccountManagement.tsx @@ -0,0 +1,160 @@ +import { Listbox, Transition } from "@headlessui/react"; +import { + ArrowTopRightOnSquareIcon, + ChevronUpDownIcon, + PlusCircleIcon, +} from "@heroicons/react/24/outline"; +import { Fragment, useContext, useEffect, useState } from "react"; +import AssistantIcon from "../../components/modelSelection/platform/AssistantIcon"; +import { useAuth } from "../../context/Auth"; +import { IdeMessengerContext } from "../../context/IdeMessenger"; +import { useNavigationListener } from "../../hooks/useNavigationListener"; +import { useAppDispatch } from "../../redux/hooks"; +import { selectProfileThunk } from "../../redux/thunks/profileAndOrg"; +import { ScopeSelect } from "./ScopeSelect"; + +export function AccountManagement() { + useNavigationListener(); + const dispatch = useAppDispatch(); + const ideMessenger = useContext(IdeMessengerContext); + + const { session, login, profiles, selectedProfile, selectedOrganization } = + useAuth(); + + const changeProfileId = (id: string) => { + dispatch(selectProfileThunk(id)); + }; + + const [hubEnabled, setHubEnabled] = useState(false); + + useEffect(() => { + ideMessenger.ide.getIdeSettings().then(({ continueTestEnvironment }) => { + setHubEnabled(continueTestEnvironment === "production"); + }); + }, [ideMessenger]); + + function handleOpenConfig() { + if (!selectedProfile) { + return; + } + ideMessenger.post("config/openProfile", { + profileId: selectedProfile.id, + }); + } + + return ( +
+
+

Configuration

+ {hubEnabled ? ( + // Hub: show org selector + session && ( +
+ {`Organization`} + +
+ ) + ) : ( + // Continue for teams: show org text +
You are using Continue for Teams
+ )} + + {profiles ? ( + <> +
+
+ {`${hubEnabled ? "Assistant" : "Profile"}`} +
+ + {({ open }) => ( +
+ +
+ {selectedProfile && ( + + )} + + {selectedProfile?.title ?? "No Assistant Selected"} + +
+
+
+
+ + + + {profiles.map((option, idx) => ( + + + + {option.title} + + + ))} + {hubEnabled && ( + { + if (session) { + ideMessenger.post("controlPlane/openUrl", { + path: "new", + orgSlug: selectedOrganization?.slug, + }); + } else { + login(false); + } + }} + > + + + Create new Assistant + + + )} + + + + {selectedProfile && ( +
+ + + {hubEnabled + ? "Open Assistant configuration" + : "View Workspace"} + +
+ )} +
+ )} +
+
+ + ) : ( +
Loading...
+ )} +
+
+ ); +} From 6c2bf04006d31392741082f9c67b4f9625ed660f Mon Sep 17 00:00:00 2001 From: tomasz-io Date: Thu, 20 Mar 2025 16:02:36 -0700 Subject: [PATCH 007/112] improv: split up components --- gui/src/pages/config/AccountManagement.tsx | 12 +- gui/src/pages/config/index.tsx | 173 +-------------------- 2 files changed, 7 insertions(+), 178 deletions(-) diff --git a/gui/src/pages/config/AccountManagement.tsx b/gui/src/pages/config/AccountManagement.tsx index 95214278b1d..ade570d80d4 100644 --- a/gui/src/pages/config/AccountManagement.tsx +++ b/gui/src/pages/config/AccountManagement.tsx @@ -4,7 +4,7 @@ import { ChevronUpDownIcon, PlusCircleIcon, } from "@heroicons/react/24/outline"; -import { Fragment, useContext, useEffect, useState } from "react"; +import { Fragment, useContext } from "react"; import AssistantIcon from "../../components/modelSelection/platform/AssistantIcon"; import { useAuth } from "../../context/Auth"; import { IdeMessengerContext } from "../../context/IdeMessenger"; @@ -13,7 +13,7 @@ import { useAppDispatch } from "../../redux/hooks"; import { selectProfileThunk } from "../../redux/thunks/profileAndOrg"; import { ScopeSelect } from "./ScopeSelect"; -export function AccountManagement() { +export function AccountManagement({ hubEnabled }: { hubEnabled: boolean }) { useNavigationListener(); const dispatch = useAppDispatch(); const ideMessenger = useContext(IdeMessengerContext); @@ -25,14 +25,6 @@ export function AccountManagement() { dispatch(selectProfileThunk(id)); }; - const [hubEnabled, setHubEnabled] = useState(false); - - useEffect(() => { - ideMessenger.ide.getIdeSettings().then(({ continueTestEnvironment }) => { - setHubEnabled(continueTestEnvironment === "production"); - }); - }, [ideMessenger]); - function handleOpenConfig() { if (!selectedProfile) { return; diff --git a/gui/src/pages/config/index.tsx b/gui/src/pages/config/index.tsx index 14128ffdae9..3d975f41057 100644 --- a/gui/src/pages/config/index.tsx +++ b/gui/src/pages/config/index.tsx @@ -1,24 +1,16 @@ import { ModelRole } from "@continuedev/config-yaml"; -import { Listbox, Transition } from "@headlessui/react"; -import { - ArrowTopRightOnSquareIcon, - CheckIcon, - ChevronUpDownIcon, - PlusCircleIcon, - XMarkIcon, -} from "@heroicons/react/24/outline"; +import { CheckIcon, XMarkIcon } from "@heroicons/react/24/outline"; import { ModelDescription } from "core"; import { SharedConfigSchema, modifyAnyConfigWithSharedConfig, } from "core/config/sharedConfig"; -import { Fragment, useContext, useEffect, useState } from "react"; +import { useContext, useEffect, useState } from "react"; import { useNavigate } from "react-router-dom"; import { Input } from "../../components"; import NumberInput from "../../components/gui/NumberInput"; import { Select } from "../../components/gui/Select"; import ToggleSwitch from "../../components/gui/Switch"; -import AssistantIcon from "../../components/modelSelection/platform/AssistantIcon"; import PageHeader from "../../components/PageHeader"; import { useAuth } from "../../context/Auth"; import { IdeMessengerContext } from "../../context/IdeMessenger"; @@ -29,11 +21,10 @@ import { setDefaultModel, updateConfig, } from "../../redux/slices/configSlice"; -import { selectProfileThunk } from "../../redux/thunks/profileAndOrg"; import { getFontSize, isJetBrains } from "../../util"; import { AccountButton } from "./AccountButton"; +import { AccountManagement } from "./AccountManagement"; import ModelRoleSelector from "./ModelRoleSelector"; -import { ScopeSelect } from "./ScopeSelect"; function ConfigPage() { useNavigationListener(); @@ -41,19 +32,7 @@ function ConfigPage() { const navigate = useNavigate(); const ideMessenger = useContext(IdeMessengerContext); - const { - session, - logout, - login, - profiles, - selectedProfile, - controlServerBetaEnabled, - selectedOrganization, - } = useAuth(); - - const changeProfileId = (id: string) => { - dispatch(selectProfileThunk(id)); - }; + const { selectedProfile, controlServerBetaEnabled } = useAuth(); const [hubEnabled, setHubEnabled] = useState(false); useEffect(() => { @@ -62,15 +41,6 @@ function ConfigPage() { }); }, [ideMessenger]); - function handleOpenConfig() { - if (!selectedProfile) { - return; - } - ideMessenger.post("config/openProfile", { - profileId: selectedProfile.id, - }); - } - // NOTE Hub takes priority over Continue for Teams // Since teams will be moving to hub, not vice versa @@ -161,23 +131,6 @@ function ConfigPage() { setFormDisableAutocomplete(disableAutocompleteInFiles); }, [disableAutocompleteInFiles]); - // Workspace prompts - const promptPath = config.experimental?.promptPath || ""; - const [formPromptPath, setFormPromptPath] = useState(promptPath); - const cancelChangePromptPath = () => { - setFormPromptPath(promptPath); - }; - const handleSubmitPromptPath = () => { - handleUpdate({ - promptPath: formPromptPath || "", - }); - }; - - useEffect(() => { - // Necessary so that reformatted/trimmed values don't cause dirty state - setFormPromptPath(promptPath); - }, [promptPath]); - const jetbrains = isJetBrains(); return ( @@ -190,123 +143,7 @@ function ConfigPage() { />
-
-
-

Configuration

- {hubEnabled ? ( - // Hub: show org selector - session && ( -
- {`Organization`} - -
- ) - ) : ( - // Continue for teams: show org text -
You are using Continue for Teams
- )} - - {profiles ? ( - <> -
-
- {`${hubEnabled ? "Assistant" : "Profile"}`} -
- - {({ open }) => ( -
- -
- {selectedProfile && ( - - )} - - {selectedProfile?.title ?? - "No Assistant Selected"} - -
-
-
-
- - - - {profiles.map((option, idx) => ( - - - - {option.title} - - - ))} - {hubEnabled && ( - { - if (session) { - ideMessenger.post("controlPlane/openUrl", { - path: "new", - orgSlug: selectedOrganization?.slug, - }); - } else { - login(false); - } - }} - > - - - Create new Assistant - - - )} - - - - {selectedProfile && ( -
- - - {hubEnabled - ? "Open Assistant configuration" - : "View Workspace"} - -
- )} -
- )} -
-
- - ) : ( -
Loading...
- )} -
-
+ {/* Model Roles as a separate section */}
From 1d1f705f7dfb1d517b90e03b82856e625f3f323e Mon Sep 17 00:00:00 2001 From: Patrick Erichsen Date: Thu, 20 Mar 2025 16:58:29 -0700 Subject: [PATCH 008/112] feat: move .prompts into slash cmd --- core/config/load.ts | 3 - core/config/yaml/loadYaml.ts | 2 - .../providers/PromptFilesContextProvider.ts | 57 ------------ .../v1/slashCommandFromPromptFile.ts | 10 +-- core/util/paths.ts | 2 +- .../ConversationStarterCard.tsx | 8 +- .../ConversationStarterCards.tsx | 53 ++++++++++-- .../components/ConversationStarters/utils.ts | 17 +++- gui/src/components/mainInput/MentionList.tsx | 6 +- gui/src/components/mainInput/TipTapEditor.tsx | 2 +- gui/src/components/mainInput/getSuggestion.ts | 53 +++++++----- gui/src/pages/config/ModelRoleSelector.tsx | 86 ++++++++++--------- gui/src/pages/gui/EmptyChatBody.tsx | 4 +- gui/src/redux/selectors/index.ts | 2 +- 14 files changed, 153 insertions(+), 152 deletions(-) delete mode 100644 core/context/providers/PromptFilesContextProvider.ts diff --git a/core/config/load.ts b/core/config/load.ts index d9c7894049d..0216894e171 100644 --- a/core/config/load.ts +++ b/core/config/load.ts @@ -45,7 +45,6 @@ import ContinueProxyContextProvider from "../context/providers/ContinueProxyCont import CustomContextProviderClass from "../context/providers/CustomContextProvider"; import FileContextProvider from "../context/providers/FileContextProvider"; import { contextProviderClassFromName } from "../context/providers/index"; -import PromptFilesContextProvider from "../context/providers/PromptFilesContextProvider"; import { useHub } from "../control-plane/env"; import { allEmbeddingsProviders } from "../indexing/allEmbeddingsProviders"; import { BaseLLM } from "../llm"; @@ -401,8 +400,6 @@ async function intermediateToFinalConfig( ...(!config.disableIndexing ? [new CodebaseContextProvider(codebaseContextParams)] : []), - // Add prompt files provider if enabled - ...(loadPromptFiles ? [new PromptFilesContextProvider({})] : []), ]; const DEFAULT_CONTEXT_PROVIDERS_TITLES = DEFAULT_CONTEXT_PROVIDERS.map( diff --git a/core/config/yaml/loadYaml.ts b/core/config/yaml/loadYaml.ts index a11e1ab447e..ae1f13f58bf 100644 --- a/core/config/yaml/loadYaml.ts +++ b/core/config/yaml/loadYaml.ts @@ -28,7 +28,6 @@ import CodebaseContextProvider from "../../context/providers/CodebaseContextProv import DocsContextProvider from "../../context/providers/DocsContextProvider"; import FileContextProvider from "../../context/providers/FileContextProvider"; import { contextProviderClassFromName } from "../../context/providers/index"; -import PromptFilesContextProvider from "../../context/providers/PromptFilesContextProvider"; import { ControlPlaneClient } from "../../control-plane/client"; import { allEmbeddingsProviders } from "../../indexing/allEmbeddingsProviders"; import FreeTrial from "../../llm/llms/FreeTrial"; @@ -333,7 +332,6 @@ async function configYamlToContinueConfig( const DEFAULT_CONTEXT_PROVIDERS = [ new FileContextProvider({}), new CodebaseContextProvider(codebaseContextParams), - new PromptFilesContextProvider({}), ]; const DEFAULT_CONTEXT_PROVIDERS_TITLES = DEFAULT_CONTEXT_PROVIDERS.map( diff --git a/core/context/providers/PromptFilesContextProvider.ts b/core/context/providers/PromptFilesContextProvider.ts deleted file mode 100644 index c3b4381f401..00000000000 --- a/core/context/providers/PromptFilesContextProvider.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { BaseContextProvider } from ".."; -import { - ContextItem, - ContextProviderDescription, - ContextProviderExtras, - ContextSubmenuItem, - LoadSubmenuItemsArgs, -} from "../../"; -import { getAllPromptFiles } from "../../promptFiles/v2/getPromptFiles"; -import { parsePreamble } from "../../promptFiles/v2/parse"; -import { renderPromptFileV2 } from "../../promptFiles/v2/renderPromptFile"; - -class PromptFilesContextProvider extends BaseContextProvider { - static description: ContextProviderDescription = { - title: "prompt-files", - displayTitle: "Prompt Files", - description: ".prompt files", - type: "submenu", - }; - - async getContextItems( - query: string, - extras: ContextProviderExtras, - ): Promise { - const rawContent = await extras.ide.readFile(query); - const preamble = parsePreamble(query, rawContent); - const [contextItems, body] = await renderPromptFileV2(rawContent, extras); - return [ - ...contextItems, - { - content: body, - name: preamble.name, - description: preamble.description, - }, - ]; - } - - async loadSubmenuItems( - args: LoadSubmenuItemsArgs, - ): Promise { - const promptFiles = await getAllPromptFiles( - args.ide, - args.config.experimental?.promptPath, - // Note, NOT checking v1 default folder here, deprecated for context provider - ); - return promptFiles.map((file) => { - const preamble = parsePreamble(file.path, file.content); - return { - id: file.path, - title: preamble.name, - description: preamble.description, - }; - }); - } -} - -export default PromptFilesContextProvider; diff --git a/core/promptFiles/v1/slashCommandFromPromptFile.ts b/core/promptFiles/v1/slashCommandFromPromptFile.ts index 833955d0d82..f051dfe593e 100644 --- a/core/promptFiles/v1/slashCommandFromPromptFile.ts +++ b/core/promptFiles/v1/slashCommandFromPromptFile.ts @@ -53,12 +53,10 @@ export function slashCommandFromPromptFileV1( path: string, content: string, ): SlashCommand | null { - const { name, description, systemMessage, prompt, version } = - parsePromptFileV1V2(path, content); - - if (version !== 1) { - return null; - } + const { name, description, systemMessage, prompt } = parsePromptFileV1V2( + path, + content, + ); return { name, diff --git a/core/util/paths.ts b/core/util/paths.ts index 3bc2ee3cff3..0fa64d1094c 100644 --- a/core/util/paths.ts +++ b/core/util/paths.ts @@ -2,10 +2,10 @@ import * as fs from "fs"; import * as os from "os"; import * as path from "path"; +import { DevEventName } from "@continuedev/config-yaml"; import * as JSONC from "comment-json"; import dotenv from "dotenv"; -import { DevEventName } from "@continuedev/config-yaml"; import { IdeType, SerializedContinueConfig } from "../"; import { defaultConfig, defaultConfigJetBrains } from "../config/default"; import Types from "../config/types"; diff --git a/gui/src/components/ConversationStarters/ConversationStarterCard.tsx b/gui/src/components/ConversationStarters/ConversationStarterCard.tsx index 6714287c1c6..35a205481c4 100644 --- a/gui/src/components/ConversationStarters/ConversationStarterCard.tsx +++ b/gui/src/components/ConversationStarters/ConversationStarterCard.tsx @@ -20,13 +20,13 @@ export function ConversationStarterCard({ backgroundColor: vscInputBackground, }} > -
+
- +
-
{command.name}
-
{command.description}
+
{command.name}
+
{command.description}
diff --git a/gui/src/components/ConversationStarters/ConversationStarterCards.tsx b/gui/src/components/ConversationStarters/ConversationStarterCards.tsx index f3dcda317e4..69020dae50e 100644 --- a/gui/src/components/ConversationStarters/ConversationStarterCards.tsx +++ b/gui/src/components/ConversationStarters/ConversationStarterCards.tsx @@ -1,18 +1,28 @@ import { SlashCommandDescription } from "core"; +import { useState } from "react"; import { useAppDispatch, useAppSelector } from "../../redux/hooks"; import { setMainEditorContentTrigger } from "../../redux/slices/sessionSlice"; import { getParagraphNodeFromString } from "../mainInput/utils"; import { ConversationStarterCard } from "./ConversationStarterCard"; import { isDeprecatedCommandName } from "./utils"; +const NUM_CARDS_TO_RENDER_COLLAPSED = 3; + export function ConversationStarterCards() { const dispatch = useAppDispatch(); - const slashCommands = useAppSelector( - (state) => state.config.config.slashCommands, - ); + const [isExpanded, setIsExpanded] = useState(false); + const slashCommands = + useAppSelector((state) => state.config.config.slashCommands) ?? []; const filteredSlashCommands = slashCommands?.filter(isDeprecatedCommandName); + const numFilteredSlashCommands = filteredSlashCommands.length; + const displayedCommands = isExpanded + ? filteredSlashCommands + : filteredSlashCommands.slice(0, NUM_CARDS_TO_RENDER_COLLAPSED); + const hasMoreCommands = + numFilteredSlashCommands > NUM_CARDS_TO_RENDER_COLLAPSED; + function onClick(command: SlashCommandDescription) { if (command.prompt) { dispatch( @@ -21,7 +31,38 @@ export function ConversationStarterCards() { } } - return filteredSlashCommands?.map((command) => ( - - )); + function handleToggleExpand() { + setIsExpanded(!isExpanded); + } + + if (!filteredSlashCommands || filteredSlashCommands.length === 0) { + return null; + } + + return ( +
+

Prompts

+ +
+ {displayedCommands.map((command, i) => ( + + ))} +
+ + {hasMoreCommands && ( +

+ {isExpanded + ? "Show less" + : `Show ${numFilteredSlashCommands - NUM_CARDS_TO_RENDER_COLLAPSED} more...`} +

+ )} +
+ ); } diff --git a/gui/src/components/ConversationStarters/utils.ts b/gui/src/components/ConversationStarters/utils.ts index b1ca8859c1d..aab6cb4145c 100644 --- a/gui/src/components/ConversationStarters/utils.ts +++ b/gui/src/components/ConversationStarters/utils.ts @@ -1,12 +1,17 @@ import { SlashCommandDescription } from "core"; - -const DEPRECATED_SLASH_COMMAND_NAMES = ["share", "cmd"]; +import { + defaultSlashCommandsJetBrains, + defaultSlashCommandsVscode, +} from "core/config/default"; +import { isJetBrains } from "../../util"; /** * The commands filtered here are currently inserted into the slash commands array during * intermediary config loading, but once we get the actual prompts for an assistant, * they are overwritten. * + * Additionally, these default commands are all deprecated. + * * If we don't manually filter them out, then they are displayed in the UI * while the assistant is still loading. * @@ -14,5 +19,11 @@ const DEPRECATED_SLASH_COMMAND_NAMES = ["share", "cmd"]; * this function can be removed. */ export function isDeprecatedCommandName(command: SlashCommandDescription) { - return !DEPRECATED_SLASH_COMMAND_NAMES.includes(command.name); + const defaultCommands = isJetBrains() + ? defaultSlashCommandsJetBrains + : defaultSlashCommandsVscode; + + return !defaultCommands.find( + (defaultCommand) => defaultCommand.name === command.name, + ); } diff --git a/gui/src/components/mainInput/MentionList.tsx b/gui/src/components/mainInput/MentionList.tsx index 94324b75eab..5ba1bcca4a8 100644 --- a/gui/src/components/mainInput/MentionList.tsx +++ b/gui/src/components/mainInput/MentionList.tsx @@ -3,9 +3,9 @@ import { ArrowUpOnSquareIcon, AtSymbolIcon, Bars3BottomLeftIcon, - BoltIcon, BookOpenIcon, BugAntIcon, + ChatBubbleLeftIcon, CircleStackIcon, CodeBracketIcon, CommandLineIcon, @@ -88,7 +88,8 @@ export function getIconFromDropdownItem( id: string | undefined, type: ComboBoxItemType, ) { - const typeIcon = type === "contextProvider" ? AtSymbolIcon : BoltIcon; + const typeIcon = + type === "contextProvider" ? AtSymbolIcon : ChatBubbleLeftIcon; return id ? (ICONS_FOR_DROPDOWN[id] ?? typeIcon) : typeIcon; } @@ -506,7 +507,6 @@ const MentionList = forwardRef((props: MentionListProps, ref) => { ) : ( No results )} - {/* */} )} diff --git a/gui/src/components/mainInput/TipTapEditor.tsx b/gui/src/components/mainInput/TipTapEditor.tsx index 49dc3ce847a..3849ecd3fb7 100644 --- a/gui/src/components/mainInput/TipTapEditor.tsx +++ b/gui/src/components/mainInput/TipTapEditor.tsx @@ -565,7 +565,7 @@ function TipTapEditor(props: TipTapEditorProps) { } return historyLength === 0 - ? "Ask anything, '@' to add context" + ? "Ask anything, '/' for prompts, '@' to add context" : "Ask a follow-up"; } diff --git a/gui/src/components/mainInput/getSuggestion.ts b/gui/src/components/mainInput/getSuggestion.ts index ecc7b835e32..ab107f14636 100644 --- a/gui/src/components/mainInput/getSuggestion.ts +++ b/gui/src/components/mainInput/getSuggestion.ts @@ -8,8 +8,8 @@ import { MutableRefObject } from "react"; import tippy from "tippy.js"; import { IIdeMessenger } from "../../context/IdeMessenger"; import MentionList from "./MentionList"; -import { ComboBoxItem, ComboBoxItemType, ComboBoxSubAction } from "./types"; import { TIPPY_DIV_ID } from "./TipTapEditor"; +import { ComboBoxItem, ComboBoxItemType, ComboBoxSubAction } from "./types"; function getSuggestion( items: (props: { query: string }) => Promise, @@ -198,27 +198,18 @@ export function getSlashCommandDropdownOptions( ideMessenger: IIdeMessenger, ) { const items = async ({ query }: { query: string }) => { - const options = [ - ...availableSlashCommandsRef.current, - // { - // title: "Build a custom prompt", - // description: "Build a custom prompt", - // type: "action", - // id: "createPromptFile", - // label: "Create Prompt File", - // action: () => { - // ideMessenger.post("config/newPromptFile", undefined); - // }, - // name: "Create Prompt File", - // }, - ]; - return ( - options.filter((slashCommand) => { - const sc = slashCommand.title.substring(1).toLowerCase(); - const iv = query.toLowerCase(); - return sc.startsWith(iv); - }) || [] - ).map((provider) => ({ + const options = [...availableSlashCommandsRef.current]; + + const filteredCommands = + query.length > 0 + ? options.filter((slashCommand) => { + const sc = slashCommand.title.substring(1).toLowerCase(); + const iv = query.toLowerCase(); + return sc.startsWith(iv); + }) + : options; + + const commandItems = (filteredCommands || []).map((provider) => ({ name: provider.title, description: provider.description, id: provider.title, @@ -227,6 +218,24 @@ export function getSlashCommandDropdownOptions( type: (provider.type ?? "slashCommand") as ComboBoxItemType, action: provider.action, })); + + if (query.length === 0 && commandItems.length > 0) { + commandItems.push({ + title: "Explore prompts", + type: "action", + action: () => + ideMessenger.post( + "openUrl", + "https://hub.continue.dev/explore/prompts", + ), + description: "", + name: "", + id: "", + label: "", + }); + } + + return commandItems; }; return getSuggestion(items, undefined, onClose, onOpen); } diff --git a/gui/src/pages/config/ModelRoleSelector.tsx b/gui/src/pages/config/ModelRoleSelector.tsx index 163f86b760f..d9d6196a732 100644 --- a/gui/src/pages/config/ModelRoleSelector.tsx +++ b/gui/src/pages/config/ModelRoleSelector.tsx @@ -1,12 +1,15 @@ -import { Fragment } from "react"; import { Listbox, Transition } from "@headlessui/react"; import { ChevronUpDownIcon, InformationCircleIcon, } from "@heroicons/react/24/outline"; import { type ModelDescription } from "core"; +import { Fragment } from "react"; import { ToolTip } from "../../components/gui/Tooltip"; +/** + * A component for selecting a model for a specific role + */ interface ModelRoleSelectorProps { models: ModelDescription[]; selectedModel: ModelDescription | null; @@ -38,56 +41,57 @@ const ModelRoleSelector = ({ {description}
- - {({ open }) => ( -
- - {models.length === 0 ? ( - {`No ${displayName} models${["Chat", "Apply", "Edit"].includes(displayName) ? ". Using chat model" : ""}`} - ) : ( + + {models.length === 0 ? ( + + {["Chat", "Apply", "Edit"].includes(displayName) + ? "None (defaulting to Chat model)" + : "None"} + + ) : ( + + {({ open }) => ( +
+ {selectedModel?.title ?? `Select ${displayName} model`} - )} - {models.length ? (
- ) : null} -
+ - - - {models.map((option, idx) => ( - - - {option.title} - - - ))} - - -
- )} -
+ + + {models.map((option, idx) => ( + + + {option.title} + + + ))} + + +
+ )} +
+ )} ); }; diff --git a/gui/src/pages/gui/EmptyChatBody.tsx b/gui/src/pages/gui/EmptyChatBody.tsx index a81143b8d77..dce70cdd5a2 100644 --- a/gui/src/pages/gui/EmptyChatBody.tsx +++ b/gui/src/pages/gui/EmptyChatBody.tsx @@ -25,9 +25,9 @@ export function EmptyChatBody({ } return ( -
- +
+
); } diff --git a/gui/src/redux/selectors/index.ts b/gui/src/redux/selectors/index.ts index 2097dbce88f..3d46bf9ea95 100644 --- a/gui/src/redux/selectors/index.ts +++ b/gui/src/redux/selectors/index.ts @@ -8,7 +8,7 @@ export const selectSlashCommandComboBoxInputs = createSelector( return ( slashCommands?.map((cmd) => { return { - title: `/${cmd.name}`, + title: `${cmd.name}`, description: cmd.description, type: "slashCommand" as ComboBoxItemType, }; From 7df9c604840dc75ad35aa6289ab7a60660895c92 Mon Sep 17 00:00:00 2001 From: Dallin Romney Date: Thu, 20 Mar 2025 19:02:24 -0700 Subject: [PATCH 009/112] mcp loading fixes and duplicate tools --- core/config/load.ts | 59 +--- core/config/profile/doLoadConfig.ts | 89 ++++- core/config/yaml/loadYaml.ts | 58 +-- core/context/mcp/index.ts | 332 ++++++++++++------ core/core.ts | 4 + core/index.d.ts | 96 +++-- .../InputToolbar/ToggleToolsButton.tsx | 30 +- .../InputToolbar/ToolDropdownItem.tsx | 39 +- 8 files changed, 452 insertions(+), 255 deletions(-) diff --git a/core/config/load.ts b/core/config/load.ts index a198f37bf52..de14a8f0241 100644 --- a/core/config/load.ts +++ b/core/config/load.ts @@ -28,7 +28,6 @@ import { IdeType, ILLM, LLMOptions, - MCPOptions, ModelDescription, RerankerDescription, SerializedContinueConfig, @@ -521,6 +520,8 @@ async function intermediateToFinalConfig( contextProviders, models, tools: allTools, + mcpServerStatuses: [], + slashCommands: config.slashCommands ?? [], modelsByRole: { chat: models, edit: models, @@ -541,53 +542,16 @@ async function intermediateToFinalConfig( }, }; - // Apply MCP if specified + // Trigger MCP server refreshes (Config is reloaded again once connected!) const mcpManager = MCPManagerSingleton.getInstance(); - function getMcpId(options: MCPOptions) { - return JSON.stringify(options); - } - if (config.experimental?.modelContextProtocolServers) { - await mcpManager.removeUnusedConnections( - config.experimental.modelContextProtocolServers.map(getMcpId), - ); - } - - if (config.experimental?.modelContextProtocolServers) { - const abortController = new AbortController(); - const mcpConnectionTimeout = setTimeout( - () => abortController.abort(), - 5000, - ); - - await Promise.allSettled( - config.experimental.modelContextProtocolServers?.map( - async (server, index) => { - try { - const mcpId = getMcpId(server); - const mcpConnection = mcpManager.createConnection(mcpId, server); - await mcpConnection.modifyConfig( - continueConfig, - mcpId, - abortController.signal, - "MCP Server", - server.faviconUrl, - ); - } catch (e) { - let errorMessage = "Failed to load MCP server"; - if (e instanceof Error) { - errorMessage += ": " + e.message; - } - errors.push({ - fatal: false, - message: errorMessage, - }); - } finally { - clearTimeout(mcpConnectionTimeout); - } - }, - ) || [], - ); - } + mcpManager.setConnections( + (config.experimental?.modelContextProtocolServers ?? []).map((server) => ({ + id: JSON.stringify(server), + name: "MCP Server", + ...server, + })), + false, + ); // Handle experimental modelRole config values for apply and edit const inlineEditModel = getModelByRole(continueConfig, "inlineEdit")?.title; @@ -681,6 +645,7 @@ async function finalToBrowserConfig( rules: final.rules, docs: final.docs, tools: final.tools, + mcpServerStatuses: final.mcpServerStatuses, tabAutocompleteOptions: final.tabAutocompleteOptions, usePlatform: await useHub(ide.getIdeSettings()), modelsByRole: Object.fromEntries( diff --git a/core/config/profile/doLoadConfig.ts b/core/config/profile/doLoadConfig.ts index 224b7b64e30..10e4e73e990 100644 --- a/core/config/profile/doLoadConfig.ts +++ b/core/config/profile/doLoadConfig.ts @@ -12,12 +12,17 @@ import { IDE, IdeSettings, SerializedContinueConfig, + Tool, } from "../../"; +import { constructMcpSlashCommand } from "../../commands/slash/mcp"; +import { MCPManagerSingleton } from "../../context/mcp"; +import MCPContextProvider from "../../context/providers/MCPContextProvider"; import { ControlPlaneProxyInfo } from "../../control-plane/analytics/IAnalyticsProvider.js"; import { ControlPlaneClient } from "../../control-plane/client.js"; import { getControlPlaneEnv } from "../../control-plane/env.js"; import { TeamAnalytics } from "../../control-plane/TeamAnalytics.js"; import ContinueProxy from "../../llm/llms/stubs/ContinueProxy"; +import { encodeMCPToolUri } from "../../tools/callTool"; import { getConfigJsonPath, getConfigYamlPath } from "../../util/paths"; import { localPathOrUriToPath } from "../../util/pathToUri"; import { Telemetry } from "../../util/posthog"; @@ -93,15 +98,89 @@ export default async function doLoadConfig( configLoadInterrupted = result.configLoadInterrupted; } - // Rectify model selections for each role - if (newConfig) { - newConfig = rectifySelectedModelsFromGlobalContext(newConfig, profileId); - } - if (configLoadInterrupted || !newConfig) { return { errors, config: newConfig, configLoadInterrupted: true }; } + // TODO using config result but result with non-fatal errors is an antipattern? + // Remove ability have undefined errors, just have an array + errors = [...(errors ?? [])]; + + // Rectify model selections for each role + newConfig = rectifySelectedModelsFromGlobalContext(newConfig, profileId); + + // Add things from MCP servers + const mcpManager = MCPManagerSingleton.getInstance(); + const mcpServerStatuses = mcpManager.getStatuses(); + + // Slightly hacky just need connection's client to make slash command for now + const serializableStatuses = mcpServerStatuses.map((server) => { + const { client, ...rest } = server; + return rest; + }); + newConfig.mcpServerStatuses = serializableStatuses; + + for (const server of mcpServerStatuses) { + if (server.status === "connected") { + const serverTools: Tool[] = server.tools.map((tool) => ({ + displayTitle: server.name + " " + tool.name, + function: { + description: tool.description, + name: tool.name, + parameters: tool.inputSchema, + }, + faviconUrl: server.faviconUrl, + readonly: false, + type: "function" as const, + wouldLikeTo: "", + uri: encodeMCPToolUri(server.id, tool.name), + })); + newConfig.tools.push(...serverTools); + + const serverSlashCommands = server.prompts.map((prompt) => + constructMcpSlashCommand( + server.client, + prompt.name, + prompt.description, + prompt.arguments?.map((a: any) => a.name), + ), + ); + newConfig.slashCommands.push(...serverSlashCommands); + + const submenuItems = server.resources.map((resource) => ({ + title: resource.name, + description: resource.description, + id: resource.uri, + icon: server.faviconUrl, + })); + if (submenuItems.length > 0) { + const serverContextProvider = new MCPContextProvider({ + submenuItems, + mcpId: server.id, + }); + newConfig.contextProviders.push(serverContextProvider); + } + } + } + + // Detect duplicate tool names + const counts: Record = {}; + newConfig.tools.forEach((tool) => { + if (counts[tool.function.name]) { + counts[tool.function.name] = counts[tool.function.name] + 1; + } else { + counts[tool.function.name] = 1; + } + }); + Object.entries(counts).forEach(([toolName, count]) => { + if (count > 1) { + errors.push({ + fatal: false, + message: `Duplicate tool name ${toolName} detected (${count} tools). Permissions will conflict and usage may be unpredictable`, + }); + } + }); + newConfig.allowAnonymousTelemetry = newConfig.allowAnonymousTelemetry && (await ide.isTelemetryEnabled()); diff --git a/core/config/yaml/loadYaml.ts b/core/config/yaml/loadYaml.ts index d946b475424..4aba17ae4c6 100644 --- a/core/config/yaml/loadYaml.ts +++ b/core/config/yaml/loadYaml.ts @@ -112,6 +112,7 @@ async function configYamlToContinueConfig( slashCommands: [], models: [], tools: allTools, + mcpServerStatuses: [], systemMessage: config.rules?.join("\n"), experimental: { modelContextProtocolServers: config.mcpServers?.map((mcpServer) => ({ @@ -368,52 +369,19 @@ async function configYamlToContinueConfig( continueConfig.contextProviders.push(new DocsContextProvider({})); } - // Apply MCP if specified + // Trigger MCP server refreshes (Config is reloaded again once connected!) const mcpManager = MCPManagerSingleton.getInstance(); - if (config.mcpServers) { - await mcpManager.removeUnusedConnections( - config.mcpServers.map((s) => s.name), - ); - } - - await Promise.allSettled( - config.mcpServers?.map(async (server) => { - const abortController = new AbortController(); - const mcpConnectionTimeout = setTimeout( - () => abortController.abort(), - 5000, - ); - - try { - const mcpId = server.name; - const mcpConnection = mcpManager.createConnection(mcpId, { - transport: { - type: "stdio", - args: [], - ...server, - }, - }); - - await mcpConnection.modifyConfig( - continueConfig, - mcpId, - abortController.signal, - server.name, - server.faviconUrl, - ); - } catch (e) { - let errorMessage = `Failed to load MCP server ${server.name}`; - if (e instanceof Error) { - errorMessage += ": " + e.message; - } - localErrors.push({ - fatal: false, - message: errorMessage, - }); - } finally { - clearTimeout(mcpConnectionTimeout); - } - }) ?? [], + mcpManager.setConnections( + (config.mcpServers ?? []).map((server) => ({ + id: JSON.stringify(server), + name: server.name, + transport: { + type: "stdio", + args: [], + ...server, + }, + })), + false, ); return { config: continueConfig, errors: localErrors }; diff --git a/core/context/mcp/index.ts b/core/context/mcp/index.ts index 588b063e9dc..c546c3bdf43 100644 --- a/core/context/mcp/index.ts +++ b/core/context/mcp/index.ts @@ -4,16 +4,21 @@ import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js" import { WebSocketClientTransport } from "@modelcontextprotocol/sdk/client/websocket.js"; import { Transport } from "@modelcontextprotocol/sdk/shared/transport.js"; -import { ContinueConfig, MCPOptions, SlashCommand, Tool } from "../.."; -import { constructMcpSlashCommand } from "../../commands/slash/mcp"; -import { encodeMCPToolUri } from "../../tools/callTool"; -import MCPContextProvider from "../providers/MCPContextProvider"; +import { + MCPConnectionStatus, + MCPOptions, + MCPPrompt, + MCPServerStatus, +} from "../.."; export class MCPManagerSingleton { private static instance: MCPManagerSingleton; + public onConnectionsRefreshed?: () => void; private connections: Map = new Map(); + private abortController: AbortController = new AbortController(); + private constructor() {} public static getInstance(): MCPManagerSingleton { @@ -46,18 +51,83 @@ export class MCPManagerSingleton { this.connections.delete(id); } - async removeUnusedConnections(keepIds: string[]) { - const toRemove = Array.from(this.connections.keys()).filter( - (k) => !keepIds.includes(k), + setConnections(servers: MCPOptions[], forceRefresh: boolean) { + // Remove any connections that are no longer in config + this.connections.entries().forEach(([id, connection]) => { + if (!servers.find((s) => s.id === id)) { + connection.abortController.abort(); + void connection.client.close(); + this.connections.delete(id); + } + }); + + // Add any connections that are not yet in manager + servers.forEach((server) => { + if (!this.connections.has(server.id)) { + this.connections.set(server.id, new MCPConnection(server)); + } + }); + + // NOTE the id is made by stringifying the options + void this.refreshConnections(forceRefresh); + } + + async refreshConnections(force: boolean) { + this.abortController.abort(); + this.abortController = new AbortController(); + await Promise.race([ + new Promise((resolve) => { + this.abortController.signal.addEventListener("abort", () => { + resolve(undefined); + }); + }), + (async () => { + await Promise.all( + this.connections.values().map(async (connection) => { + await connection.connectClient(force, this.abortController.signal); + }), + ); + if (this.onConnectionsRefreshed) { + this.onConnectionsRefreshed(); + } + })(), + ]); + } + + getStatuses(): (MCPServerStatus & { client: Client })[] { + return Array.from( + this.connections.values().map((connection) => ({ + ...connection.getStatus(), + client: connection.client, + })), ); - await Promise.all(toRemove.map((id) => this.removeConnection(id))); } } +interface MCPTool { + name: string; + description?: string; + inputSchema: {}; +} + +type MCPResources = Awaited>["resources"]; + +const DEFAULT_MCP_TIMEOUT = 20_000; // 10 seconds + class MCPConnection { public client: Client; private transport: Transport; + private connectionPromise: Promise | null = null; + public abortController: AbortController; + + public status: MCPConnectionStatus = "not-connected"; + public errors: string[] = []; + + public prompts: MCPPrompt[] = []; + public tools: MCPTool[] = []; + public resources: MCPResources = []; + constructor(private readonly options: MCPOptions) { this.transport = this.constructTransport(options); @@ -70,6 +140,8 @@ class MCPConnection { capabilities: {}, }, ); + + this.abortController = new AbortController(); } private constructTransport(options: MCPOptions): Transport { @@ -95,131 +167,157 @@ class MCPConnection { } } - private isConnected: boolean = false; - private connectPromise: Promise | null = null; + getStatus(): MCPServerStatus { + return { + ...this.options, + errors: this.errors, + prompts: this.prompts, + resources: this.resources, + tools: this.tools, + status: this.status, + }; + } - private async connectClient() { - if (this.isConnected) { + async connectClient(forceRefresh: boolean, externalSignal: AbortSignal) { + if (!forceRefresh) { // Already connected - return; - } + if (this.status === "connected") { + return; + } - if (this.connectPromise) { // Connection is already in progress; wait for it to complete - await this.connectPromise; - return; + if (this.connectionPromise) { + await this.connectionPromise; + return; + } } - this.connectPromise = (async () => { - await this.client.connect(this.transport); - this.isConnected = true; - })(); + this.status = "connecting"; + this.tools = []; + this.prompts = []; + this.resources = []; + this.errors = []; - try { - await this.connectPromise; - } finally { - // Reset the promise so future attempts can try again if necessary - this.connectPromise = null; - } - } + this.abortController.abort(); + this.abortController = new AbortController(); - async modifyConfig( - config: ContinueConfig, - mcpId: string, - signal: AbortSignal, - name: string, - faviconUrl: string | undefined, - ) { - try { - await Promise.race([ - this.connectClient(), - new Promise((_, reject) => { - signal.addEventListener("abort", () => - reject(new Error("Connection timed out")), - ); - }), - ]); - } catch (error) { - if (error instanceof Error) { - const msg = error.message.toLowerCase(); - if (msg.includes("spawn") && msg.includes("enoent")) { - const command = msg.split(" ")[1]; - throw new Error( - `command "${command}" not found. To use this MCP server, install the ${command} CLI.`, - ); - } else if ( - !error.message.startsWith("StdioClientTransport already started") - ) { - // don't throw error if it's just a "server already running" case - throw error; - } - } else { - throw error; - } - } + this.connectionPromise = Promise.race([ + // If aborted by a refresh or other, cancel and don't do anything + new Promise((resolve) => { + externalSignal.addEventListener("abort", () => { + resolve(undefined); + }); + }), + new Promise((resolve) => { + this.abortController.signal.addEventListener("abort", () => { + resolve(undefined); + }); + }), + (async () => { + const timeoutController = new AbortController(); + const connectionTimeout = setTimeout( + () => timeoutController.abort(), + this.options.timeout ?? DEFAULT_MCP_TIMEOUT, + ); - const capabilities = this.client.getServerCapabilities(); + try { + await Promise.race([ + new Promise((_, reject) => { + timeoutController.signal.addEventListener("abort", () => { + reject(new Error("Connection timed out")); + }); + }), + (async () => { + await this.client.connect(this.transport); - // Resources <—> Context Provider - if (capabilities?.resources) { - const { resources } = await this.client.listResources({}, { signal }); - const submenuItems = resources.map((resource: any) => ({ - title: resource.name, - description: resource.description, - id: resource.uri, - icon: faviconUrl, - })); + const capabilities = this.client.getServerCapabilities(); - if (!config.contextProviders) { - config.contextProviders = []; - } + // Resources <—> Context Provider + if (capabilities?.resources) { + try { + const { resources } = await this.client.listResources( + {}, + { signal: timeoutController.signal }, + ); + this.resources = resources; + } catch (e) { + let errorMessage = `Error loading resources for MCP Server ${this.options.name}`; + if (e instanceof Error) { + errorMessage += `: ${e.message}`; + } + this.errors.push(errorMessage); + } + } - config.contextProviders.push( - new MCPContextProvider({ - submenuItems, - mcpId, - }), - ); - } + // Tools <—> Tools + if (capabilities?.tools) { + try { + const { tools } = await this.client.listTools( + {}, + { signal: timeoutController.signal }, + ); + this.tools = tools; + } catch (e) { + let errorMessage = `Error loading tools for MCP Server ${this.options.name}`; + if (e instanceof Error) { + errorMessage += `: ${e.message}`; + } + this.errors.push(errorMessage); + } + } - // Tools <—> Tools - if (capabilities?.tools) { - const { tools } = await this.client.listTools({}, { signal }); - const continueTools: Tool[] = tools.map((tool: any) => ({ - displayTitle: name + " " + tool.name, - function: { - description: tool.description, - name: tool.name, - parameters: tool.inputSchema, - }, - faviconUrl, - readonly: false, - type: "function", - wouldLikeTo: "", - uri: encodeMCPToolUri(mcpId, tool.name), - })); - - config.tools = [...continueTools, ...config.tools]; - } + // Prompts <—> Slash commands + if (capabilities?.prompts) { + try { + const { prompts } = await this.client.listPrompts( + {}, + { signal: timeoutController.signal }, + ); + this.prompts = prompts; + } catch (e) { + let errorMessage = `Error loading prompts for MCP Server ${this.options.name}`; + if (e instanceof Error) { + errorMessage += `: ${e.message}`; + } + this.errors.push(errorMessage); + } + } - // Prompts <—> Slash commands - if (capabilities?.prompts) { - const { prompts } = await this.client.listPrompts({}, { signal }); - if (!config.slashCommands) { - config.slashCommands = []; - } + this.status = "connected"; + })(), + ]); + } catch (error) { + // Catch the case where for whatever reason is already connected + if ( + error instanceof Error && + error.message.startsWith("StdioClientTransport already started") + ) { + this.status = "connected"; + return; + } - const slashCommands: SlashCommand[] = prompts.map((prompt: any) => - constructMcpSlashCommand( - this.client, - prompt.name, - prompt.description, - prompt.arguments?.map((a: any) => a.name), - ), - ); + // Otherwise it's a connection error + let errorMessage = `Failed to connect to MCP server ${this.options.name}`; + if (error instanceof Error) { + const msg = error.message.toLowerCase(); + if (msg.includes("spawn") && msg.includes("enoent")) { + const command = msg.split(" ")[1]; + errorMessage += `command "${command}" not found. To use this MCP server, install the ${command} CLI.`; + } else { + errorMessage += ": " + error.message; + } + } - config.slashCommands.push(...slashCommands); - } + this.status = "error"; + this.errors.push(errorMessage); + } finally { + this.connectionPromise = null; + clearTimeout(connectionTimeout); + } + })(), + ]); + + await this.connectionPromise; } } diff --git a/core/core.ts b/core/core.ts index 629aa84ca7b..aa056169760 100644 --- a/core/core.ts +++ b/core/core.ts @@ -43,6 +43,7 @@ import { } from "."; import { isLocalAssistantFile } from "./config/loadLocalAssistants"; +import { MCPManagerSingleton } from "./context/mcp"; import { shouldIgnore } from "./indexing/shouldIgnore"; import { walkDirCache } from "./indexing/walkDir"; import { llmStreamChat } from "./llm/streamChat"; @@ -120,6 +121,9 @@ export class Core { this.messenger, ); + const mcpManager = MCPManagerSingleton.getInstance(); + mcpManager.onConnectionsRefreshed = this.configHandler.reloadConfig; + this.configHandler.onConfigUpdate(async (result) => { const serializedResult = await this.configHandler.getSerializedConfig(); this.messenger.send("configUpdate", { diff --git a/core/index.d.ts b/core/index.d.ts index 6926179bf79..37d17296b02 100644 --- a/core/index.d.ts +++ b/core/index.d.ts @@ -43,13 +43,13 @@ export interface IndexingProgressUpdate { desc: string; shouldClearIndexes?: boolean; status: - | "loading" - | "indexing" - | "done" - | "failed" - | "paused" - | "disabled" - | "cancelled"; + | "loading" + | "indexing" + | "done" + | "failed" + | "paused" + | "disabled" + | "cancelled"; debugInfo?: string; } @@ -316,7 +316,12 @@ export interface CompletionOptions extends BaseCompletionOptions { model: string; } -export type ChatMessageRole = "user" | "assistant" | "thinking" | "system" | "tool"; +export type ChatMessageRole = + | "user" + | "assistant" + | "thinking" + | "system" + | "tool"; export type TextMessagePart = { type: "text"; @@ -692,10 +697,10 @@ export interface IDE { getCurrentFile(): Promise< | undefined | { - isUntitled: boolean; - path: string; - contents: string; - } + isUntitled: boolean; + path: string; + contents: string; + } >; getLastFileSaveTimestamp?(): number; @@ -879,11 +884,11 @@ export interface CustomCommand { export interface Prediction { type: "content"; content: - | string - | { - type: "text"; - text: string; - }[]; + | string + | { + type: "text"; + text: string; + }[]; } export interface ToolExtras { @@ -1042,8 +1047,36 @@ export interface SSEOptions { export type TransportOptions = StdioOptions | WebSocketOptions | SSEOptions; export interface MCPOptions { + name: string; + id: string; transport: TransportOptions; faviconUrl?: string; + timeout?: number; +} + +export type MCPConnectionStatus = + | "connecting" + | "connected" + | "error" + | "not-connected"; + +export interface MCPPrompt { + name: string; + description?: string; + arguments?: { + name: string; + description?: string; + required?: boolean; + }[]; +} + +export interface MCPServerStatus extends MCPOptions { + status: MCPConnectionStatus; + errors: string[]; + + prompts: MCPPrompt[]; + tools: MCPTool[]; + resources: MCPResource[]; } export interface ContinueUIConfig { @@ -1069,6 +1102,11 @@ export interface ExperimentalModelRoles { applyCodeBlock?: string; } +export interface ExperimentalMCPOptions { + transport: TransportOptions; + faviconUrl?: string; +} + export type EditStatus = | "not-started" | "streaming" @@ -1152,7 +1190,7 @@ export interface ExperimentalConfig { * This is needed to crawl a large number of documentation sites that are dynamically rendered. */ useChromiumForDocsCrawling?: boolean; - modelContextProtocolServers?: MCPOptions[]; + modelContextProtocolServers?: ExperimentalMCPOptions[]; } export interface AnalyticsConfig { @@ -1223,9 +1261,9 @@ export interface Config { embeddingsProvider?: EmbeddingsProviderDescription | ILLM; /** The model that Continue will use for tab autocompletions. */ tabAutocompleteModel?: - | CustomLLM - | ModelDescription - | (CustomLLM | ModelDescription)[]; + | CustomLLM + | ModelDescription + | (CustomLLM | ModelDescription)[]; /** Options for tab autocomplete */ tabAutocompleteOptions?: Partial; /** UI styles customization */ @@ -1246,8 +1284,8 @@ export interface ContinueConfig { systemMessage?: string; completionOptions?: BaseCompletionOptions; requestOptions?: RequestOptions; - slashCommands?: SlashCommand[]; - contextProviders?: IContextProvider[]; + slashCommands: SlashCommand[]; + contextProviders: IContextProvider[]; disableSessionTitles?: boolean; disableIndexing?: boolean; userToken?: string; @@ -1257,6 +1295,7 @@ export interface ContinueConfig { analytics?: AnalyticsConfig; docs?: SiteIndexingConfig[]; tools: Tool[]; + mcpServerStatuses: MCPServerStatus[]; rules?: string[]; modelsByRole: Record; selectedModelByRole: Record; @@ -1269,8 +1308,8 @@ export interface BrowserSerializedContinueConfig { systemMessage?: string; completionOptions?: BaseCompletionOptions; requestOptions?: RequestOptions; - slashCommands?: SlashCommandDescription[]; - contextProviders?: ContextProviderDescription[]; + slashCommands: SlashCommandDescription[]; + contextProviders: ContextProviderDescription[]; disableIndexing?: boolean; disableSessionTitles?: boolean; userToken?: string; @@ -1279,6 +1318,7 @@ export interface BrowserSerializedContinueConfig { analytics?: AnalyticsConfig; docs?: SiteIndexingConfig[]; tools: Tool[]; + mcpServerStatuses: MCPServerStatus[]; rules?: string[]; usePlatform: boolean; tabAutocompleteOptions?: Partial; @@ -1319,9 +1359,9 @@ export type PackageDetailsSuccess = PackageDetails & { export type PackageDocsResult = { packageInfo: ParsedPackageInfo; } & ( - | { error: string; details?: never } - | { details: PackageDetailsSuccess; error?: never } - ); + | { error: string; details?: never } + | { details: PackageDetailsSuccess; error?: never } +); export interface TerminalOptions { reuseTerminal?: boolean; diff --git a/gui/src/components/mainInput/InputToolbar/ToggleToolsButton.tsx b/gui/src/components/mainInput/InputToolbar/ToggleToolsButton.tsx index 20dae916025..fd85fcc1b34 100644 --- a/gui/src/components/mainInput/InputToolbar/ToggleToolsButton.tsx +++ b/gui/src/components/mainInput/InputToolbar/ToggleToolsButton.tsx @@ -4,17 +4,17 @@ import { WrenchScrewdriverIcon as WrenchScrewdriverIconOutline, } from "@heroicons/react/24/outline"; import { WrenchScrewdriverIcon as WrenchScrewdriverIconSolid } from "@heroicons/react/24/solid"; -import { useEffect, useRef, useState } from "react"; +import { useEffect, useMemo, useRef, useState } from "react"; import { useDispatch } from "react-redux"; import { lightGray, vscForeground } from "../.."; import { useAppSelector } from "../../../redux/hooks"; +import { selectIsInEditMode } from "../../../redux/slices/sessionSlice"; import { toggleUseTools } from "../../../redux/slices/uiSlice"; import { ToolTip } from "../../gui/Tooltip"; import InfoHover from "../../InfoHover"; import HoverItem from "./HoverItem"; import PopoverTransition from "./PopoverTransition"; import ToolDropdownItem from "./ToolDropdownItem"; -import { selectIsInEditMode } from "../../../redux/slices/sessionSlice"; interface ToolDropdownProps { disabled: boolean; @@ -50,6 +50,23 @@ export default function ToolDropdown(props: ToolDropdownProps) { } }, [isDropdownOpen]); + const tools = useAppSelector((store) => store.config.config.tools); + + // Detect duplicate tool names + const duplicateDetection = useMemo(() => { + const counts: Record = {}; + tools.forEach((tool) => { + if (counts[tool.function.name]) { + counts[tool.function.name] = counts[tool.function.name] + 1; + } else { + counts[tool.function.name] = 1; + } + }); + return Object.fromEntries( + Object.entries(counts).map(([k, v]) => [k, v > 1]), + ); + }, [tools]); + const isDisabled = props.disabled || isInEditMode; return ( @@ -154,13 +171,18 @@ export default function ToolDropdown(props: ToolDropdownProps) {
- {availableTools.map((tool: any) => ( + {availableTools.map((tool) => ( - + ))}
diff --git a/gui/src/components/mainInput/InputToolbar/ToolDropdownItem.tsx b/gui/src/components/mainInput/InputToolbar/ToolDropdownItem.tsx index 5df66f147a3..4e2a3fd6635 100644 --- a/gui/src/components/mainInput/InputToolbar/ToolDropdownItem.tsx +++ b/gui/src/components/mainInput/InputToolbar/ToolDropdownItem.tsx @@ -1,17 +1,20 @@ +import { InformationCircleIcon } from "@heroicons/react/24/outline"; import { Tool } from "core"; import { useEffect } from "react"; -import { useDispatch, useSelector } from "react-redux"; +import { useDispatch } from "react-redux"; +import { useAppSelector } from "../../../redux/hooks"; import { addTool, toggleToolSetting } from "../../../redux/slices/uiSlice"; -import { RootState } from "../../../redux/store"; +import { ToolTip } from "../../gui/Tooltip"; interface ToolDropdownItemProps { tool: Tool; + duplicatesDetected: boolean; } function ToolDropdownItem(props: ToolDropdownItemProps) { const dispatch = useDispatch(); - const settings = useSelector( - (state: RootState) => state.ui.toolSettings[props.tool.function.name], + const settings = useAppSelector( + (state) => state.ui.toolSettings[props.tool.function.name], ); useEffect(() => { @@ -34,6 +37,29 @@ function ToolDropdownItem(props: ToolDropdownItemProps) { }} > + {props.duplicatesDetected ? ( + <> + + + +

+ Duplicate tool name{" "} + {props.tool.function.name}{" "} + + detected. Permissions will conflict and usage may be + unpredictable + +

+
+ + ) : null} {props.tool.faviconUrl && ( )} {props.tool.displayTitle}{" "} - {/* */}
{(settings === "allowedWithPermission" || settings === undefined) && ( From cde405799f7b825b4ab17cbd43fadd5c670dec87 Mon Sep 17 00:00:00 2001 From: Nate Date: Thu, 20 Mar 2025 19:49:57 -0700 Subject: [PATCH 010/112] organize the input box folder --- gui/src/App.tsx | 10 +-- .../index.tsx} | 30 ++++---- .../components/mainInput/ContinueButton.tsx | 74 ------------------- .../components/mainInput/ContinueInputBox.tsx | 9 +-- .../{ => belowMainInput}/ContextItemsPeek.tsx | 14 ++-- .../{ => belowMainInput}/NewSessionButton.tsx | 4 +- .../ThinkingBlockPeek.tsx | 6 +- .../{ => belowMainInput}/TutorialCard.tsx | 8 +- .../{ => tiptap}/CodeBlockComponent.tsx | 4 +- .../mainInput/{ => tiptap}/TipTapEditor.css | 0 .../mainInput/{ => tiptap}/TipTapEditor.tsx | 52 ++++++------- .../extensions}/AddCodeToEditExtension.ts | 0 .../extensions}/CodeBlockExtension.tsx | 2 +- .../extensions}/CommandsExtension.ts | 0 .../extensions}/FillerExtension.tsx | 0 .../extensions}/MentionExtension.ts | 0 .../mainInput/{ => tiptap}/getSuggestion.ts | 8 +- .../mainInput/{ => tiptap}/resolveInput.ts | 8 +- .../{ => util}/handleMetaKeyIssues.ts | 2 +- .../mainInput/{ => util}/inputModifiers.ts | 0 gui/src/editorInset/EditorInset.tsx | 4 +- gui/src/pages/gui/Chat.tsx | 8 +- gui/src/pages/gui/ToolCallDiv/ToolOutput.tsx | 2 +- gui/src/pages/migration.tsx | 54 -------------- gui/src/redux/thunks/gatherContext.ts | 2 +- 25 files changed, 83 insertions(+), 218 deletions(-) rename gui/src/components/mainInput/{MentionList.tsx => AtMentionDropdown/index.tsx} (94%) delete mode 100644 gui/src/components/mainInput/ContinueButton.tsx rename gui/src/components/mainInput/{ => belowMainInput}/ContextItemsPeek.tsx (93%) rename gui/src/components/mainInput/{ => belowMainInput}/NewSessionButton.tsx (90%) rename gui/src/components/mainInput/{ => belowMainInput}/ThinkingBlockPeek.tsx (97%) rename gui/src/components/mainInput/{ => belowMainInput}/TutorialCard.tsx (93%) rename gui/src/components/mainInput/{ => tiptap}/CodeBlockComponent.tsx (92%) rename gui/src/components/mainInput/{ => tiptap}/TipTapEditor.css (100%) rename gui/src/components/mainInput/{ => tiptap}/TipTapEditor.tsx (95%) rename gui/src/components/mainInput/{ => tiptap/extensions}/AddCodeToEditExtension.ts (100%) rename gui/src/components/mainInput/{ => tiptap/extensions}/CodeBlockExtension.tsx (91%) rename gui/src/components/mainInput/{ => tiptap/extensions}/CommandsExtension.ts (100%) rename gui/src/components/mainInput/{ => tiptap/extensions}/FillerExtension.tsx (100%) rename gui/src/components/mainInput/{ => tiptap/extensions}/MentionExtension.ts (100%) rename gui/src/components/mainInput/{ => tiptap}/getSuggestion.ts (97%) rename gui/src/components/mainInput/{ => tiptap}/resolveInput.ts (98%) rename gui/src/components/mainInput/{ => util}/handleMetaKeyIssues.ts (98%) rename gui/src/components/mainInput/{ => util}/inputModifiers.ts (100%) delete mode 100644 gui/src/pages/migration.tsx diff --git a/gui/src/App.tsx b/gui/src/App.tsx index 73d6672927c..5f37f767551 100644 --- a/gui/src/App.tsx +++ b/gui/src/App.tsx @@ -1,19 +1,17 @@ -import { useDispatch } from "react-redux"; import { RouterProvider, createMemoryRouter } from "react-router-dom"; import Layout from "./components/Layout"; +import { SubmenuContextProvidersProvider } from "./context/SubmenuContextProviders"; import { VscThemeProvider } from "./context/VscTheme"; import useSetup from "./hooks/useSetup"; import { AddNewModel, ConfigureProvider } from "./pages/AddNewModel"; +import ConfigPage from "./pages/config"; import ConfigErrorPage from "./pages/config-error"; import ErrorPage from "./pages/error"; import Chat from "./pages/gui"; import History from "./pages/history"; -import MigrationPage from "./pages/migration"; import MorePage from "./pages/More"; import Stats from "./pages/stats"; import { ROUTES } from "./util/navigation"; -import { SubmenuContextProvidersProvider } from "./context/SubmenuContextProviders"; -import ConfigPage from "./pages/config"; const router = createMemoryRouter([ { @@ -57,10 +55,6 @@ const router = createMemoryRouter([ path: ROUTES.CONFIG, element: , }, - { - path: "/migration", - element: , - }, ], }, ]); diff --git a/gui/src/components/mainInput/MentionList.tsx b/gui/src/components/mainInput/AtMentionDropdown/index.tsx similarity index 94% rename from gui/src/components/mainInput/MentionList.tsx rename to gui/src/components/mainInput/AtMentionDropdown/index.tsx index 94324b75eab..60cbf659a11 100644 --- a/gui/src/components/mainInput/MentionList.tsx +++ b/gui/src/components/mainInput/AtMentionDropdown/index.tsx @@ -39,18 +39,18 @@ import { vscListActiveBackground, vscListActiveForeground, vscQuickInputBackground, -} from ".."; -import { IdeMessengerContext } from "../../context/IdeMessenger"; -import { setDialogMessage, setShowDialog } from "../../redux/slices/uiSlice"; -import FileIcon from "../FileIcon"; -import SafeImg from "../SafeImg"; -import AddDocsDialog from "../dialogs/AddDocsDialog"; -import HeaderButtonWithToolTip from "../gui/HeaderButtonWithToolTip"; -import { DiscordIcon } from "../svg/DiscordIcon"; -import { GithubIcon } from "../svg/GithubIcon"; -import { GitlabIcon } from "../svg/GitlabIcon"; -import { GoogleIcon } from "../svg/GoogleIcon"; -import { ComboBoxItem, ComboBoxItemType } from "./types"; +} from "../.."; +import { IdeMessengerContext } from "../../../context/IdeMessenger"; +import { setDialogMessage, setShowDialog } from "../../../redux/slices/uiSlice"; +import FileIcon from "../../FileIcon"; +import SafeImg from "../../SafeImg"; +import AddDocsDialog from "../../dialogs/AddDocsDialog"; +import HeaderButtonWithToolTip from "../../gui/HeaderButtonWithToolTip"; +import { DiscordIcon } from "../../svg/DiscordIcon"; +import { GithubIcon } from "../../svg/GithubIcon"; +import { GitlabIcon } from "../../svg/GitlabIcon"; +import { GoogleIcon } from "../../svg/GoogleIcon"; +import { ComboBoxItem, ComboBoxItemType } from "../types"; const ICONS_FOR_DROPDOWN: { [key: string]: any } = { file: FolderIcon, @@ -180,7 +180,7 @@ const QueryInput = styled.textarea` resize: none; `; -interface MentionListProps { +interface AtMentionDropdownProps { items: ComboBoxItem[]; command: (item: any) => void; @@ -189,7 +189,7 @@ interface MentionListProps { onClose: () => void; } -const MentionList = forwardRef((props: MentionListProps, ref) => { +const AtMentionDropdown = forwardRef((props: AtMentionDropdownProps, ref) => { const dispatch = useDispatch(); const ideMessenger = useContext(IdeMessengerContext); @@ -512,4 +512,4 @@ const MentionList = forwardRef((props: MentionListProps, ref) => { ); }); -export default MentionList; +export default AtMentionDropdown; diff --git a/gui/src/components/mainInput/ContinueButton.tsx b/gui/src/components/mainInput/ContinueButton.tsx deleted file mode 100644 index 23776bbcf88..00000000000 --- a/gui/src/components/mainInput/ContinueButton.tsx +++ /dev/null @@ -1,74 +0,0 @@ -import { PlayIcon, StopIcon } from "@heroicons/react/24/outline"; -import styled from "styled-components"; -import { Button } from ".."; -import { getFontSize } from "../../util"; - -const StyledButton = styled(Button)<{ - color?: string | null; - isDisabled: boolean; - showStop: boolean; -}>` - margin: auto; - margin-top: 8px; - margin-bottom: 16px; - display: grid; - width: 130px; - grid-template-columns: 22px 1fr; - align-items: center; - background-color: ${(props) => - `${props.color || "#be1b55"}${props.showStop ? "33" : ""}`}; - - opacity: ${(props) => (props.isDisabled ? 0.5 : 1.0)}; - - border: 1px solid - ${(props) => (props.showStop ? props.color || "#be1b55" : "transparent")}; - - cursor: ${(props) => (props.isDisabled ? "default" : "pointer")}; - - &:hover:enabled { - background-color: ${(props) => - `${props.color || "#be1b55"}${props.showStop ? "33" : ""}`}; - ${(props) => - props.isDisabled - ? "cursor: default;" - : ` - opacity: 0.7; - `} - } -`; - -function ContinueButton(props: { - onClick?: () => void; - hidden?: boolean; - disabled: boolean; - showStop: boolean; -}) { - return ( - - ); -} - -export default ContinueButton; diff --git a/gui/src/components/mainInput/ContinueInputBox.tsx b/gui/src/components/mainInput/ContinueInputBox.tsx index 69264eb35f8..94058463660 100644 --- a/gui/src/components/mainInput/ContinueInputBox.tsx +++ b/gui/src/components/mainInput/ContinueInputBox.tsx @@ -1,14 +1,13 @@ import { Editor, JSONContent } from "@tiptap/react"; import { ContextItemWithId, InputModifiers } from "core"; -import { useDispatch } from "react-redux"; +import { useMemo } from "react"; import styled, { keyframes } from "styled-components"; import { defaultBorderRadius, vscBackground } from ".."; -import { selectSlashCommandComboBoxInputs } from "../../redux/selectors"; -import ContextItemsPeek from "./ContextItemsPeek"; -import TipTapEditor from "./TipTapEditor"; import { useAppSelector } from "../../redux/hooks"; +import { selectSlashCommandComboBoxInputs } from "../../redux/selectors"; +import ContextItemsPeek from "./belowMainInput/ContextItemsPeek"; import { ToolbarOptions } from "./InputToolbar"; -import { useMemo } from "react"; +import TipTapEditor from "./tiptap/TipTapEditor"; interface ContinueInputBoxProps { isEditMode?: boolean; diff --git a/gui/src/components/mainInput/ContextItemsPeek.tsx b/gui/src/components/mainInput/belowMainInput/ContextItemsPeek.tsx similarity index 93% rename from gui/src/components/mainInput/ContextItemsPeek.tsx rename to gui/src/components/mainInput/belowMainInput/ContextItemsPeek.tsx index 9e7d34070c0..0b740142caa 100644 --- a/gui/src/components/mainInput/ContextItemsPeek.tsx +++ b/gui/src/components/mainInput/belowMainInput/ContextItemsPeek.tsx @@ -7,13 +7,13 @@ import { ContextItemWithId } from "core"; import { ctxItemToRifWithContents } from "core/commands/util"; import { getUriPathBasename } from "core/util/uri"; import { useContext, useMemo, useState } from "react"; -import { AnimatedEllipsis, lightGray, vscBackground } from ".."; -import { IdeMessengerContext } from "../../context/IdeMessenger"; -import { useAppSelector } from "../../redux/hooks"; -import { selectIsGatheringContext } from "../../redux/slices/sessionSlice"; -import FileIcon from "../FileIcon"; -import SafeImg from "../SafeImg"; -import { getIconFromDropdownItem } from "./MentionList"; +import { AnimatedEllipsis, lightGray, vscBackground } from "../.."; +import { IdeMessengerContext } from "../../../context/IdeMessenger"; +import { useAppSelector } from "../../../redux/hooks"; +import { selectIsGatheringContext } from "../../../redux/slices/sessionSlice"; +import FileIcon from "../../FileIcon"; +import SafeImg from "../../SafeImg"; +import { getIconFromDropdownItem } from "../AtMentionDropdown"; interface ContextItemsPeekProps { contextItems?: ContextItemWithId[]; diff --git a/gui/src/components/mainInput/NewSessionButton.tsx b/gui/src/components/mainInput/belowMainInput/NewSessionButton.tsx similarity index 90% rename from gui/src/components/mainInput/NewSessionButton.tsx rename to gui/src/components/mainInput/belowMainInput/NewSessionButton.tsx index 04193450ca3..d8623af9687 100644 --- a/gui/src/components/mainInput/NewSessionButton.tsx +++ b/gui/src/components/mainInput/belowMainInput/NewSessionButton.tsx @@ -1,6 +1,6 @@ import styled from "styled-components"; -import { defaultBorderRadius, lightGray, vscForeground } from ".."; -import { getFontSize } from "../../util"; +import { defaultBorderRadius, lightGray, vscForeground } from "../.."; +import { getFontSize } from "../../../util"; export const NewSessionButton = styled.div` width: fit-content; diff --git a/gui/src/components/mainInput/ThinkingBlockPeek.tsx b/gui/src/components/mainInput/belowMainInput/ThinkingBlockPeek.tsx similarity index 97% rename from gui/src/components/mainInput/ThinkingBlockPeek.tsx rename to gui/src/components/mainInput/belowMainInput/ThinkingBlockPeek.tsx index 85163523003..a89ba2e6a1e 100644 --- a/gui/src/components/mainInput/ThinkingBlockPeek.tsx +++ b/gui/src/components/mainInput/belowMainInput/ThinkingBlockPeek.tsx @@ -4,9 +4,9 @@ import { ChevronUpIcon } from "@heroicons/react/24/solid"; import { ChatHistoryItem } from "core"; import { useEffect, useState } from "react"; import styled from "styled-components"; -import { defaultBorderRadius, lightGray, vscBackground } from ".."; -import { getFontSize } from "../../util"; -import StyledMarkdownPreview from "../markdown/StyledMarkdownPreview"; +import { defaultBorderRadius, lightGray, vscBackground } from "../.."; +import { getFontSize } from "../../../util"; +import StyledMarkdownPreview from "../../markdown/StyledMarkdownPreview"; const SpoilerButton = styled.div` background-color: ${vscBackground}; diff --git a/gui/src/components/mainInput/TutorialCard.tsx b/gui/src/components/mainInput/belowMainInput/TutorialCard.tsx similarity index 93% rename from gui/src/components/mainInput/TutorialCard.tsx rename to gui/src/components/mainInput/belowMainInput/TutorialCard.tsx index c31c8f4a38f..dfebdb6a431 100644 --- a/gui/src/components/mainInput/TutorialCard.tsx +++ b/gui/src/components/mainInput/belowMainInput/TutorialCard.tsx @@ -7,10 +7,10 @@ import { XMarkIcon, } from "@heroicons/react/24/outline"; import { useContext } from "react"; -import { lightGray } from ".."; -import { IdeMessengerContext } from "../../context/IdeMessenger"; -import { isJetBrains } from "../../util"; -import Shortcut from "../gui/Shortcut"; +import { lightGray } from "../.."; +import { IdeMessengerContext } from "../../../context/IdeMessenger"; +import { isJetBrains } from "../../../util"; +import Shortcut from "../../gui/Shortcut"; interface TutorialCardProps { onClose: () => void; diff --git a/gui/src/components/mainInput/CodeBlockComponent.tsx b/gui/src/components/mainInput/tiptap/CodeBlockComponent.tsx similarity index 92% rename from gui/src/components/mainInput/CodeBlockComponent.tsx rename to gui/src/components/mainInput/tiptap/CodeBlockComponent.tsx index 61403a2610a..e63e273ada5 100644 --- a/gui/src/components/mainInput/CodeBlockComponent.tsx +++ b/gui/src/components/mainInput/tiptap/CodeBlockComponent.tsx @@ -1,7 +1,7 @@ import { NodeViewWrapper, NodeViewWrapperProps } from "@tiptap/react"; import { ContextItemWithId } from "core"; -import { vscBadgeBackground } from ".."; -import CodeSnippetPreview from "../markdown/CodeSnippetPreview"; +import { vscBadgeBackground } from "../.."; +import CodeSnippetPreview from "../../markdown/CodeSnippetPreview"; export const CodeBlockComponent = (props: any) => { const { node, deleteNode, selected, editor, updateAttributes } = props; diff --git a/gui/src/components/mainInput/TipTapEditor.css b/gui/src/components/mainInput/tiptap/TipTapEditor.css similarity index 100% rename from gui/src/components/mainInput/TipTapEditor.css rename to gui/src/components/mainInput/tiptap/TipTapEditor.css diff --git a/gui/src/components/mainInput/TipTapEditor.tsx b/gui/src/components/mainInput/tiptap/TipTapEditor.tsx similarity index 95% rename from gui/src/components/mainInput/TipTapEditor.tsx rename to gui/src/components/mainInput/tiptap/TipTapEditor.tsx index 046da102166..56ac430960c 100644 --- a/gui/src/components/mainInput/TipTapEditor.tsx +++ b/gui/src/components/mainInput/tiptap/TipTapEditor.tsx @@ -29,16 +29,16 @@ import { vscForeground, vscInputBackground, vscInputBorderFocus, -} from ".."; -import { IdeMessengerContext } from "../../context/IdeMessenger"; -import { useSubmenuContextProviders } from "../../context/SubmenuContextProviders"; -import { useInputHistory } from "../../hooks/useInputHistory"; -import useIsOSREnabled from "../../hooks/useIsOSREnabled"; -import useUpdatingRef from "../../hooks/useUpdatingRef"; -import { useWebviewListener } from "../../hooks/useWebviewListener"; -import { useAppDispatch, useAppSelector } from "../../redux/hooks"; -import { selectUseActiveFile } from "../../redux/selectors"; -import { selectDefaultModel } from "../../redux/slices/configSlice"; +} from "../.."; +import { IdeMessengerContext } from "../../../context/IdeMessenger"; +import { useSubmenuContextProviders } from "../../../context/SubmenuContextProviders"; +import { useInputHistory } from "../../../hooks/useInputHistory"; +import useIsOSREnabled from "../../../hooks/useIsOSREnabled"; +import useUpdatingRef from "../../../hooks/useUpdatingRef"; +import { useWebviewListener } from "../../../hooks/useWebviewListener"; +import { useAppDispatch, useAppSelector } from "../../../redux/hooks"; +import { selectUseActiveFile } from "../../../redux/selectors"; +import { selectDefaultModel } from "../../../redux/slices/configSlice"; import { addCodeToEdit, clearCodeToEdit, @@ -46,34 +46,34 @@ import { selectIsInEditMode, setMainEditorContentTrigger, setNewestCodeblocksForInput, -} from "../../redux/slices/sessionSlice"; -import { exitEditMode } from "../../redux/thunks"; +} from "../../../redux/slices/sessionSlice"; +import { exitEditMode } from "../../../redux/thunks"; import { loadLastSession, loadSession, saveCurrentSession, -} from "../../redux/thunks/session"; +} from "../../../redux/thunks/session"; import { getFontSize, isJetBrains, isMetaEquivalentKeyPressed, -} from "../../util"; -import { AddCodeToEdit } from "./AddCodeToEditExtension"; -import { CodeBlockExtension } from "./CodeBlockExtension"; -import { SlashCommand } from "./CommandsExtension"; -import { MockExtension } from "./FillerExtension"; -import InputToolbar, { ToolbarOptions } from "./InputToolbar"; -import { Mention } from "./MentionExtension"; -import "./TipTapEditor.css"; +} from "../../../util"; +import InputToolbar, { ToolbarOptions } from "../InputToolbar"; +import { ComboBoxItem } from "../types"; +import { + handleJetBrainsOSRMetaKeyIssues, + handleVSCMetaKeyIssues, +} from "../util/handleMetaKeyIssues"; +import { AddCodeToEdit } from "./extensions/AddCodeToEditExtension"; +import { CodeBlockExtension } from "./extensions/CodeBlockExtension"; +import { SlashCommand } from "./extensions/CommandsExtension"; +import { MockExtension } from "./extensions/FillerExtension"; +import { Mention } from "./extensions/MentionExtension"; import { getContextProviderDropdownOptions, getSlashCommandDropdownOptions, } from "./getSuggestion"; -import { - handleJetBrainsOSRMetaKeyIssues, - handleVSCMetaKeyIssues, -} from "./handleMetaKeyIssues"; -import { ComboBoxItem } from "./types"; +import "./TipTapEditor.css"; const InputBoxDiv = styled.div<{}>` resize: none; diff --git a/gui/src/components/mainInput/AddCodeToEditExtension.ts b/gui/src/components/mainInput/tiptap/extensions/AddCodeToEditExtension.ts similarity index 100% rename from gui/src/components/mainInput/AddCodeToEditExtension.ts rename to gui/src/components/mainInput/tiptap/extensions/AddCodeToEditExtension.ts diff --git a/gui/src/components/mainInput/CodeBlockExtension.tsx b/gui/src/components/mainInput/tiptap/extensions/CodeBlockExtension.tsx similarity index 91% rename from gui/src/components/mainInput/CodeBlockExtension.tsx rename to gui/src/components/mainInput/tiptap/extensions/CodeBlockExtension.tsx index 091694db91f..aea6e18af00 100644 --- a/gui/src/components/mainInput/CodeBlockExtension.tsx +++ b/gui/src/components/mainInput/tiptap/extensions/CodeBlockExtension.tsx @@ -1,6 +1,6 @@ import { mergeAttributes, Node } from "@tiptap/core"; import { ReactNodeViewRenderer } from "@tiptap/react"; -import { CodeBlockComponent } from "./CodeBlockComponent"; +import { CodeBlockComponent } from "../CodeBlockComponent"; export const CodeBlockExtension = Node.create({ name: "codeBlock", diff --git a/gui/src/components/mainInput/CommandsExtension.ts b/gui/src/components/mainInput/tiptap/extensions/CommandsExtension.ts similarity index 100% rename from gui/src/components/mainInput/CommandsExtension.ts rename to gui/src/components/mainInput/tiptap/extensions/CommandsExtension.ts diff --git a/gui/src/components/mainInput/FillerExtension.tsx b/gui/src/components/mainInput/tiptap/extensions/FillerExtension.tsx similarity index 100% rename from gui/src/components/mainInput/FillerExtension.tsx rename to gui/src/components/mainInput/tiptap/extensions/FillerExtension.tsx diff --git a/gui/src/components/mainInput/MentionExtension.ts b/gui/src/components/mainInput/tiptap/extensions/MentionExtension.ts similarity index 100% rename from gui/src/components/mainInput/MentionExtension.ts rename to gui/src/components/mainInput/tiptap/extensions/MentionExtension.ts diff --git a/gui/src/components/mainInput/getSuggestion.ts b/gui/src/components/mainInput/tiptap/getSuggestion.ts similarity index 97% rename from gui/src/components/mainInput/getSuggestion.ts rename to gui/src/components/mainInput/tiptap/getSuggestion.ts index ecc7b835e32..932db44536d 100644 --- a/gui/src/components/mainInput/getSuggestion.ts +++ b/gui/src/components/mainInput/tiptap/getSuggestion.ts @@ -6,9 +6,9 @@ import { } from "core"; import { MutableRefObject } from "react"; import tippy from "tippy.js"; -import { IIdeMessenger } from "../../context/IdeMessenger"; -import MentionList from "./MentionList"; -import { ComboBoxItem, ComboBoxItemType, ComboBoxSubAction } from "./types"; +import { IIdeMessenger } from "../../../context/IdeMessenger"; +import AtMentionDropdown from "../AtMentionDropdown"; +import { ComboBoxItem, ComboBoxItemType, ComboBoxSubAction } from "../types"; import { TIPPY_DIV_ID } from "./TipTapEditor"; function getSuggestion( @@ -32,7 +32,7 @@ function getSuggestion( return { onStart: (props: any) => { - component = new ReactRenderer(MentionList, { + component = new ReactRenderer(AtMentionDropdown, { props: { ...props, enterSubmenu, onClose: onExit }, editor: props.editor, }); diff --git a/gui/src/components/mainInput/resolveInput.ts b/gui/src/components/mainInput/tiptap/resolveInput.ts similarity index 98% rename from gui/src/components/mainInput/resolveInput.ts rename to gui/src/components/mainInput/tiptap/resolveInput.ts index 1113d2fc38a..d9eb47b6c7d 100644 --- a/gui/src/components/mainInput/resolveInput.ts +++ b/gui/src/components/mainInput/tiptap/resolveInput.ts @@ -1,3 +1,4 @@ +import { Dispatch } from "@reduxjs/toolkit"; import { JSONContent } from "@tiptap/react"; import { ContextItemWithId, @@ -8,12 +9,11 @@ import { RangeInFile, TextMessagePart, } from "core"; -import { stripImages } from "core/util/messageContent"; -import { IIdeMessenger } from "../../context/IdeMessenger"; -import { Dispatch } from "@reduxjs/toolkit"; -import { setIsGatheringContext } from "../../redux/slices/sessionSlice"; import { ctxItemToRifWithContents } from "core/commands/util"; +import { stripImages } from "core/util/messageContent"; import { getUriFileExtension } from "core/util/uri"; +import { IIdeMessenger } from "../../../context/IdeMessenger"; +import { setIsGatheringContext } from "../../../redux/slices/sessionSlice"; interface MentionAttrs { label: string; diff --git a/gui/src/components/mainInput/handleMetaKeyIssues.ts b/gui/src/components/mainInput/util/handleMetaKeyIssues.ts similarity index 98% rename from gui/src/components/mainInput/handleMetaKeyIssues.ts rename to gui/src/components/mainInput/util/handleMetaKeyIssues.ts index 1adf5593a86..9f9078303e7 100644 --- a/gui/src/components/mainInput/handleMetaKeyIssues.ts +++ b/gui/src/components/mainInput/util/handleMetaKeyIssues.ts @@ -1,6 +1,6 @@ import { Editor } from "@tiptap/react"; import { KeyboardEvent } from "react"; -import { getPlatform, isWebEnvironment } from "../../util"; +import { getPlatform, isWebEnvironment } from "../../../util"; const isWebEnv = isWebEnvironment(); diff --git a/gui/src/components/mainInput/inputModifiers.ts b/gui/src/components/mainInput/util/inputModifiers.ts similarity index 100% rename from gui/src/components/mainInput/inputModifiers.ts rename to gui/src/components/mainInput/util/inputModifiers.ts diff --git a/gui/src/editorInset/EditorInset.tsx b/gui/src/editorInset/EditorInset.tsx index 3e90926b129..2f6d10f8054 100644 --- a/gui/src/editorInset/EditorInset.tsx +++ b/gui/src/editorInset/EditorInset.tsx @@ -1,10 +1,10 @@ import { useRef } from "react"; import styled from "styled-components"; import { defaultBorderRadius } from "../components"; -import TipTapEditor from "../components/mainInput/TipTapEditor"; +import TipTapEditor from "../components/mainInput/tiptap/TipTapEditor"; import useSetup from "../hooks/useSetup"; -import { selectSlashCommandComboBoxInputs } from "../redux/selectors"; import { useAppSelector } from "../redux/hooks"; +import { selectSlashCommandComboBoxInputs } from "../redux/selectors"; const EditorInsetDiv = styled.div` max-width: 500px; diff --git a/gui/src/pages/gui/Chat.tsx b/gui/src/pages/gui/Chat.tsx index 0c1b981bb8b..04a1b9709ed 100644 --- a/gui/src/pages/gui/Chat.tsx +++ b/gui/src/pages/gui/Chat.tsx @@ -26,11 +26,11 @@ import { ExploreHubCard } from "../../components/ExploreHubCard"; import { useFindWidget } from "../../components/find/FindWidget"; import TimelineItem from "../../components/gui/TimelineItem"; import ChatIndexingPeeks from "../../components/indexing/ChatIndexingPeeks"; +import { NewSessionButton } from "../../components/mainInput/belowMainInput/NewSessionButton"; +import ThinkingBlockPeek from "../../components/mainInput/belowMainInput/ThinkingBlockPeek"; +import { TutorialCard } from "../../components/mainInput/belowMainInput/TutorialCard"; import ContinueInputBox from "../../components/mainInput/ContinueInputBox"; -import { NewSessionButton } from "../../components/mainInput/NewSessionButton"; -import resolveEditorContent from "../../components/mainInput/resolveInput"; -import ThinkingBlockPeek from "../../components/mainInput/ThinkingBlockPeek"; -import { TutorialCard } from "../../components/mainInput/TutorialCard"; +import resolveEditorContent from "../../components/mainInput/tiptap/resolveInput"; import AssistantSelect from "../../components/modelSelection/platform/AssistantSelect"; import { OnboardingCard, diff --git a/gui/src/pages/gui/ToolCallDiv/ToolOutput.tsx b/gui/src/pages/gui/ToolCallDiv/ToolOutput.tsx index 46057e90c5b..2289be544a2 100644 --- a/gui/src/pages/gui/ToolCallDiv/ToolOutput.tsx +++ b/gui/src/pages/gui/ToolCallDiv/ToolOutput.tsx @@ -1,5 +1,5 @@ import { ContextItemWithId } from "core"; -import ContextItemsPeek from "../../../components/mainInput/ContextItemsPeek"; +import ContextItemsPeek from "../../../components/mainInput/belowMainInput/ContextItemsPeek"; interface ToolOutputProps { contextItems: ContextItemWithId[]; diff --git a/gui/src/pages/migration.tsx b/gui/src/pages/migration.tsx deleted file mode 100644 index b09389c59c2..00000000000 --- a/gui/src/pages/migration.tsx +++ /dev/null @@ -1,54 +0,0 @@ -import { useNavigate } from "react-router-dom"; -import ContinueButton from "../components/mainInput/ContinueButton"; - -function MigrationPage() { - const navigate = useNavigate(); - return ( -
-

- Migration to config.json -

- -

- Continue now uses a .json config file. We hope that this takes the - guesswork out of setting up. -

- -

- Your configuration should have been automatically migrated, but we - recommend double-checking that everything looks correct. -

- -

- For a summary of what changed and examples of config.json, - please see the{" "} - - migration walkthrough - - , and if you have any questions please reach out to us on{" "} - - Discord - - . -

- - - Note: If you are running the server manually and have not updated the - server, this message does not apply. - - - { - navigate("/"); - }} - disabled={false} - /> -
- ); -} - -export default MigrationPage; diff --git a/gui/src/redux/thunks/gatherContext.ts b/gui/src/redux/thunks/gatherContext.ts index 13336397825..ebd50e644eb 100644 --- a/gui/src/redux/thunks/gatherContext.ts +++ b/gui/src/redux/thunks/gatherContext.ts @@ -7,7 +7,7 @@ import { RangeInFile, } from "core"; import * as URI from "uri-js"; -import resolveEditorContent from "../../components/mainInput/resolveInput"; +import resolveEditorContent from "../../components/mainInput/tiptap/resolveInput"; import { selectDefaultModel } from "../slices/configSlice"; import { ThunkApiType } from "../store"; From 03d8982915157515c8f80ad22b0db3644a4f601a Mon Sep 17 00:00:00 2001 From: Nate Date: Thu, 20 Mar 2025 23:24:30 -0700 Subject: [PATCH 011/112] organize TipTapEditor.tsx --- .../mainInput/tiptap/DragOverlay.tsx | 40 ++ .../mainInput/tiptap/StyledComponents.ts | 72 +++ .../mainInput/tiptap/TipTapEditor.tsx | 579 +----------------- .../mainInput/tiptap/editorConfig.ts | 409 +++++++++++++ .../components/mainInput/tiptap/imageUtils.ts | 73 +++ 5 files changed, 612 insertions(+), 561 deletions(-) create mode 100644 gui/src/components/mainInput/tiptap/DragOverlay.tsx create mode 100644 gui/src/components/mainInput/tiptap/StyledComponents.ts create mode 100644 gui/src/components/mainInput/tiptap/editorConfig.ts create mode 100644 gui/src/components/mainInput/tiptap/imageUtils.ts diff --git a/gui/src/components/mainInput/tiptap/DragOverlay.tsx b/gui/src/components/mainInput/tiptap/DragOverlay.tsx new file mode 100644 index 00000000000..1417a822817 --- /dev/null +++ b/gui/src/components/mainInput/tiptap/DragOverlay.tsx @@ -0,0 +1,40 @@ +import React, { useEffect } from "react"; +import { HoverDiv, HoverTextDiv } from "./StyledComponents"; + +interface DragOverlayProps { + show: boolean; + setShow: (show: boolean) => void; +} + +export const DragOverlay: React.FC = ({ show, setShow }) => { + useEffect(() => { + const overListener = (event: DragEvent) => { + if (event.shiftKey) return; + setShow(true); + }; + window.addEventListener("dragover", overListener); + + const leaveListener = (event: DragEvent) => { + if (event.shiftKey) { + setShow(false); + } else { + setTimeout(() => setShow(false), 2000); + } + }; + window.addEventListener("dragleave", leaveListener); + + return () => { + window.removeEventListener("dragover", overListener); + window.removeEventListener("dragleave", leaveListener); + }; + }, []); + + if (!show) return null; + + return ( + <> + + Hold ⇧ to drop image + + ); +}; diff --git a/gui/src/components/mainInput/tiptap/StyledComponents.ts b/gui/src/components/mainInput/tiptap/StyledComponents.ts new file mode 100644 index 00000000000..ab6fceaa37c --- /dev/null +++ b/gui/src/components/mainInput/tiptap/StyledComponents.ts @@ -0,0 +1,72 @@ +import styled from "styled-components"; +import { + defaultBorderRadius, + lightGray, + vscBadgeBackground, + vscCommandCenterActiveBorder, + vscCommandCenterInactiveBorder, + vscForeground, + vscInputBackground, + vscInputBorderFocus, +} from "../.."; +import { getFontSize } from "../../../util"; + +export const InputBoxDiv = styled.div<{}>` + resize: none; + padding-bottom: 4px; + font-family: inherit; + border-radius: ${defaultBorderRadius}; + margin: 0; + height: auto; + width: 100%; + background-color: ${vscInputBackground}; + color: ${vscForeground}; + + border: 1px solid ${vscCommandCenterInactiveBorder}; + transition: border-color 0.15s ease-in-out; + &:focus-within { + border: 1px solid ${vscCommandCenterActiveBorder}; + } + + outline: none; + font-size: ${getFontSize()}px; + + &:focus { + outline: none; + + border: 0.5px solid ${vscInputBorderFocus}; + } + + &::placeholder { + color: ${lightGray}cc; + } + + display: flex; + flex-direction: column; +`; + +export const HoverDiv = styled.div` + position: absolute; + width: 100%; + height: 100%; + top: 0; + left: 0; + opacity: 0.5; + background-color: ${vscBadgeBackground}; + color: ${vscForeground}; + display: flex; + align-items: center; + justify-content: center; +`; + +export const HoverTextDiv = styled.div` + position: absolute; + width: 100%; + height: 100%; + top: 0; + left: 0; + color: ${vscForeground}; + display: flex; + align-items: center; + justify-content: center; +`; diff --git a/gui/src/components/mainInput/tiptap/TipTapEditor.tsx b/gui/src/components/mainInput/tiptap/TipTapEditor.tsx index 56ac430960c..d1ae79f47a6 100644 --- a/gui/src/components/mainInput/tiptap/TipTapEditor.tsx +++ b/gui/src/components/mainInput/tiptap/TipTapEditor.tsx @@ -1,168 +1,42 @@ -import Document from "@tiptap/extension-document"; -import History from "@tiptap/extension-history"; -import Image from "@tiptap/extension-image"; -import Paragraph from "@tiptap/extension-paragraph"; -import Placeholder from "@tiptap/extension-placeholder"; -import Text from "@tiptap/extension-text"; -import { Plugin } from "@tiptap/pm/state"; -import { Editor, EditorContent, JSONContent, useEditor } from "@tiptap/react"; +import { Editor, EditorContent, JSONContent } from "@tiptap/react"; import { ContextProviderDescription, InputModifiers } from "core"; import { rifWithContentsToContextItem } from "core/commands/util"; import { modelSupportsImages } from "core/llm/autodetect"; import { debounce } from "lodash"; -import { usePostHog } from "posthog-js/react"; import { KeyboardEvent, useCallback, useContext, useEffect, - useRef, useState, } from "react"; -import styled from "styled-components"; -import { - defaultBorderRadius, - lightGray, - vscBadgeBackground, - vscCommandCenterActiveBorder, - vscCommandCenterInactiveBorder, - vscForeground, - vscInputBackground, - vscInputBorderFocus, -} from "../.."; import { IdeMessengerContext } from "../../../context/IdeMessenger"; -import { useSubmenuContextProviders } from "../../../context/SubmenuContextProviders"; -import { useInputHistory } from "../../../hooks/useInputHistory"; import useIsOSREnabled from "../../../hooks/useIsOSREnabled"; import useUpdatingRef from "../../../hooks/useUpdatingRef"; import { useWebviewListener } from "../../../hooks/useWebviewListener"; import { useAppDispatch, useAppSelector } from "../../../redux/hooks"; -import { selectUseActiveFile } from "../../../redux/selectors"; import { selectDefaultModel } from "../../../redux/slices/configSlice"; import { - addCodeToEdit, clearCodeToEdit, - selectHasCodeToEdit, selectIsInEditMode, setMainEditorContentTrigger, setNewestCodeblocksForInput, } from "../../../redux/slices/sessionSlice"; -import { exitEditMode } from "../../../redux/thunks"; -import { - loadLastSession, - loadSession, - saveCurrentSession, -} from "../../../redux/thunks/session"; -import { - getFontSize, - isJetBrains, - isMetaEquivalentKeyPressed, -} from "../../../util"; +import { loadSession, saveCurrentSession } from "../../../redux/thunks/session"; +import { isJetBrains, isMetaEquivalentKeyPressed } from "../../../util"; import InputToolbar, { ToolbarOptions } from "../InputToolbar"; import { ComboBoxItem } from "../types"; import { handleJetBrainsOSRMetaKeyIssues, handleVSCMetaKeyIssues, } from "../util/handleMetaKeyIssues"; -import { AddCodeToEdit } from "./extensions/AddCodeToEditExtension"; -import { CodeBlockExtension } from "./extensions/CodeBlockExtension"; -import { SlashCommand } from "./extensions/CommandsExtension"; -import { MockExtension } from "./extensions/FillerExtension"; -import { Mention } from "./extensions/MentionExtension"; -import { - getContextProviderDropdownOptions, - getSlashCommandDropdownOptions, -} from "./getSuggestion"; +import { DragOverlay } from "./DragOverlay"; +import { createEditorConfig, getPlaceholderText } from "./editorConfig"; +import { handleImageFile } from "./imageUtils"; +import { InputBoxDiv } from "./StyledComponents"; import "./TipTapEditor.css"; -const InputBoxDiv = styled.div<{}>` - resize: none; - padding-bottom: 4px; - font-family: inherit; - border-radius: ${defaultBorderRadius}; - margin: 0; - height: auto; - width: 100%; - background-color: ${vscInputBackground}; - color: ${vscForeground}; - - border: 1px solid ${vscCommandCenterInactiveBorder}; - transition: border-color 0.15s ease-in-out; - &:focus-within { - border: 1px solid ${vscCommandCenterActiveBorder}; - } - - outline: none; - font-size: ${getFontSize()}px; - - &:focus { - outline: none; - - border: 0.5px solid ${vscInputBorderFocus}; - } - - &::placeholder { - color: ${lightGray}cc; - } - - display: flex; - flex-direction: column; -`; - -const HoverDiv = styled.div` - position: absolute; - width: 100%; - height: 100%; - top: 0; - left: 0; - opacity: 0.5; - background-color: ${vscBadgeBackground}; - color: ${vscForeground}; - display: flex; - align-items: center; - justify-content: center; -`; - -const HoverTextDiv = styled.div` - position: absolute; - width: 100%; - height: 100%; - top: 0; - left: 0; - color: ${vscForeground}; - display: flex; - align-items: center; - justify-content: center; -`; - -const IMAGE_RESOLUTION = 1024; -function getDataUrlForFile( - file: File, - img: HTMLImageElement, -): string | undefined { - const targetWidth = IMAGE_RESOLUTION; - const targetHeight = IMAGE_RESOLUTION; - const scaleFactor = Math.min( - targetWidth / img.width, - targetHeight / img.height, - ); - - const canvas = document.createElement("canvas"); - canvas.width = img.width * scaleFactor; - canvas.height = img.height * scaleFactor; - - const ctx = canvas.getContext("2d"); - if (!ctx) { - console.error("Error getting image data url: 2d context not found"); - return; - } - ctx.drawImage(img, 0, 0, canvas.width, canvas.height); - - const downsizedDataUrl = canvas.toDataURL("image/jpeg", 0.7); - return downsizedDataUrl; -} - -interface TipTapEditorProps { +export interface TipTapEditorProps { availableContextProviders: ContextProviderDescription[]; availableSlashCommands: ComboBoxItem[]; isMainInput: boolean; @@ -184,369 +58,18 @@ function TipTapEditor(props: TipTapEditorProps) { const dispatch = useAppDispatch(); const ideMessenger = useContext(IdeMessengerContext); - const { getSubmenuContextItems } = useSubmenuContextProviders(); - - const historyLength = useAppSelector((store) => store.session.history.length); - - const useActiveFile = useAppSelector(selectUseActiveFile); - - const posthog = usePostHog(); - - const inSubmenuRef = useRef(undefined); - const inDropdownRef = useRef(false); const isOSREnabled = useIsOSREnabled(); - const enterSubmenu = async (editor: Editor, providerId: string) => { - const contents = editor.getText(); - const indexOfAt = contents.lastIndexOf("@"); - if (indexOfAt === -1) { - return; - } - - // Find the position of the last @ character - // We do this because editor.getText() isn't a correct representation including node views - let startPos = editor.state.selection.anchor; - while ( - startPos > 0 && - editor.state.doc.textBetween(startPos, startPos + 1) !== "@" - ) { - startPos--; - } - startPos++; - - editor.commands.deleteRange({ - from: startPos, - to: editor.state.selection.anchor, - }); - inSubmenuRef.current = providerId; - - // to trigger refresh of suggestions - editor.commands.insertContent(":"); - editor.commands.deleteRange({ - from: editor.state.selection.anchor - 1, - to: editor.state.selection.anchor, - }); - }; - - const onClose = () => { - inSubmenuRef.current = undefined; - inDropdownRef.current = false; - }; - - const onOpen = () => { - inDropdownRef.current = true; - }; - const defaultModel = useAppSelector(selectDefaultModel); - const defaultModelRef = useUpdatingRef(defaultModel); - - const getSubmenuContextItemsRef = useUpdatingRef(getSubmenuContextItems); - const availableContextProvidersRef = useUpdatingRef( - props.availableContextProviders, - ); - - const historyLengthRef = useUpdatingRef(historyLength); - const availableSlashCommandsRef = useUpdatingRef( - props.availableSlashCommands, - ); - const isStreaming = useAppSelector((state) => state.session.isStreaming); - const isStreamingRef = useUpdatingRef(isStreaming); - const isInEditMode = useAppSelector(selectIsInEditMode); - const isInEditModeRef = useUpdatingRef(isInEditMode); - const hasCodeToEdit = useAppSelector(selectHasCodeToEdit); - const isEditModeAndNoCodeToEdit = isInEditMode && !hasCodeToEdit; - async function handleImageFile( - file: File, - ): Promise<[HTMLImageElement, string] | undefined> { - let filesize = file.size / 1024 / 1024; // filesize in MB - // check image type and size - if ( - [ - "image/jpeg", - "image/jpg", - "image/png", - "image/gif", - "image/svg", - "image/webp", - ].includes(file.type) && - filesize < 10 - ) { - // check dimensions - let _URL = window.URL || window.webkitURL; - let img = new window.Image(); - img.src = _URL.createObjectURL(file); - - return await new Promise((resolve) => { - img.onload = function () { - const dataUrl = getDataUrlForFile(file, img); - if (!dataUrl) { - return; - } - - let image = new window.Image(); - image.src = dataUrl; - image.onload = function () { - resolve([image, dataUrl]); - }; - }; - }); - } else { - ideMessenger.post("showToast", [ - "error", - "Images need to be in jpg or png format and less than 10MB in size.", - ]); - } - } - - const { prevRef, nextRef, addRef } = useInputHistory(props.historyKey); - - const editor: Editor | null = useEditor({ - extensions: [ - Document, - History, - Image.extend({ - addProseMirrorPlugins() { - const plugin = new Plugin({ - props: { - handleDOMEvents: { - paste(view, event) { - const model = defaultModelRef.current; - if (!model) return; - const items = event.clipboardData?.items; - if (items) { - for (const item of items) { - const file = item.getAsFile(); - file && - modelSupportsImages( - model.provider, - model.model, - model.title, - model.capabilities, - ) && - handleImageFile(file).then((resp) => { - if (!resp) return; - const [img, dataUrl] = resp; - const { schema } = view.state; - const node = schema.nodes.image.create({ - src: dataUrl, - }); - const tr = view.state.tr.insert(0, node); - view.dispatch(tr); - }); - } - } - }, - }, - }, - }); - return [plugin]; - }, - }).configure({ - HTMLAttributes: { - class: "object-contain max-h-[210px] max-w-full mx-1", - }, - }), - Placeholder.configure({ - placeholder: getPlaceholderText( - props.placeholder, - historyLengthRef.current, - ), - }), - Paragraph.extend({ - addKeyboardShortcuts() { - return { - Enter: () => { - if (inDropdownRef.current) { - return false; - } - - onEnterRef.current({ - useCodebase: false, - noContext: !useActiveFile, - }); - return true; - }, - - "Mod-Enter": () => { - onEnterRef.current({ - useCodebase: true, - noContext: !useActiveFile, - }); - return true; - }, - "Alt-Enter": () => { - posthog.capture("gui_use_active_file_enter"); - - onEnterRef.current({ - useCodebase: false, - noContext: !!useActiveFile, - }); - - return true; - }, - "Mod-Backspace": () => { - // If you press cmd+backspace wanting to cancel, - // but are inside of a text box, it shouldn't - // delete the text - if (isStreamingRef.current) { - return true; - } - return false; - }, - "Shift-Enter": () => - this.editor.commands.first(({ commands }) => [ - () => commands.newlineInCode(), - () => commands.createParagraphNear(), - () => commands.liftEmptyBlock(), - () => commands.splitBlock(), - ]), - - ArrowUp: () => { - if (this.editor.state.selection.anchor > 1) { - return false; - } - - const previousInput = prevRef.current( - this.editor.state.toJSON().doc, - ); - if (previousInput) { - this.editor.commands.setContent(previousInput); - setTimeout(() => { - this.editor.commands.blur(); - this.editor.commands.focus("start"); - }, 0); - return true; - } - return false; - }, - Escape: () => { - if (inDropdownRef.current || !isInEditModeRef.current) { - ideMessenger.post("focusEditor", undefined); - return true; - } - (async () => { - await dispatch( - loadLastSession({ - saveCurrentSession: false, - }), - ); - dispatch(exitEditMode()); - })(); - - return true; - }, - ArrowDown: () => { - if ( - this.editor.state.selection.anchor < - this.editor.state.doc.content.size - 1 - ) { - return false; - } - const nextInput = nextRef.current(); - if (nextInput) { - this.editor.commands.setContent(nextInput); - setTimeout(() => { - this.editor.commands.blur(); - this.editor.commands.focus("end"); - }, 0); - return true; - } - return false; - }, - }; - }, - }).configure({ - HTMLAttributes: { - class: "my-1", - }, - }), - Text, - Mention.configure({ - HTMLAttributes: { - class: "mention", - }, - suggestion: getContextProviderDropdownOptions( - availableContextProvidersRef, - getSubmenuContextItemsRef, - enterSubmenu, - onClose, - onOpen, - inSubmenuRef, - ideMessenger, - ), - renderHTML: (props) => { - return `@${props.node.attrs.label || props.node.attrs.id}`; - }, - }), + const historyLength = useAppSelector((store) => store.session.history.length); - AddCodeToEdit.configure({ - HTMLAttributes: { - class: "add-code-to-edit", - }, - suggestion: { - ...getContextProviderDropdownOptions( - availableContextProvidersRef, - getSubmenuContextItemsRef, - enterSubmenu, - onClose, - onOpen, - inSubmenuRef, - ideMessenger, - ), - allow: () => isInEditModeRef.current, - command: async ({ editor, range, props }) => { - editor.chain().focus().insertContentAt(range, "").run(); - const filepath = props.id; - const contents = await ideMessenger.ide.readFile(filepath); - dispatch( - addCodeToEdit({ - filepath, - contents, - }), - ); - }, - items: async ({ query }) => { - // Only display files in the dropdown - const results = getSubmenuContextItemsRef.current("file", query); - return results.map((result) => ({ - ...result, - label: result.title, - type: "file", - query: result.id, - icon: result.icon, - })); - }, - }, - }), - props.availableSlashCommands.length - ? SlashCommand.configure({ - HTMLAttributes: { - class: "mention", - }, - suggestion: getSlashCommandDropdownOptions( - availableSlashCommandsRef, - onClose, - onOpen, - ideMessenger, - ), - renderText: (props) => { - return props.node.attrs.label; - }, - }) - : MockExtension, - CodeBlockExtension, - ], - editorProps: { - attributes: { - class: "outline-none -mt-1 overflow-hidden", - style: `font-size: ${getFontSize()}px;`, - }, - }, - content: props.editorState, - editable: !isStreaming || props.isMainInput, + const { editor, onEnterRef } = createEditorConfig({ + props, + ideMessenger, + dispatch, }); const [shouldHideToolbar, setShouldHideToolbar] = useState(false); @@ -554,34 +77,18 @@ function TipTapEditor(props: TipTapEditorProps) { setShouldHideToolbar(value); }, 200); - function getPlaceholderText( - placeholder: TipTapEditorProps["placeholder"], - historyLength: number, - ) { - if (placeholder) { - return placeholder; - } - - return historyLength === 0 - ? "Ask anything, '@' to add context" - : "Ask a follow-up"; - } - useEffect(() => { if (!editor) { return; } - const placeholder = getPlaceholderText( - props.placeholder, - historyLengthRef.current, - ); + const placeholder = getPlaceholderText(props.placeholder, historyLength); editor.extensionManager.extensions.filter( (extension) => extension.name === "placeholder", )[0].options["placeholder"] = placeholder; editor.view.dispatch(editor.state.tr); - }, [editor, props.placeholder, historyLengthRef.current]); + }, [editor, props.placeholder, historyLength]); useEffect(() => { if (props.isMainInput) { @@ -644,31 +151,6 @@ function TipTapEditor(props: TipTapEditorProps) { setActiveKey(null); }; - const onEnterRef = useUpdatingRef( - (modifiers: InputModifiers) => { - if (!editor) { - return; - } - if (isStreaming || isEditModeAndNoCodeToEdit) { - return; - } - - const json = editor.getJSON(); - - // Don't do anything if input box is empty - if (!json.content?.some((c) => c.content)) { - return; - } - - if (props.isMainInput) { - addRef.current(json); - } - - props.onEnter(json, modifiers, editor); - }, - [props.onEnter, editor, props.isMainInput], - ); - useEffect(() => { if (props.isMainInput) { /** @@ -885,28 +367,6 @@ function TipTapEditor(props: TipTapEditorProps) { const [showDragOverMsg, setShowDragOverMsg] = useState(false); - useEffect(() => { - const overListener = (event: DragEvent) => { - if (event.shiftKey) return; - setShowDragOverMsg(true); - }; - window.addEventListener("dragover", overListener); - - const leaveListener = (event: DragEvent) => { - if (event.shiftKey) { - setShowDragOverMsg(false); - } else { - setTimeout(() => setShowDragOverMsg(false), 2000); - } - }; - window.addEventListener("dragleave", leaveListener); - - return () => { - window.removeEventListener("dragover", overListener); - window.removeEventListener("dragleave", leaveListener); - }; - }, []); - const [activeKey, setActiveKey] = useState(null); const insertCharacterWithWhitespace = useCallback( @@ -964,7 +424,7 @@ function TipTapEditor(props: TipTapEditorProps) { } setShowDragOverMsg(false); let file = event.dataTransfer.files[0]; - handleImageFile(file).then((result) => { + handleImageFile(ideMessenger, file).then((result) => { if (!editor) { return; } @@ -997,7 +457,7 @@ function TipTapEditor(props: TipTapEditorProps) { onAddSlashCommand={() => insertCharacterWithWhitespace("/")} onEnter={onEnterRef.current} onImageFileSelected={(file) => { - handleImageFile(file).then((result) => { + handleImageFile(ideMessenger, file).then((result) => { if (!editor) { return; } @@ -1023,10 +483,7 @@ function TipTapEditor(props: TipTapEditorProps) { defaultModel?.title, defaultModel?.capabilities, ) && ( - <> - - Hold ⇧ to drop image - + )}
diff --git a/gui/src/components/mainInput/tiptap/editorConfig.ts b/gui/src/components/mainInput/tiptap/editorConfig.ts new file mode 100644 index 00000000000..dfc39089d59 --- /dev/null +++ b/gui/src/components/mainInput/tiptap/editorConfig.ts @@ -0,0 +1,409 @@ +import { Editor } from "@tiptap/core"; +import Document from "@tiptap/extension-document"; +import History from "@tiptap/extension-history"; +import Image from "@tiptap/extension-image"; +import Paragraph from "@tiptap/extension-paragraph"; +import Placeholder from "@tiptap/extension-placeholder"; +import Text from "@tiptap/extension-text"; +import { Plugin } from "@tiptap/pm/state"; +import { useEditor } from "@tiptap/react"; +import { InputModifiers } from "core"; +import { modelSupportsImages } from "core/llm/autodetect"; +import { usePostHog } from "posthog-js/react"; +import { useRef } from "react"; +import { IIdeMessenger } from "../../../context/IdeMessenger"; +import { useSubmenuContextProviders } from "../../../context/SubmenuContextProviders"; +import { useInputHistory } from "../../../hooks/useInputHistory"; +import useUpdatingRef from "../../../hooks/useUpdatingRef"; +import { useAppSelector } from "../../../redux/hooks"; +import { selectUseActiveFile } from "../../../redux/selectors"; +import { selectDefaultModel } from "../../../redux/slices/configSlice"; +import { + addCodeToEdit, + selectHasCodeToEdit, + selectIsInEditMode, +} from "../../../redux/slices/sessionSlice"; +import { AppDispatch } from "../../../redux/store"; +import { exitEditMode } from "../../../redux/thunks"; +import { loadLastSession } from "../../../redux/thunks/session"; +import { getFontSize } from "../../../util"; +import { AddCodeToEdit } from "./extensions/AddCodeToEditExtension"; +import { CodeBlockExtension } from "./extensions/CodeBlockExtension"; +import { SlashCommand } from "./extensions/CommandsExtension"; +import { MockExtension } from "./extensions/FillerExtension"; +import { Mention } from "./extensions/MentionExtension"; +import { + getContextProviderDropdownOptions, + getSlashCommandDropdownOptions, +} from "./getSuggestion"; +import { handleImageFile } from "./imageUtils"; +import { TipTapEditorProps } from "./TipTapEditor"; + +export function getPlaceholderText( + placeholder: TipTapEditorProps["placeholder"], + historyLength: number, +) { + if (placeholder) { + return placeholder; + } + + return historyLength === 0 + ? "Ask anything, '@' to add context" + : "Ask a follow-up"; +} + +/** + * This function is called only once, so we need to use refs to pass in the latest values + */ +export function createEditorConfig(options: { + props: TipTapEditorProps; + ideMessenger: IIdeMessenger; + dispatch: AppDispatch; +}) { + const { props, ideMessenger, dispatch } = options; + + const posthog = usePostHog(); + + // #region Selectors + const { getSubmenuContextItems } = useSubmenuContextProviders(); + const defaultModel = useAppSelector(selectDefaultModel); + const isStreaming = useAppSelector((state) => state.session.isStreaming); + const useActiveFile = useAppSelector(selectUseActiveFile); + const historyLength = useAppSelector((store) => store.session.history.length); + const isInEditMode = useAppSelector(selectIsInEditMode); + const hasCodeToEdit = useAppSelector(selectHasCodeToEdit); + const isEditModeAndNoCodeToEdit = isInEditMode && !hasCodeToEdit; + // #endregion + + // #region Refs + const inSubmenuRef = useRef(undefined); + const inDropdownRef = useRef(false); + const defaultModelRef = useUpdatingRef(defaultModel); + const isStreamingRef = useUpdatingRef(isStreaming); + const isInEditModeRef = useUpdatingRef(isInEditMode); + const getSubmenuContextItemsRef = useUpdatingRef(getSubmenuContextItems); + const availableContextProvidersRef = useUpdatingRef( + props.availableContextProviders, + ); + const historyLengthRef = useUpdatingRef(historyLength); + const availableSlashCommandsRef = useUpdatingRef( + props.availableSlashCommands, + ); + const { prevRef, nextRef, addRef } = useInputHistory(props.historyKey); + + // #endregion + + const enterSubmenu = async (editor: Editor, providerId: string) => { + const contents = editor.getText(); + const indexOfAt = contents.lastIndexOf("@"); + if (indexOfAt === -1) { + return; + } + + // Find the position of the last @ character + // We do this because editor.getText() isn't a correct representation including node views + let startPos = editor.state.selection.anchor; + while ( + startPos > 0 && + editor.state.doc.textBetween(startPos, startPos + 1) !== "@" + ) { + startPos--; + } + startPos++; + + editor.commands.deleteRange({ + from: startPos, + to: editor.state.selection.anchor, + }); + inSubmenuRef.current = providerId; + + // to trigger refresh of suggestions + editor.commands.insertContent(":"); + editor.commands.deleteRange({ + from: editor.state.selection.anchor - 1, + to: editor.state.selection.anchor, + }); + }; + + const onClose = () => { + inSubmenuRef.current = undefined; + inDropdownRef.current = false; + }; + + const onOpen = () => { + inDropdownRef.current = true; + }; + + const editor: Editor | null = useEditor({ + extensions: [ + Document, + History, + Image.extend({ + addProseMirrorPlugins() { + const plugin = new Plugin({ + props: { + handleDOMEvents: { + paste(view, event) { + const model = defaultModelRef.current; + if (!model) return; + const items = event.clipboardData?.items; + if (items) { + for (const item of items) { + const file = item.getAsFile(); + file && + modelSupportsImages( + model.provider, + model.model, + model.title, + model.capabilities, + ) && + handleImageFile(ideMessenger, file).then((resp) => { + if (!resp) return; + const [img, dataUrl] = resp; + const { schema } = view.state; + const node = schema.nodes.image.create({ + src: dataUrl, + }); + const tr = view.state.tr.insert(0, node); + view.dispatch(tr); + }); + } + } + }, + }, + }, + }); + return [plugin]; + }, + }).configure({ + HTMLAttributes: { + class: "object-contain max-h-[210px] max-w-full mx-1", + }, + }), + Placeholder.configure({ + placeholder: getPlaceholderText( + props.placeholder, + historyLengthRef.current, + ), + }), + Paragraph.extend({ + addKeyboardShortcuts() { + return { + Enter: () => { + if (inDropdownRef.current) { + return false; + } + + onEnterRef.current({ + useCodebase: false, + noContext: !useActiveFile, + }); + return true; + }, + + "Mod-Enter": () => { + onEnterRef.current({ + useCodebase: true, + noContext: !useActiveFile, + }); + return true; + }, + "Alt-Enter": () => { + posthog.capture("gui_use_active_file_enter"); + + onEnterRef.current({ + useCodebase: false, + noContext: !!useActiveFile, + }); + + return true; + }, + "Mod-Backspace": () => { + // If you press cmd+backspace wanting to cancel, + // but are inside of a text box, it shouldn't + // delete the text + if (isStreamingRef.current) { + return true; + } + return false; + }, + "Shift-Enter": () => + this.editor.commands.first(({ commands }) => [ + () => commands.newlineInCode(), + () => commands.createParagraphNear(), + () => commands.liftEmptyBlock(), + () => commands.splitBlock(), + ]), + + ArrowUp: () => { + if (this.editor.state.selection.anchor > 1) { + return false; + } + + const previousInput = prevRef.current( + this.editor.state.toJSON().doc, + ); + if (previousInput) { + this.editor.commands.setContent(previousInput); + setTimeout(() => { + this.editor.commands.blur(); + this.editor.commands.focus("start"); + }, 0); + return true; + } + return false; + }, + Escape: () => { + if (inDropdownRef.current || !isInEditModeRef.current) { + ideMessenger.post("focusEditor", undefined); + return true; + } + (async () => { + await dispatch( + loadLastSession({ + saveCurrentSession: false, + }), + ); + dispatch(exitEditMode()); + })(); + + return true; + }, + ArrowDown: () => { + if ( + this.editor.state.selection.anchor < + this.editor.state.doc.content.size - 1 + ) { + return false; + } + const nextInput = nextRef.current(); + if (nextInput) { + this.editor.commands.setContent(nextInput); + setTimeout(() => { + this.editor.commands.blur(); + this.editor.commands.focus("end"); + }, 0); + return true; + } + return false; + }, + }; + }, + }).configure({ + HTMLAttributes: { + class: "my-1", + }, + }), + Text, + Mention.configure({ + HTMLAttributes: { + class: "mention", + }, + suggestion: getContextProviderDropdownOptions( + availableContextProvidersRef, + getSubmenuContextItemsRef, + enterSubmenu, + onClose, + onOpen, + inSubmenuRef, + ideMessenger, + ), + renderHTML: (props) => { + return `@${props.node.attrs.label || props.node.attrs.id}`; + }, + }), + + AddCodeToEdit.configure({ + HTMLAttributes: { + class: "add-code-to-edit", + }, + suggestion: { + ...getContextProviderDropdownOptions( + availableContextProvidersRef, + getSubmenuContextItemsRef, + enterSubmenu, + onClose, + onOpen, + inSubmenuRef, + ideMessenger, + ), + allow: () => isInEditModeRef.current, + command: async ({ editor, range, props }) => { + editor.chain().focus().insertContentAt(range, "").run(); + const filepath = props.id; + const contents = await ideMessenger.ide.readFile(filepath); + dispatch( + addCodeToEdit({ + filepath, + contents, + }), + ); + }, + items: async ({ query }) => { + // Only display files in the dropdown + const results = getSubmenuContextItemsRef.current("file", query); + return results.map((result) => ({ + ...result, + label: result.title, + type: "file", + query: result.id, + icon: result.icon, + })); + }, + }, + }), + props.availableSlashCommands.length + ? SlashCommand.configure({ + HTMLAttributes: { + class: "mention", + }, + suggestion: getSlashCommandDropdownOptions( + availableSlashCommandsRef, + onClose, + onOpen, + ideMessenger, + ), + renderText: (props) => { + return props.node.attrs.label; + }, + }) + : MockExtension, + CodeBlockExtension, + ], + editorProps: { + attributes: { + class: "outline-none -mt-1 overflow-hidden", + style: `font-size: ${getFontSize()}px;`, + }, + }, + content: props.editorState, + editable: !isStreaming || props.isMainInput, + }); + + const onEnterRef = useUpdatingRef( + (modifiers: InputModifiers) => { + if (!editor) { + return; + } + if (isStreaming || isEditModeAndNoCodeToEdit) { + return; + } + + const json = editor.getJSON(); + + // Don't do anything if input box is empty + if (!json.content?.some((c) => c.content)) { + return; + } + + if (props.isMainInput) { + addRef.current(json); + } + + props.onEnter(json, modifiers, editor); + }, + [props.onEnter, editor, props.isMainInput], + ); + + return { editor, onEnterRef }; +} diff --git a/gui/src/components/mainInput/tiptap/imageUtils.ts b/gui/src/components/mainInput/tiptap/imageUtils.ts new file mode 100644 index 00000000000..0803e5ab8b7 --- /dev/null +++ b/gui/src/components/mainInput/tiptap/imageUtils.ts @@ -0,0 +1,73 @@ +import { IIdeMessenger } from "../../../context/IdeMessenger"; + +const IMAGE_RESOLUTION = 1024; + +export function getDataUrlForFile( + file: File, + img: HTMLImageElement, +): string | undefined { + const targetWidth = IMAGE_RESOLUTION; + const targetHeight = IMAGE_RESOLUTION; + const scaleFactor = Math.min( + targetWidth / img.width, + targetHeight / img.height, + ); + + const canvas = document.createElement("canvas"); + canvas.width = img.width * scaleFactor; + canvas.height = img.height * scaleFactor; + + const ctx = canvas.getContext("2d"); + if (!ctx) { + console.error("Error getting image data url: 2d context not found"); + return; + } + ctx.drawImage(img, 0, 0, canvas.width, canvas.height); + + const downsizedDataUrl = canvas.toDataURL("image/jpeg", 0.7); + return downsizedDataUrl; +} + +export async function handleImageFile( + ideMessenger: IIdeMessenger, + file: File, +): Promise<[HTMLImageElement, string] | undefined> { + let filesize = file.size / 1024 / 1024; // filesize in MB + // check image type and size + if ( + [ + "image/jpeg", + "image/jpg", + "image/png", + "image/gif", + "image/svg", + "image/webp", + ].includes(file.type) && + filesize < 10 + ) { + // check dimensions + let _URL = window.URL || window.webkitURL; + let img = new window.Image(); + img.src = _URL.createObjectURL(file); + + return await new Promise((resolve) => { + img.onload = function () { + const dataUrl = getDataUrlForFile(file, img); + if (!dataUrl) { + return; + } + + let image = new window.Image(); + image.src = dataUrl; + image.onload = function () { + resolve([image, dataUrl]); + }; + }; + }); + } else { + ideMessenger.post("showToast", [ + "error", + "Images need to be in jpg or png format and less than 10MB in size.", + ]); + } +} From ccd19335fe6b5285c08df0603c268b7880b9c4bf Mon Sep 17 00:00:00 2001 From: Nate Date: Thu, 20 Mar 2025 23:38:15 -0700 Subject: [PATCH 012/112] organize keyHandlers --- .../mainInput/tiptap/TipTapEditor.tsx | 58 ++++--------------- .../mainInput/tiptap/keyHandlers.ts | 50 ++++++++++++++++ 2 files changed, 60 insertions(+), 48 deletions(-) create mode 100644 gui/src/components/mainInput/tiptap/keyHandlers.ts diff --git a/gui/src/components/mainInput/tiptap/TipTapEditor.tsx b/gui/src/components/mainInput/tiptap/TipTapEditor.tsx index d1ae79f47a6..3cddb3710ce 100644 --- a/gui/src/components/mainInput/tiptap/TipTapEditor.tsx +++ b/gui/src/components/mainInput/tiptap/TipTapEditor.tsx @@ -2,14 +2,7 @@ import { Editor, EditorContent, JSONContent } from "@tiptap/react"; import { ContextProviderDescription, InputModifiers } from "core"; import { rifWithContentsToContextItem } from "core/commands/util"; import { modelSupportsImages } from "core/llm/autodetect"; -import { debounce } from "lodash"; -import { - KeyboardEvent, - useCallback, - useContext, - useEffect, - useState, -} from "react"; +import { useCallback, useContext, useEffect, useState } from "react"; import { IdeMessengerContext } from "../../../context/IdeMessenger"; import useIsOSREnabled from "../../../hooks/useIsOSREnabled"; import useUpdatingRef from "../../../hooks/useUpdatingRef"; @@ -23,16 +16,12 @@ import { setNewestCodeblocksForInput, } from "../../../redux/slices/sessionSlice"; import { loadSession, saveCurrentSession } from "../../../redux/thunks/session"; -import { isJetBrains, isMetaEquivalentKeyPressed } from "../../../util"; import InputToolbar, { ToolbarOptions } from "../InputToolbar"; import { ComboBoxItem } from "../types"; -import { - handleJetBrainsOSRMetaKeyIssues, - handleVSCMetaKeyIssues, -} from "../util/handleMetaKeyIssues"; import { DragOverlay } from "./DragOverlay"; import { createEditorConfig, getPlaceholderText } from "./editorConfig"; import { handleImageFile } from "./imageUtils"; +import { useEditorEventHandlers } from "./keyHandlers"; import { InputBoxDiv } from "./StyledComponents"; import "./TipTapEditor.css"; @@ -73,9 +62,6 @@ function TipTapEditor(props: TipTapEditorProps) { }); const [shouldHideToolbar, setShouldHideToolbar] = useState(false); - const debouncedShouldHideToolbar = debounce((value) => { - setShouldHideToolbar(value); - }, 200); useEffect(() => { if (!editor) { @@ -119,38 +105,6 @@ function TipTapEditor(props: TipTapEditorProps) { const editorFocusedRef = useUpdatingRef(editor?.isFocused, [editor]); - /** - * This handles various issues with meta key actions - * - In JetBrains, when using OSR in JCEF, there is a bug where using the meta key to - * highlight code using arrow keys is not working - * - In VS Code, while working with .ipynb files there is a problem where copy/paste/cut will affect - * the actual notebook cells, even when performing them in our GUI - * - * Currently keydown events for a number of keys are not registering if the - * meta/shift key is pressed, for example "x", "c", "v", "z", etc. - * Until this is resolved we can't turn on OSR for non-Mac users due to issues - * with those key actions. - */ - const handleKeyDown = async (e: KeyboardEvent) => { - if (!editor) { - return; - } - - setActiveKey(e.key); - - if (!editorFocusedRef?.current || !isMetaEquivalentKeyPressed(e)) return; - - if (isOSREnabled) { - handleJetBrainsOSRMetaKeyIssues(e, editor); - } else if (!isJetBrains()) { - await handleVSCMetaKeyIssues(e, editor); - } - }; - - const handleKeyUp = () => { - setActiveKey(null); - }; - useEffect(() => { if (props.isMainInput) { /** @@ -386,6 +340,14 @@ function TipTapEditor(props: TipTapEditorProps) { [editor], ); + const { handleKeyUp, handleKeyDown } = useEditorEventHandlers({ + editor, + isOSREnabled: isOSREnabled, + editorFocusedRef, + isInEditMode, + setActiveKey, + }); + return ( ; + isInEditMode: boolean; + setActiveKey: (key: string | null) => void; +}) { + const { editor, isOSREnabled, editorFocusedRef, isInEditMode, setActiveKey } = + options; + + /** + * This handles various issues with meta key actions + * - In JetBrains, when using OSR in JCEF, there is a bug where using the meta key to + * highlight code using arrow keys is not working + * - In VS Code, while working with .ipynb files there is a problem where copy/paste/cut will affect + * the actual notebook cells, even when performing them in our GUI + * + * Currently keydown events for a number of keys are not registering if the + * meta/shift key is pressed, for example "x", "c", "v", "z", etc. + * Until this is resolved we can't turn on OSR for non-Mac users due to issues + * with those key actions. + */ + const handleKeyDown = async (e: KeyboardEvent) => { + if (!editor) { + return; + } + + setActiveKey(e.key); + + if (!editorFocusedRef?.current || !isMetaEquivalentKeyPressed(e)) return; + + if (isOSREnabled) { + handleJetBrainsOSRMetaKeyIssues(e, editor); + } else if (!isJetBrains()) { + await handleVSCMetaKeyIssues(e, editor); + } + }; + + const handleKeyUp = () => setActiveKey(null); + + return { handleKeyDown, handleKeyUp }; +} From d72005b9faa1ed6489fab5a046170267026020e5 Mon Sep 17 00:00:00 2001 From: Nate Date: Thu, 20 Mar 2025 23:44:48 -0700 Subject: [PATCH 013/112] refactor out webview listeners --- .../mainInput/tiptap/TipTapEditor.tsx | 192 +--------------- .../mainInput/tiptap/useWebviewListeners.ts | 211 ++++++++++++++++++ 2 files changed, 219 insertions(+), 184 deletions(-) create mode 100644 gui/src/components/mainInput/tiptap/useWebviewListeners.ts diff --git a/gui/src/components/mainInput/tiptap/TipTapEditor.tsx b/gui/src/components/mainInput/tiptap/TipTapEditor.tsx index 3cddb3710ce..72e5ab74988 100644 --- a/gui/src/components/mainInput/tiptap/TipTapEditor.tsx +++ b/gui/src/components/mainInput/tiptap/TipTapEditor.tsx @@ -1,21 +1,16 @@ import { Editor, EditorContent, JSONContent } from "@tiptap/react"; import { ContextProviderDescription, InputModifiers } from "core"; -import { rifWithContentsToContextItem } from "core/commands/util"; import { modelSupportsImages } from "core/llm/autodetect"; import { useCallback, useContext, useEffect, useState } from "react"; import { IdeMessengerContext } from "../../../context/IdeMessenger"; import useIsOSREnabled from "../../../hooks/useIsOSREnabled"; import useUpdatingRef from "../../../hooks/useUpdatingRef"; -import { useWebviewListener } from "../../../hooks/useWebviewListener"; import { useAppDispatch, useAppSelector } from "../../../redux/hooks"; import { selectDefaultModel } from "../../../redux/slices/configSlice"; import { - clearCodeToEdit, selectIsInEditMode, setMainEditorContentTrigger, - setNewestCodeblocksForInput, } from "../../../redux/slices/sessionSlice"; -import { loadSession, saveCurrentSession } from "../../../redux/thunks/session"; import InputToolbar, { ToolbarOptions } from "../InputToolbar"; import { ComboBoxItem } from "../types"; import { DragOverlay } from "./DragOverlay"; @@ -24,6 +19,7 @@ import { handleImageFile } from "./imageUtils"; import { useEditorEventHandlers } from "./keyHandlers"; import { InputBoxDiv } from "./StyledComponents"; import "./TipTapEditor.css"; +import { useWebviewListeners } from "./useWebviewListeners"; export interface TipTapEditorProps { availableContextProviders: ContextProviderDescription[]; @@ -138,187 +134,15 @@ function TipTapEditor(props: TipTapEditorProps) { }, [editor, props.isMainInput, mainInputContentTrigger]); // IDE event listeners - useWebviewListener( - "userInput", - async (data) => { - if (!props.isMainInput) { - return; - } - editor?.commands.insertContent(data.input); - onEnterRef.current({ useCodebase: false, noContext: true }); - }, - [editor, onEnterRef.current, props.isMainInput], - ); - - useWebviewListener("jetbrains/editorInsetRefresh", async () => { - editor?.chain().clearContent().focus().run(); + useWebviewListeners({ + editor, + onEnterRef, + dispatch, + historyLength, + props, + editorFocusedRef, }); - useWebviewListener( - "focusContinueInput", - async (data) => { - if (!props.isMainInput) { - return; - } - - dispatch(clearCodeToEdit()); - - if (historyLength > 0) { - await dispatch( - saveCurrentSession({ - openNewSession: false, - generateTitle: true, - }), - ); - } - setTimeout(() => { - editor?.commands.blur(); - editor?.commands.focus("end"); - }, 20); - }, - [historyLength, editor, props.isMainInput], - ); - - useWebviewListener( - "focusContinueInputWithoutClear", - async () => { - if (!props.isMainInput) { - return; - } - setTimeout(() => { - editor?.commands.focus("end"); - }, 20); - }, - [editor, props.isMainInput], - ); - - useWebviewListener( - "focusContinueInputWithNewSession", - async () => { - if (!props.isMainInput) { - return; - } - await dispatch( - saveCurrentSession({ - openNewSession: true, - generateTitle: true, - }), - ); - setTimeout(() => { - editor?.commands.focus("end"); - }, 20); - }, - [editor, props.isMainInput], - ); - - useWebviewListener( - "highlightedCode", - async (data) => { - if (!props.isMainInput || !editor) { - return; - } - - const contextItem = rifWithContentsToContextItem( - data.rangeInFileWithContents, - ); - - let index = 0; - for (const el of editor.getJSON()?.content ?? []) { - if (el.attrs?.item?.name === contextItem.name) { - return; // Prevent exact duplicate code blocks - } - if (el.type === "codeBlock") { - index += 2; - } else { - break; - } - } - editor - .chain() - .insertContentAt(index, { - type: "codeBlock", - attrs: { - item: contextItem, - inputId: props.inputId, - }, - }) - .run(); - dispatch( - setNewestCodeblocksForInput({ - inputId: props.inputId, - contextItemId: contextItem.id.itemId, - }), - ); - if (data.prompt) { - editor.commands.focus("end"); - editor.commands.insertContent(data.prompt); - } - - if (data.shouldRun) { - onEnterRef.current({ useCodebase: false, noContext: true }); - } - - setTimeout(() => { - editor.commands.blur(); - editor.commands.focus("end"); - }, 20); - }, - [editor, props.isMainInput, historyLength, onEnterRef.current], - ); - - useWebviewListener( - "focusEdit", - async () => { - if (!props.isMainInput) { - return; - } - - setTimeout(() => { - editor?.commands.focus("end"); - }, 20); - }, - [editor, props.isMainInput], - ); - - useWebviewListener( - "focusEditWithoutClear", - async () => { - if (!props.isMainInput) { - return; - } - - setTimeout(() => { - editor?.commands.focus("end"); - }, 2000); - }, - [editor, props.isMainInput], - ); - - useWebviewListener( - "isContinueInputFocused", - async () => { - return props.isMainInput && !!editorFocusedRef.current; - }, - [editorFocusedRef, props.isMainInput], - !props.isMainInput, - ); - - useWebviewListener( - "focusContinueSessionId", - async (data) => { - if (!props.isMainInput || !data.sessionId) { - return; - } - await dispatch( - loadSession({ - sessionId: data.sessionId, - saveCurrentSession: true, - }), - ); - }, - [props.isMainInput], - ); - const [showDragOverMsg, setShowDragOverMsg] = useState(false); const [activeKey, setActiveKey] = useState(null); diff --git a/gui/src/components/mainInput/tiptap/useWebviewListeners.ts b/gui/src/components/mainInput/tiptap/useWebviewListeners.ts new file mode 100644 index 00000000000..3a469493958 --- /dev/null +++ b/gui/src/components/mainInput/tiptap/useWebviewListeners.ts @@ -0,0 +1,211 @@ +import { Editor } from "@tiptap/core"; +import { InputModifiers } from "core"; +import { rifWithContentsToContextItem } from "core/commands/util"; +import { MutableRefObject } from "react"; +import { useWebviewListener } from "../../../hooks/useWebviewListener"; +import { + clearCodeToEdit, + setNewestCodeblocksForInput, +} from "../../../redux/slices/sessionSlice"; +import { AppDispatch } from "../../../redux/store"; +import { loadSession, saveCurrentSession } from "../../../redux/thunks/session"; +import { TipTapEditorProps } from "./TipTapEditor"; + +export function useWebviewListeners(options: { + editor: Editor | null; + onEnterRef: MutableRefObject<(modifiers: InputModifiers) => void>; + dispatch: AppDispatch; + historyLength: number; + props: TipTapEditorProps; + editorFocusedRef: MutableRefObject; +}) { + const { + editor, + onEnterRef, + dispatch, + historyLength, + props, + editorFocusedRef, + } = options; + + useWebviewListener( + "userInput", + async (data) => { + if (!props.isMainInput) { + return; + } + editor?.commands.insertContent(data.input); + onEnterRef.current({ useCodebase: false, noContext: true }); + }, + [editor, onEnterRef.current, props.isMainInput], + ); + + useWebviewListener("jetbrains/editorInsetRefresh", async () => { + editor?.chain().clearContent().focus().run(); + }); + + useWebviewListener( + "focusContinueInput", + async (data) => { + if (!props.isMainInput) { + return; + } + + dispatch(clearCodeToEdit()); + + if (historyLength > 0) { + await dispatch( + saveCurrentSession({ + openNewSession: false, + generateTitle: true, + }), + ); + } + setTimeout(() => { + editor?.commands.blur(); + editor?.commands.focus("end"); + }, 20); + }, + [historyLength, editor, props.isMainInput], + ); + + useWebviewListener( + "focusContinueInputWithoutClear", + async () => { + if (!props.isMainInput) { + return; + } + setTimeout(() => { + editor?.commands.focus("end"); + }, 20); + }, + [editor, props.isMainInput], + ); + + useWebviewListener( + "focusContinueInputWithNewSession", + async () => { + if (!props.isMainInput) { + return; + } + await dispatch( + saveCurrentSession({ + openNewSession: true, + generateTitle: true, + }), + ); + setTimeout(() => { + editor?.commands.focus("end"); + }, 20); + }, + [editor, props.isMainInput], + ); + + useWebviewListener( + "highlightedCode", + async (data) => { + if (!props.isMainInput || !editor) { + return; + } + + const contextItem = rifWithContentsToContextItem( + data.rangeInFileWithContents, + ); + + let index = 0; + for (const el of editor.getJSON()?.content ?? []) { + if (el.attrs?.item?.name === contextItem.name) { + return; // Prevent exact duplicate code blocks + } + if (el.type === "codeBlock") { + index += 2; + } else { + break; + } + } + editor + .chain() + .insertContentAt(index, { + type: "codeBlock", + attrs: { + item: contextItem, + inputId: props.inputId, + }, + }) + .run(); + dispatch( + setNewestCodeblocksForInput({ + inputId: props.inputId, + contextItemId: contextItem.id.itemId, + }), + ); + if (data.prompt) { + editor.commands.focus("end"); + editor.commands.insertContent(data.prompt); + } + + if (data.shouldRun) { + onEnterRef.current({ useCodebase: false, noContext: true }); + } + + setTimeout(() => { + editor.commands.blur(); + editor.commands.focus("end"); + }, 20); + }, + [editor, props.isMainInput, historyLength, onEnterRef.current], + ); + + useWebviewListener( + "focusEdit", + async () => { + if (!props.isMainInput) { + return; + } + + setTimeout(() => { + editor?.commands.focus("end"); + }, 20); + }, + [editor, props.isMainInput], + ); + + useWebviewListener( + "focusEditWithoutClear", + async () => { + if (!props.isMainInput) { + return; + } + + setTimeout(() => { + editor?.commands.focus("end"); + }, 2000); + }, + [editor, props.isMainInput], + ); + + useWebviewListener( + "isContinueInputFocused", + async () => { + return props.isMainInput && !!editorFocusedRef.current; + }, + [editorFocusedRef, props.isMainInput], + !props.isMainInput, + ); + + useWebviewListener( + "focusContinueSessionId", + async (data) => { + if (!props.isMainInput || !data.sessionId) { + return; + } + await dispatch( + loadSession({ + sessionId: data.sessionId, + saveCurrentSession: true, + }), + ); + }, + [props.isMainInput], + ); +} From 15b6ccf42b14079a320f5d189d9c3c163aeccad5 Mon Sep 17 00:00:00 2001 From: Nate Date: Thu, 20 Mar 2025 23:57:58 -0700 Subject: [PATCH 014/112] add tooltip delay --- gui/src/components/gui/Tooltip.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gui/src/components/gui/Tooltip.tsx b/gui/src/components/gui/Tooltip.tsx index b1477ba73a8..e2c069df81e 100644 --- a/gui/src/components/gui/Tooltip.tsx +++ b/gui/src/components/gui/Tooltip.tsx @@ -25,7 +25,7 @@ export function ToolTip(props: any) { return ( tooltipPortalDiv && ReactDOM.createPortal( - , + , tooltipPortalDiv, ) ); From 98a321939ea1ba551025b16dc09f13e7a5e980ca Mon Sep 17 00:00:00 2001 From: Sahil Date: Fri, 21 Mar 2025 15:52:18 +0530 Subject: [PATCH 015/112] fix: add checkmark icon to indicate selected model in dropdown --- gui/src/components/modelSelection/ModelSelect.tsx | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/gui/src/components/modelSelection/ModelSelect.tsx b/gui/src/components/modelSelection/ModelSelect.tsx index 7cf854e4d07..3bda3b95ec7 100644 --- a/gui/src/components/modelSelection/ModelSelect.tsx +++ b/gui/src/components/modelSelection/ModelSelect.tsx @@ -5,6 +5,7 @@ import { CubeIcon, PlusIcon, TrashIcon, + CheckIcon, } from "@heroicons/react/24/outline"; import { useContext, useEffect, useRef, useState } from "react"; import { useDispatch } from "react-redux"; @@ -29,6 +30,7 @@ interface ModelOptionProps { idx: number; showMissingApiKeyMsg: boolean; showDelete?: boolean; + isSelected?: boolean; } interface Option { @@ -132,6 +134,7 @@ function ModelOption({ idx, showDelete, showMissingApiKeyMsg, + isSelected, }: ModelOptionProps) { const ideMessenger = useContext(IdeMessengerContext); @@ -199,6 +202,9 @@ function ModelOption({ {showDelete && ( )} + {isSelected && ( + + )}
@@ -338,6 +344,7 @@ function ModelSelect() { key={idx} showDelete={options.length > 1} showMissingApiKeyMsg={option.apiKey === ""} + isSelected={option.value === defaultModel?.title} /> ))}
From 6e68d45ee23523bed62cb680cd9d31986c65f330 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 21 Mar 2025 15:46:11 +0000 Subject: [PATCH 016/112] Bump @octokit/plugin-paginate-rest and @octokit/rest in /core Bumps [@octokit/plugin-paginate-rest](https://github.com/octokit/plugin-paginate-rest.js) to 11.4.4-cjs.2 and updates ancestor dependency [@octokit/rest](https://github.com/octokit/rest.js). These dependencies need to be updated together. Updates `@octokit/plugin-paginate-rest` from 11.3.1 to 11.4.4-cjs.2 - [Release notes](https://github.com/octokit/plugin-paginate-rest.js/releases) - [Commits](https://github.com/octokit/plugin-paginate-rest.js/compare/v11.3.1...v11.4.4-cjs.2) Updates `@octokit/rest` from 20.1.1 to 20.1.2 - [Release notes](https://github.com/octokit/rest.js/releases) - [Commits](https://github.com/octokit/rest.js/compare/v20.1.1...v20.1.2) --- updated-dependencies: - dependency-name: "@octokit/plugin-paginate-rest" dependency-type: indirect - dependency-name: "@octokit/rest" dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- core/package-lock.json | 45 +++++++++++++++++++++++------------------- 1 file changed, 25 insertions(+), 20 deletions(-) diff --git a/core/package-lock.json b/core/package-lock.json index dc398cd54b3..765c3541eaf 100644 --- a/core/package-lock.json +++ b/core/package-lock.json @@ -4309,16 +4309,18 @@ } }, "node_modules/@octokit/openapi-types": { - "version": "22.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-22.2.0.tgz", - "integrity": "sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg==" + "version": "24.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", + "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==", + "license": "MIT" }, "node_modules/@octokit/plugin-paginate-rest": { - "version": "11.3.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.3.1.tgz", - "integrity": "sha512-ryqobs26cLtM1kQxqeZui4v8FeznirUsksiA+RYemMPJ7Micju0WSkv50dBksTuZks9O5cg4wp+t8fZ/cLY56g==", + "version": "11.4.4-cjs.2", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.4.4-cjs.2.tgz", + "integrity": "sha512-2dK6z8fhs8lla5PaOTgqfCGBxgAv/le+EhPs27KklPhm1bKObpu6lXzwfUEQ16ajXzqNrKMujsFyo9K2eaoISw==", + "license": "MIT", "dependencies": { - "@octokit/types": "^13.5.0" + "@octokit/types": "^13.7.0" }, "engines": { "node": ">= 18" @@ -4339,11 +4341,12 @@ } }, "node_modules/@octokit/plugin-rest-endpoint-methods": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-13.2.2.tgz", - "integrity": "sha512-EI7kXWidkt3Xlok5uN43suK99VWqc8OaIMktY9d9+RNKl69juoTyxmLoWPIZgJYzi41qj/9zU7G/ljnNOJ5AFA==", + "version": "13.3.2-cjs.1", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-13.3.2-cjs.1.tgz", + "integrity": "sha512-VUjIjOOvF2oELQmiFpWA1aOPdawpyaCUqcEBc/UOUnj3Xp6DJGrJ1+bjUIIDzdHjnFNO6q57ODMfdEZnoBkCwQ==", + "license": "MIT", "dependencies": { - "@octokit/types": "^13.5.0" + "@octokit/types": "^13.8.0" }, "engines": { "node": ">= 18" @@ -4380,25 +4383,27 @@ } }, "node_modules/@octokit/rest": { - "version": "20.1.1", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-20.1.1.tgz", - "integrity": "sha512-MB4AYDsM5jhIHro/dq4ix1iWTLGToIGk6cWF5L6vanFaMble5jTX/UBQyiv05HsWnwUtY8JrfHy2LWfKwihqMw==", + "version": "20.1.2", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-20.1.2.tgz", + "integrity": "sha512-GmYiltypkHHtihFwPRxlaorG5R9VAHuk/vbszVoRTGXnAsY60wYLkh/E2XiFmdZmqrisw+9FaazS1i5SbdWYgA==", + "license": "MIT", "dependencies": { "@octokit/core": "^5.0.2", - "@octokit/plugin-paginate-rest": "11.3.1", + "@octokit/plugin-paginate-rest": "11.4.4-cjs.2", "@octokit/plugin-request-log": "^4.0.0", - "@octokit/plugin-rest-endpoint-methods": "13.2.2" + "@octokit/plugin-rest-endpoint-methods": "13.3.2-cjs.1" }, "engines": { "node": ">= 18" } }, "node_modules/@octokit/types": { - "version": "13.6.2", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.6.2.tgz", - "integrity": "sha512-WpbZfZUcZU77DrSW4wbsSgTPfKcp286q3ItaIgvSbBpZJlu6mnYXAkjZz6LVZPXkEvLIM8McanyZejKTYUHipA==", + "version": "13.10.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", + "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", + "license": "MIT", "dependencies": { - "@octokit/openapi-types": "^22.2.0" + "@octokit/openapi-types": "^24.2.0" } }, "node_modules/@pkgjs/parseargs": { From ade83fd0c6b3f2d3bb8175b6bdbdc0a6e9735c5b Mon Sep 17 00:00:00 2001 From: tomasz-io Date: Fri, 21 Mar 2025 09:25:02 -0700 Subject: [PATCH 017/112] fix: unnecessary dependency --- gui/src/pages/config/AccountManagement.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/gui/src/pages/config/AccountManagement.tsx b/gui/src/pages/config/AccountManagement.tsx index ade570d80d4..1b9dd80afca 100644 --- a/gui/src/pages/config/AccountManagement.tsx +++ b/gui/src/pages/config/AccountManagement.tsx @@ -8,13 +8,11 @@ import { Fragment, useContext } from "react"; import AssistantIcon from "../../components/modelSelection/platform/AssistantIcon"; import { useAuth } from "../../context/Auth"; import { IdeMessengerContext } from "../../context/IdeMessenger"; -import { useNavigationListener } from "../../hooks/useNavigationListener"; import { useAppDispatch } from "../../redux/hooks"; import { selectProfileThunk } from "../../redux/thunks/profileAndOrg"; import { ScopeSelect } from "./ScopeSelect"; export function AccountManagement({ hubEnabled }: { hubEnabled: boolean }) { - useNavigationListener(); const dispatch = useAppDispatch(); const ideMessenger = useContext(IdeMessengerContext); From d9eb118c514fc2a4364f532eb6438588fc9f712c Mon Sep 17 00:00:00 2001 From: tomasz-io Date: Fri, 21 Mar 2025 09:45:44 -0700 Subject: [PATCH 018/112] fix: remove mismatch between last selected profile and current profile --- core/config/ConfigHandler.ts | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/core/config/ConfigHandler.ts b/core/config/ConfigHandler.ts index ddff9bd40aa..7db61161a4b 100644 --- a/core/config/ConfigHandler.ts +++ b/core/config/ConfigHandler.ts @@ -387,16 +387,6 @@ export class ConfigHandler { this.ideSettingsPromise, ); - // After login, default to the first org as the selected org - try { - const orgs = await this.controlPlaneClient.listOrganizations(); - if (orgs.length) { - await this.setSelectedOrgId(orgs[0].id); - } - } catch (e) { - console.error("Failed to fetch control plane profiles: ", e); - } - this.fetchControlPlaneProfiles().catch(async (e) => { console.error("Failed to fetch control plane profiles: ", e); await this.loadLocalProfilesOnly(); From a1d84298bb532725651796017494ae89b4448509 Mon Sep 17 00:00:00 2001 From: Nate Date: Fri, 21 Mar 2025 09:45:52 -0700 Subject: [PATCH 019/112] lump v1 --- .../components/mainInput/ContinueInputBox.tsx | 8 ++- gui/src/components/mainInput/InputToolbar.tsx | 2 + .../mainInput/Lump/TopInputToolbar.tsx | 65 +++++++++++++++++++ gui/src/components/mainInput/Lump/index.tsx | 59 +++++++++++++++++ .../components/mainInput/Lump/sections.tsx | 36 ++++++++++ .../mainInput/tiptap/TipTapEditor.tsx | 5 ++ .../platform/AssistantSelect.tsx | 12 ++-- gui/src/pages/gui/Chat.tsx | 2 - 8 files changed, 180 insertions(+), 9 deletions(-) create mode 100644 gui/src/components/mainInput/Lump/TopInputToolbar.tsx create mode 100644 gui/src/components/mainInput/Lump/index.tsx create mode 100644 gui/src/components/mainInput/Lump/sections.tsx diff --git a/gui/src/components/mainInput/ContinueInputBox.tsx b/gui/src/components/mainInput/ContinueInputBox.tsx index 94058463660..aab30acf7be 100644 --- a/gui/src/components/mainInput/ContinueInputBox.tsx +++ b/gui/src/components/mainInput/ContinueInputBox.tsx @@ -1,12 +1,13 @@ import { Editor, JSONContent } from "@tiptap/react"; import { ContextItemWithId, InputModifiers } from "core"; -import { useMemo } from "react"; +import { useMemo, useState } from "react"; import styled, { keyframes } from "styled-components"; import { defaultBorderRadius, vscBackground } from ".."; import { useAppSelector } from "../../redux/hooks"; import { selectSlashCommandComboBoxInputs } from "../../redux/selectors"; import ContextItemsPeek from "./belowMainInput/ContextItemsPeek"; import { ToolbarOptions } from "./InputToolbar"; +import { Lump } from "./Lump"; import TipTapEditor from "./tiptap/TipTapEditor"; interface ContinueInputBoxProps { @@ -112,9 +113,12 @@ function ContinueInputBox(props: ContinueInputBoxProps) { } : {}; + const [lumpOpen, setLumpOpen] = useState(true); + return (
+ diff --git a/gui/src/components/mainInput/InputToolbar.tsx b/gui/src/components/mainInput/InputToolbar.tsx index d948dc2882b..2642fc0899c 100644 --- a/gui/src/components/mainInput/InputToolbar.tsx +++ b/gui/src/components/mainInput/InputToolbar.tsx @@ -83,6 +83,8 @@ interface InputToolbarProps { toolbarOptions?: ToolbarOptions; disabled?: boolean; isMainInput?: boolean; + lumpOpen: boolean; + setLumpOpen: (open: boolean) => void; } function InputToolbar(props: InputToolbarProps) { diff --git a/gui/src/components/mainInput/Lump/TopInputToolbar.tsx b/gui/src/components/mainInput/Lump/TopInputToolbar.tsx new file mode 100644 index 00000000000..a5fdebc2b4e --- /dev/null +++ b/gui/src/components/mainInput/Lump/TopInputToolbar.tsx @@ -0,0 +1,65 @@ +import { + BookOpenIcon, + ChatBubbleLeftIcon, + CubeIcon, + FolderIcon, + PencilIcon, +} from "@heroicons/react/24/outline"; +import AssistantSelect from "../../modelSelection/platform/AssistantSelect"; +import HoverItem from "../InputToolbar/HoverItem"; + +function TopToolbarIcon(props: { + tooltip: string; + icon: React.ComponentType; + itemCount?: number; + onClick: () => void; +}) { + return ( + +
+ +
+
+ ); +} + +interface TopInputProps { + selectedSection: string | null; + setSelectedSection: (value: string | null) => void; +} +export function TopInputToolbar(props: TopInputProps) { + return ( +
+
+
+ props.setSelectedSection("models")} + /> + props.setSelectedSection("rules")} + /> + props.setSelectedSection("docs")} + /> + props.setSelectedSection("prompts")} + /> + props.setSelectedSection("context")} + /> +
+ +
+
+ ); +} diff --git a/gui/src/components/mainInput/Lump/index.tsx b/gui/src/components/mainInput/Lump/index.tsx new file mode 100644 index 00000000000..be2fd54276d --- /dev/null +++ b/gui/src/components/mainInput/Lump/index.tsx @@ -0,0 +1,59 @@ +import { useState } from "react"; +import styled from "styled-components"; +import { + defaultBorderRadius, + vscCommandCenterInactiveBorder, + vscInputBackground, +} from "../.."; +import { TopInputToolbar } from "./TopInputToolbar"; +import { SelectedSection } from "./sections"; + +interface LumpProps { + open: boolean; + setOpen: (open: boolean) => void; +} + +const LumpDiv = styled.div<{ open: boolean }>` + background-color: ${vscInputBackground}; + margin-left: 4px; + margin-right: 4px; + height: ${(props) => (props.open ? "24px" : "12px")}; + border-radius: ${defaultBorderRadius} ${defaultBorderRadius} 0 0; + border-top: 1px solid ${vscCommandCenterInactiveBorder}; + border-left: 1px solid ${vscCommandCenterInactiveBorder}; + border-right: 1px solid ${vscCommandCenterInactiveBorder}; +`; + +export function Lump(props: LumpProps) { + const { open, setOpen } = props; + const [selectedSection, setSelectedSection] = useState(null); + + if (!open) { + return null; + } + + return ( +
+ +
+ {open && ( + <> + +
setOpen(false)} + className="cursor-pointer select-none px-2" + > + × +
+ + )} +
+
+ + +
+ ); +} diff --git a/gui/src/components/mainInput/Lump/sections.tsx b/gui/src/components/mainInput/Lump/sections.tsx new file mode 100644 index 00000000000..023e9a21ad8 --- /dev/null +++ b/gui/src/components/mainInput/Lump/sections.tsx @@ -0,0 +1,36 @@ +function ModelsSection() { + return
Models content
; +} + +function RulesSection() { + return
Rules content
; +} + +function DocsSection() { + return
Docs content
; +} + +function PromptsSection() { + return
Prompts content
; +} + +function ContextSection() { + return
Context content
; +} + +export function SelectedSection(props: { selectedSection: string | null }) { + switch (props.selectedSection) { + case "models": + return ; + case "rules": + return ; + case "docs": + return ; + case "prompts": + return ; + case "context": + return ; + default: + return null; + } +} diff --git a/gui/src/components/mainInput/tiptap/TipTapEditor.tsx b/gui/src/components/mainInput/tiptap/TipTapEditor.tsx index 72e5ab74988..fbe5a53b1a8 100644 --- a/gui/src/components/mainInput/tiptap/TipTapEditor.tsx +++ b/gui/src/components/mainInput/tiptap/TipTapEditor.tsx @@ -32,6 +32,8 @@ export interface TipTapEditorProps { ) => void; editorState?: JSONContent; toolbarOptions?: ToolbarOptions; + lumpOpen: boolean; + setLumpOpen: (open: boolean) => void; placeholder?: string; historyKey: string; inputId: string; @@ -226,6 +228,7 @@ function TipTapEditor(props: TipTapEditorProps) { }} >
+ {/* */}
diff --git a/gui/src/components/mainInput/Lump/index.tsx b/gui/src/components/mainInput/Lump/index.tsx index be2fd54276d..8ba6e35c827 100644 --- a/gui/src/components/mainInput/Lump/index.tsx +++ b/gui/src/components/mainInput/Lump/index.tsx @@ -17,13 +17,16 @@ const LumpDiv = styled.div<{ open: boolean }>` background-color: ${vscInputBackground}; margin-left: 4px; margin-right: 4px; - height: ${(props) => (props.open ? "24px" : "12px")}; border-radius: ${defaultBorderRadius} ${defaultBorderRadius} 0 0; border-top: 1px solid ${vscCommandCenterInactiveBorder}; border-left: 1px solid ${vscCommandCenterInactiveBorder}; border-right: 1px solid ${vscCommandCenterInactiveBorder}; `; +const TopBarContainer = styled.div` + height: 24px; +`; + export function Lump(props: LumpProps) { const { open, setOpen } = props; const [selectedSection, setSelectedSection] = useState(null); @@ -33,27 +36,22 @@ export function Lump(props: LumpProps) { } return ( -
- -
- {open && ( - <> - -
setOpen(false)} - className="cursor-pointer select-none px-2" - > - × -
- - )} -
-
- - -
+ +
+ + +
setOpen(false)} + className="cursor-pointer select-none px-2" + > + × +
+
+ +
+
); } diff --git a/gui/src/components/modelSelection/platform/AssistantSelect.tsx b/gui/src/components/modelSelection/platform/AssistantSelect.tsx index 86e11eca27d..a7f2a08ac22 100644 --- a/gui/src/components/modelSelection/platform/AssistantSelect.tsx +++ b/gui/src/components/modelSelection/platform/AssistantSelect.tsx @@ -63,7 +63,7 @@ export default function AssistantSelect() { orgSlug: selectedOrganization?.slug, }); }} - className="text-lightgray hover:bg mb-1 mr-3 flex cursor-pointer items-center gap-1 whitespace-nowrap" + className="text-lightgray hover:bg mb-1 mr-3 flex cursor-pointer select-none items-center gap-1 whitespace-nowrap" style={{ fontSize: `${getFontSize() - 3}px` }} > Create your first assistant From db05eeacb78d449d4696555f10cda4365dad6aeb Mon Sep 17 00:00:00 2001 From: Nate Date: Fri, 21 Mar 2025 09:50:45 -0700 Subject: [PATCH 021/112] highlights --- .../mainInput/Lump/TopInputToolbar.tsx | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/gui/src/components/mainInput/Lump/TopInputToolbar.tsx b/gui/src/components/mainInput/Lump/TopInputToolbar.tsx index 212cf092043..b6a6633fc12 100644 --- a/gui/src/components/mainInput/Lump/TopInputToolbar.tsx +++ b/gui/src/components/mainInput/Lump/TopInputToolbar.tsx @@ -8,16 +8,23 @@ import { import AssistantSelect from "../../modelSelection/platform/AssistantSelect"; import HoverItem from "../InputToolbar/HoverItem"; -function TopToolbarIcon(props: { +interface TopToolbarIconProps { tooltip: string; icon: React.ComponentType; itemCount?: number; onClick: () => void; -}) { + isSelected?: boolean; +} + +function TopToolbarIcon(props: TopToolbarIconProps) { return (
- +
); @@ -27,6 +34,7 @@ interface TopInputProps { selectedSection: string | null; setSelectedSection: (value: string | null) => void; } + export function TopInputToolbar(props: TopInputProps) { return (
@@ -35,6 +43,7 @@ export function TopInputToolbar(props: TopInputProps) { props.setSelectedSection( props.selectedSection === "models" ? null : "models", @@ -44,6 +53,7 @@ export function TopInputToolbar(props: TopInputProps) { props.setSelectedSection( props.selectedSection === "rules" ? null : "rules", @@ -53,6 +63,7 @@ export function TopInputToolbar(props: TopInputProps) { props.setSelectedSection( props.selectedSection === "docs" ? null : "docs", @@ -62,6 +73,7 @@ export function TopInputToolbar(props: TopInputProps) { props.setSelectedSection( props.selectedSection === "prompts" ? null : "prompts", @@ -71,6 +83,7 @@ export function TopInputToolbar(props: TopInputProps) { props.setSelectedSection( props.selectedSection === "context" ? null : "context", From c3f9204b859fd2e7b2e7b5cf78739e914609963a Mon Sep 17 00:00:00 2001 From: Nate Date: Fri, 21 Mar 2025 09:59:32 -0700 Subject: [PATCH 022/112] styles --- gui/src/components/mainInput/Lump/index.tsx | 23 +++++-------------- .../platform/AssistantSelect.tsx | 4 ++-- 2 files changed, 8 insertions(+), 19 deletions(-) diff --git a/gui/src/components/mainInput/Lump/index.tsx b/gui/src/components/mainInput/Lump/index.tsx index 8ba6e35c827..70db97266d0 100644 --- a/gui/src/components/mainInput/Lump/index.tsx +++ b/gui/src/components/mainInput/Lump/index.tsx @@ -23,10 +23,6 @@ const LumpDiv = styled.div<{ open: boolean }>` border-right: 1px solid ${vscCommandCenterInactiveBorder}; `; -const TopBarContainer = styled.div` - height: 24px; -`; - export function Lump(props: LumpProps) { const { open, setOpen } = props; const [selectedSection, setSelectedSection] = useState(null); @@ -37,19 +33,12 @@ export function Lump(props: LumpProps) { return ( -
- - -
setOpen(false)} - className="cursor-pointer select-none px-2" - > - × -
-
+
+ +
diff --git a/gui/src/components/modelSelection/platform/AssistantSelect.tsx b/gui/src/components/modelSelection/platform/AssistantSelect.tsx index a7f2a08ac22..5dafedff2f5 100644 --- a/gui/src/components/modelSelection/platform/AssistantSelect.tsx +++ b/gui/src/components/modelSelection/platform/AssistantSelect.tsx @@ -63,7 +63,7 @@ export default function AssistantSelect() { orgSlug: selectedOrganization?.slug, }); }} - className="text-lightgray hover:bg mb-1 mr-3 flex cursor-pointer select-none items-center gap-1 whitespace-nowrap" + className="hover:bg flex cursor-pointer select-none items-center gap-1 whitespace-nowrap text-gray-400" style={{ fontSize: `${getFontSize() - 3}px` }} > Create your first assistant @@ -77,7 +77,7 @@ export default function AssistantSelect() { From 46f46652ca503e86426858260a48b3b41bc2027e Mon Sep 17 00:00:00 2001 From: Nate Date: Fri, 21 Mar 2025 10:03:28 -0700 Subject: [PATCH 023/112] style --- gui/src/components/mainInput/ContinueInputBox.tsx | 2 +- gui/src/components/mainInput/Lump/index.tsx | 2 +- .../modelSelection/platform/AssistantSelect.tsx | 15 ++++++++++----- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/gui/src/components/mainInput/ContinueInputBox.tsx b/gui/src/components/mainInput/ContinueInputBox.tsx index aab30acf7be..2b91b707b5f 100644 --- a/gui/src/components/mainInput/ContinueInputBox.tsx +++ b/gui/src/components/mainInput/ContinueInputBox.tsx @@ -118,7 +118,7 @@ function ContinueInputBox(props: ContinueInputBoxProps) { return (
- + {props.isMainInput && } -
+
-
+
- {props.selectedProfile.title} -
); } @@ -66,7 +71,7 @@ export default function AssistantSelect() { className="hover:bg flex cursor-pointer select-none items-center gap-1 whitespace-nowrap text-gray-400" style={{ fontSize: `${getFontSize() - 3}px` }} > - Create your first assistant + Create your first assistant
); } @@ -77,7 +82,7 @@ export default function AssistantSelect() { From 25f82646181054eedfa44fd4c925c80222e0247f Mon Sep 17 00:00:00 2001 From: Nate Date: Fri, 21 Mar 2025 10:06:01 -0700 Subject: [PATCH 024/112] refactor sections --- gui/src/components/mainInput/Lump/index.tsx | 2 +- .../components/mainInput/Lump/sections.tsx | 36 ------------------- .../Lump/sections/ContextSection.tsx | 5 +++ .../mainInput/Lump/sections/DocsSection.tsx | 5 +++ .../mainInput/Lump/sections/ModelsSection.tsx | 5 +++ .../Lump/sections/PromptsSection.tsx | 5 +++ .../mainInput/Lump/sections/RulesSection.tsx | 5 +++ .../Lump/sections/SelectedSection.tsx | 27 ++++++++++++++ 8 files changed, 53 insertions(+), 37 deletions(-) delete mode 100644 gui/src/components/mainInput/Lump/sections.tsx create mode 100644 gui/src/components/mainInput/Lump/sections/ContextSection.tsx create mode 100644 gui/src/components/mainInput/Lump/sections/DocsSection.tsx create mode 100644 gui/src/components/mainInput/Lump/sections/ModelsSection.tsx create mode 100644 gui/src/components/mainInput/Lump/sections/PromptsSection.tsx create mode 100644 gui/src/components/mainInput/Lump/sections/RulesSection.tsx create mode 100644 gui/src/components/mainInput/Lump/sections/SelectedSection.tsx diff --git a/gui/src/components/mainInput/Lump/index.tsx b/gui/src/components/mainInput/Lump/index.tsx index e38a32285ce..3c50eef3267 100644 --- a/gui/src/components/mainInput/Lump/index.tsx +++ b/gui/src/components/mainInput/Lump/index.tsx @@ -6,7 +6,7 @@ import { vscInputBackground, } from "../.."; import { TopInputToolbar } from "./TopInputToolbar"; -import { SelectedSection } from "./sections"; +import { SelectedSection } from "./sections/SelectedSection"; interface LumpProps { open: boolean; diff --git a/gui/src/components/mainInput/Lump/sections.tsx b/gui/src/components/mainInput/Lump/sections.tsx deleted file mode 100644 index 023e9a21ad8..00000000000 --- a/gui/src/components/mainInput/Lump/sections.tsx +++ /dev/null @@ -1,36 +0,0 @@ -function ModelsSection() { - return
Models content
; -} - -function RulesSection() { - return
Rules content
; -} - -function DocsSection() { - return
Docs content
; -} - -function PromptsSection() { - return
Prompts content
; -} - -function ContextSection() { - return
Context content
; -} - -export function SelectedSection(props: { selectedSection: string | null }) { - switch (props.selectedSection) { - case "models": - return ; - case "rules": - return ; - case "docs": - return ; - case "prompts": - return ; - case "context": - return ; - default: - return null; - } -} diff --git a/gui/src/components/mainInput/Lump/sections/ContextSection.tsx b/gui/src/components/mainInput/Lump/sections/ContextSection.tsx new file mode 100644 index 00000000000..40faf0c33bd --- /dev/null +++ b/gui/src/components/mainInput/Lump/sections/ContextSection.tsx @@ -0,0 +1,5 @@ +import React from 'react'; + +export function ContextSection() { + return
Context content
; +} \ No newline at end of file diff --git a/gui/src/components/mainInput/Lump/sections/DocsSection.tsx b/gui/src/components/mainInput/Lump/sections/DocsSection.tsx new file mode 100644 index 00000000000..86c8b5fc8aa --- /dev/null +++ b/gui/src/components/mainInput/Lump/sections/DocsSection.tsx @@ -0,0 +1,5 @@ +import React from 'react'; + +export function DocsSection() { + return
Docs content
; +} \ No newline at end of file diff --git a/gui/src/components/mainInput/Lump/sections/ModelsSection.tsx b/gui/src/components/mainInput/Lump/sections/ModelsSection.tsx new file mode 100644 index 00000000000..279b3709a58 --- /dev/null +++ b/gui/src/components/mainInput/Lump/sections/ModelsSection.tsx @@ -0,0 +1,5 @@ +import React from 'react'; + +export function ModelsSection() { + return
Models content
; +} \ No newline at end of file diff --git a/gui/src/components/mainInput/Lump/sections/PromptsSection.tsx b/gui/src/components/mainInput/Lump/sections/PromptsSection.tsx new file mode 100644 index 00000000000..e7114a8c4c0 --- /dev/null +++ b/gui/src/components/mainInput/Lump/sections/PromptsSection.tsx @@ -0,0 +1,5 @@ +import React from 'react'; + +export function PromptsSection() { + return
Prompts content
; +} \ No newline at end of file diff --git a/gui/src/components/mainInput/Lump/sections/RulesSection.tsx b/gui/src/components/mainInput/Lump/sections/RulesSection.tsx new file mode 100644 index 00000000000..e329ca70cf3 --- /dev/null +++ b/gui/src/components/mainInput/Lump/sections/RulesSection.tsx @@ -0,0 +1,5 @@ +import React from 'react'; + +export function RulesSection() { + return
Rules content
; +} \ No newline at end of file diff --git a/gui/src/components/mainInput/Lump/sections/SelectedSection.tsx b/gui/src/components/mainInput/Lump/sections/SelectedSection.tsx new file mode 100644 index 00000000000..655c770fe91 --- /dev/null +++ b/gui/src/components/mainInput/Lump/sections/SelectedSection.tsx @@ -0,0 +1,27 @@ +import React from 'react'; +import { ModelsSection } from './ModelsSection'; +import { RulesSection } from './RulesSection'; +import { DocsSection } from './DocsSection'; +import { PromptsSection } from './PromptsSection'; +import { ContextSection } from './ContextSection'; + +interface SelectedSectionProps { + selectedSection: string | null; +} + +export function SelectedSection(props: SelectedSectionProps) { + switch (props.selectedSection) { + case "models": + return ; + case "rules": + return ; + case "docs": + return ; + case "prompts": + return ; + case "context": + return ; + default: + return null; + } +} \ No newline at end of file From 1aca061ec7c9609d675e42a9c9b72daf2210a597 Mon Sep 17 00:00:00 2001 From: Nate Date: Fri, 21 Mar 2025 10:07:12 -0700 Subject: [PATCH 025/112] remove editorInset --- gui/editorInset/index.html | 13 --------- gui/editorInset/vite.config.ts | 19 ------------ gui/src/editorInset/EditorInset.tsx | 45 ----------------------------- gui/src/editorInset/main.tsx | 18 ------------ 4 files changed, 95 deletions(-) delete mode 100644 gui/editorInset/index.html delete mode 100644 gui/editorInset/vite.config.ts delete mode 100644 gui/src/editorInset/EditorInset.tsx delete mode 100644 gui/src/editorInset/main.tsx diff --git a/gui/editorInset/index.html b/gui/editorInset/index.html deleted file mode 100644 index 1e6607ff2fe..00000000000 --- a/gui/editorInset/index.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - Continue - - -
- - - diff --git a/gui/editorInset/vite.config.ts b/gui/editorInset/vite.config.ts deleted file mode 100644 index fdc63bbdb84..00000000000 --- a/gui/editorInset/vite.config.ts +++ /dev/null @@ -1,19 +0,0 @@ -import react from "@vitejs/plugin-react-swc"; -import tailwindcss from "tailwindcss"; -import { defineConfig } from "vite"; - -// https://vitejs.dev/config/ -export default defineConfig({ - plugins: [react(), tailwindcss()], - build: { - // Change the output .js filename to not include a hash - rollupOptions: { - // external: ["vscode-webview"], - output: { - entryFileNames: `assets/[name].js`, - chunkFileNames: `assets/[name].js`, - assetFileNames: `assets/[name].[ext]`, - }, - }, - }, -}); diff --git a/gui/src/editorInset/EditorInset.tsx b/gui/src/editorInset/EditorInset.tsx deleted file mode 100644 index 2f6d10f8054..00000000000 --- a/gui/src/editorInset/EditorInset.tsx +++ /dev/null @@ -1,45 +0,0 @@ -import { useRef } from "react"; -import styled from "styled-components"; -import { defaultBorderRadius } from "../components"; -import TipTapEditor from "../components/mainInput/tiptap/TipTapEditor"; -import useSetup from "../hooks/useSetup"; -import { useAppSelector } from "../redux/hooks"; -import { selectSlashCommandComboBoxInputs } from "../redux/selectors"; - -const EditorInsetDiv = styled.div` - max-width: 500px; - position: relative; - display: flex; - border-radius: ${defaultBorderRadius}; - // box-shadow: 0 0 8px 0 rgba(0, 0, 0, 0.4); -`; - -function EditorInset() { - const availableSlashCommands = useAppSelector( - selectSlashCommandComboBoxInputs, - ); - const availableContextProviders = useAppSelector( - (store) => store.config.config.contextProviders, - ); - - useSetup(); - - const elementRef = useRef(null); - - return ( - - { - console.log("Enter: ", e, modifiers); - }} - historyKey="chat" - inputId="editor-inset" - /> - - ); -} - -export default EditorInset; diff --git a/gui/src/editorInset/main.tsx b/gui/src/editorInset/main.tsx deleted file mode 100644 index d15005ee79d..00000000000 --- a/gui/src/editorInset/main.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import React from "react"; -import ReactDOM from "react-dom/client"; -import { Provider } from "react-redux"; -import "../index.css"; -import { store } from "../redux/store"; - -import CustomPostHogProvider from "../hooks/CustomPostHogProvider"; -import EditorInset from "./EditorInset"; - -ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render( - - - - - - - , -); From bbff4f8497d203967e30ba2eebe9f8583cbf5941 Mon Sep 17 00:00:00 2001 From: Nate Date: Fri, 21 Mar 2025 10:12:33 -0700 Subject: [PATCH 026/112] move model roles to lump --- .../mainInput/Lump/sections/ModelsSection.tsx | 111 +++++++++++++++++- gui/src/pages/config/index.tsx | 105 +---------------- 2 files changed, 110 insertions(+), 106 deletions(-) diff --git a/gui/src/components/mainInput/Lump/sections/ModelsSection.tsx b/gui/src/components/mainInput/Lump/sections/ModelsSection.tsx index 279b3709a58..249ba77bbfe 100644 --- a/gui/src/components/mainInput/Lump/sections/ModelsSection.tsx +++ b/gui/src/components/mainInput/Lump/sections/ModelsSection.tsx @@ -1,5 +1,110 @@ -import React from 'react'; +import { ModelRole } from "@continuedev/config-yaml"; +import { ModelDescription } from "core"; +import { useContext } from "react"; +import { useAuth } from "../../../../context/Auth"; +import { IdeMessengerContext } from "../../../../context/IdeMessenger"; +import ModelRoleSelector from "../../../../pages/config/ModelRoleSelector"; +import { useAppDispatch, useAppSelector } from "../../../../redux/hooks"; +import { + selectDefaultModel, + setDefaultModel, + updateConfig, +} from "../../../../redux/slices/configSlice"; +import { isJetBrains } from "../../../../util"; export function ModelsSection() { - return
Models content
; -} \ No newline at end of file + const { selectedProfile } = useAuth(); + const dispatch = useAppDispatch(); + const ideMessenger = useContext(IdeMessengerContext); + + const config = useAppSelector((state) => state.config.config); + const jetbrains = isJetBrains(); + const selectedChatModel = useAppSelector(selectDefaultModel); + + function handleRoleUpdate(role: ModelRole, model: ModelDescription | null) { + if (!selectedProfile) { + return; + } + // Optimistic update + dispatch( + updateConfig({ + ...config, + selectedModelByRole: { + ...config.selectedModelByRole, + [role]: model, + }, + }), + ); + ideMessenger.post("config/updateSelectedModel", { + profileId: selectedProfile.id, + role, + title: model?.title ?? null, + }); + } + + // TODO use handleRoleUpdate for chat + function handleChatModelSelection(model: ModelDescription | null) { + if (!model) { + return; + } + dispatch(setDefaultModel({ title: model.title })); + } + + return ( +
+ handleChatModelSelection(model)} + /> + handleRoleUpdate("autocomplete", model)} + /> + {/* Jetbrains has a model selector inline */} + {!jetbrains && ( + handleRoleUpdate("edit", model)} + /> + )} + handleRoleUpdate("apply", model)} + /> + handleRoleUpdate("embed", model)} + /> + handleRoleUpdate("rerank", model)} + /> +
+ ); +} diff --git a/gui/src/pages/config/index.tsx b/gui/src/pages/config/index.tsx index 14128ffdae9..f966af2c0b2 100644 --- a/gui/src/pages/config/index.tsx +++ b/gui/src/pages/config/index.tsx @@ -1,4 +1,3 @@ -import { ModelRole } from "@continuedev/config-yaml"; import { Listbox, Transition } from "@headlessui/react"; import { ArrowTopRightOnSquareIcon, @@ -7,7 +6,6 @@ import { PlusCircleIcon, XMarkIcon, } from "@heroicons/react/24/outline"; -import { ModelDescription } from "core"; import { SharedConfigSchema, modifyAnyConfigWithSharedConfig, @@ -24,15 +22,10 @@ import { useAuth } from "../../context/Auth"; import { IdeMessengerContext } from "../../context/IdeMessenger"; import { useNavigationListener } from "../../hooks/useNavigationListener"; import { useAppDispatch, useAppSelector } from "../../redux/hooks"; -import { - selectDefaultModel, - setDefaultModel, - updateConfig, -} from "../../redux/slices/configSlice"; +import { updateConfig } from "../../redux/slices/configSlice"; import { selectProfileThunk } from "../../redux/thunks/profileAndOrg"; -import { getFontSize, isJetBrains } from "../../util"; +import { getFontSize } from "../../util"; import { AccountButton } from "./AccountButton"; -import ModelRoleSelector from "./ModelRoleSelector"; import { ScopeSelect } from "./ScopeSelect"; function ConfigPage() { @@ -76,7 +69,6 @@ function ConfigPage() { /////// User settings section ////// const config = useAppSelector((state) => state.config.config); - const selectedChatModel = useAppSelector(selectDefaultModel); function handleUpdate(sharedConfig: SharedConfigSchema) { // Optimistic update @@ -89,35 +81,6 @@ function ConfigPage() { ideMessenger.post("config/updateSharedConfig", sharedConfig); } - function handleRoleUpdate(role: ModelRole, model: ModelDescription | null) { - if (!selectedProfile) { - return; - } - // Optimistic update - dispatch( - updateConfig({ - ...config, - selectedModelByRole: { - ...config.selectedModelByRole, - [role]: model, - }, - }), - ); - ideMessenger.post("config/updateSelectedModel", { - profileId: selectedProfile.id, - role, - title: model?.title ?? null, - }); - } - - // TODO use handleRoleUpdate for chat - function handleChatModelSelection(model: ModelDescription | null) { - if (!model) { - return; - } - dispatch(setDefaultModel({ title: model.title })); - } - // TODO defaults are in multiple places, should be consolidated and probably not explicit here const showSessionTabs = config.ui?.showSessionTabs ?? false; const codeWrap = config.ui?.codeWrap ?? false; @@ -178,8 +141,6 @@ function ConfigPage() { setFormPromptPath(promptPath); }, [promptPath]); - const jetbrains = isJetBrains(); - return (
- {/* Model Roles as a separate section */} -
-
-

Model Roles

-
- handleChatModelSelection(model)} - /> - handleRoleUpdate("autocomplete", model)} - /> - {/* Jetbrains has a model selector inline */} - {!jetbrains && ( - handleRoleUpdate("edit", model)} - /> - )} - handleRoleUpdate("apply", model)} - /> - handleRoleUpdate("embed", model)} - /> - handleRoleUpdate("rerank", model)} - /> -
-
-
- {!controlServerBetaEnabled || hubEnabled ? (
From 2c0582dc086a618b6218e372b8501609449f42a3 Mon Sep 17 00:00:00 2001 From: Dallin Romney Date: Fri, 21 Mar 2025 10:14:07 -0700 Subject: [PATCH 027/112] MCP servers section in more page --- core/config/load.ts | 12 +- core/config/profile/doLoadConfig.ts | 4 +- core/config/yaml/loadYaml.ts | 2 +- core/context/mcp/index.ts | 45 +++-- core/core.ts | 9 +- core/index.d.ts | 18 ++ core/protocol/core.ts | 6 + core/protocol/passThrough.ts | 1 + .../constants/MessageTypes.kt | 1 + gui/src/pages/More/MCPServersPreview.tsx | 180 ++++++++++++++++++ gui/src/pages/More/More.tsx | 5 + gui/src/redux/slices/configSlice.ts | 1 + 12 files changed, 257 insertions(+), 27 deletions(-) create mode 100644 gui/src/pages/More/MCPServersPreview.tsx diff --git a/core/config/load.ts b/core/config/load.ts index de14a8f0241..6597b86ae85 100644 --- a/core/config/load.ts +++ b/core/config/load.ts @@ -545,11 +545,13 @@ async function intermediateToFinalConfig( // Trigger MCP server refreshes (Config is reloaded again once connected!) const mcpManager = MCPManagerSingleton.getInstance(); mcpManager.setConnections( - (config.experimental?.modelContextProtocolServers ?? []).map((server) => ({ - id: JSON.stringify(server), - name: "MCP Server", - ...server, - })), + (config.experimental?.modelContextProtocolServers ?? []).map( + (server, index) => ({ + id: `continue-mcp-server-${index + 1}`, + name: `MCP Server ${index + 1}`, + ...server, + }), + ), false, ); diff --git a/core/config/profile/doLoadConfig.ts b/core/config/profile/doLoadConfig.ts index 10e4e73e990..8065718d92a 100644 --- a/core/config/profile/doLoadConfig.ts +++ b/core/config/profile/doLoadConfig.ts @@ -149,7 +149,7 @@ export default async function doLoadConfig( const submenuItems = server.resources.map((resource) => ({ title: resource.name, - description: resource.description, + description: resource.description ?? resource.name, id: resource.uri, icon: server.faviconUrl, })); @@ -176,7 +176,7 @@ export default async function doLoadConfig( if (count > 1) { errors.push({ fatal: false, - message: `Duplicate tool name ${toolName} detected (${count} tools). Permissions will conflict and usage may be unpredictable`, + message: `Duplicate (${count}) tools named "${toolName}" detected. Permissions will conflict and usage may be unpredictable`, }); } }); diff --git a/core/config/yaml/loadYaml.ts b/core/config/yaml/loadYaml.ts index 4aba17ae4c6..1830c80edc8 100644 --- a/core/config/yaml/loadYaml.ts +++ b/core/config/yaml/loadYaml.ts @@ -373,7 +373,7 @@ async function configYamlToContinueConfig( const mcpManager = MCPManagerSingleton.getInstance(); mcpManager.setConnections( (config.mcpServers ?? []).map((server) => ({ - id: JSON.stringify(server), + id: server.name, name: server.name, transport: { type: "stdio", diff --git a/core/context/mcp/index.ts b/core/context/mcp/index.ts index c546c3bdf43..e48d733197d 100644 --- a/core/context/mcp/index.ts +++ b/core/context/mcp/index.ts @@ -8,7 +8,9 @@ import { MCPConnectionStatus, MCPOptions, MCPPrompt, + MCPResource, MCPServerStatus, + MCPTool, } from "../.."; export class MCPManagerSingleton { @@ -52,9 +54,12 @@ export class MCPManagerSingleton { } setConnections(servers: MCPOptions[], forceRefresh: boolean) { + let refresh = false; + // Remove any connections that are no longer in config - this.connections.entries().forEach(([id, connection]) => { + Array.from(this.connections.entries()).forEach(([id, connection]) => { if (!servers.find((s) => s.id === id)) { + refresh = true; connection.abortController.abort(); void connection.client.close(); this.connections.delete(id); @@ -64,12 +69,26 @@ export class MCPManagerSingleton { // Add any connections that are not yet in manager servers.forEach((server) => { if (!this.connections.has(server.id)) { + refresh = true; this.connections.set(server.id, new MCPConnection(server)); } }); // NOTE the id is made by stringifying the options - void this.refreshConnections(forceRefresh); + if (refresh) { + void this.refreshConnections(forceRefresh); + } + } + + async refreshConnection(serverId: string) { + const connection = this.connections.get(serverId); + if (!connection) { + throw new Error(`MCP Connection ${serverId} not found`); + } + await connection.connectClient(true, this.abortController.signal); + if (this.onConnectionsRefreshed) { + this.onConnectionsRefreshed(); + } } async refreshConnections(force: boolean) { @@ -83,7 +102,7 @@ export class MCPManagerSingleton { }), (async () => { await Promise.all( - this.connections.values().map(async (connection) => { + Array.from(this.connections.values()).map(async (connection) => { await connection.connectClient(force, this.abortController.signal); }), ); @@ -95,23 +114,13 @@ export class MCPManagerSingleton { } getStatuses(): (MCPServerStatus & { client: Client })[] { - return Array.from( - this.connections.values().map((connection) => ({ - ...connection.getStatus(), - client: connection.client, - })), - ); + return Array.from(this.connections.values()).map((connection) => ({ + ...connection.getStatus(), + client: connection.client, + })); } } -interface MCPTool { - name: string; - description?: string; - inputSchema: {}; -} - -type MCPResources = Awaited>["resources"]; - const DEFAULT_MCP_TIMEOUT = 20_000; // 10 seconds class MCPConnection { @@ -126,7 +135,7 @@ class MCPConnection { public prompts: MCPPrompt[] = []; public tools: MCPTool[] = []; - public resources: MCPResources = []; + public resources: MCPResource[] = []; constructor(private readonly options: MCPOptions) { this.transport = this.constructTransport(options); diff --git a/core/core.ts b/core/core.ts index aa056169760..f011ccd952b 100644 --- a/core/core.ts +++ b/core/core.ts @@ -122,7 +122,11 @@ export class Core { ); const mcpManager = MCPManagerSingleton.getInstance(); - mcpManager.onConnectionsRefreshed = this.configHandler.reloadConfig; + mcpManager.onConnectionsRefreshed = async () => { + // This ensures that it triggers a NEW load after waiting for config promise to finish + await this.configHandler.loadConfig(); + await this.configHandler.reloadConfig(); + }; this.configHandler.onConfigUpdate(async (result) => { const serializedResult = await this.configHandler.getSerializedConfig(); @@ -348,6 +352,9 @@ export class Core { return await this.configHandler.listOrganizations(); }); + on("mcp/reloadServer", async (msg) => { + mcpManager.refreshConnection(msg.data.id); + }); // Context providers on("context/addDocs", async (msg) => { void this.docsService.indexAndAdd(msg.data); diff --git a/core/index.d.ts b/core/index.d.ts index 37d17296b02..6a6614b6137 100644 --- a/core/index.d.ts +++ b/core/index.d.ts @@ -1070,6 +1070,24 @@ export interface MCPPrompt { }[]; } +// Leaving here to ideate on +// export type ContinueConfigSource = "local-yaml" | "local-json" | "hub-assistant" | "hub" + +export interface MCPResource { + name: string; + uri: string; + description?: string; + mimeType?: string; +} +export interface MCPTool { + name: string; + description?: string; + inputSchema: { + type: "object"; + properties?: Record; + }; +} + export interface MCPServerStatus extends MCPOptions { status: MCPConnectionStatus; errors: string[]; diff --git a/core/protocol/core.ts b/core/protocol/core.ts index 3ab9f14487a..09d5ba5a9c8 100644 --- a/core/protocol/core.ts +++ b/core/protocol/core.ts @@ -94,6 +94,12 @@ export type ToCoreFromIdeOrWebviewProtocol = { }, ContextItemWithId[], ]; + "mcp/reloadServer": [ + { + id: string; + }, + void, + ]; "context/getSymbolsForFiles": [{ uris: string[] }, FileSymbolMap]; "context/loadSubmenuItems": [{ title: string }, ContextSubmenuItem[]]; "autocomplete/complete": [AutocompleteInput, string[]]; diff --git a/core/protocol/passThrough.ts b/core/protocol/passThrough.ts index 30cf5417c29..b4cf5185b78 100644 --- a/core/protocol/passThrough.ts +++ b/core/protocol/passThrough.ts @@ -26,6 +26,7 @@ export const WEBVIEW_TO_CORE_PASS_THROUGH: (keyof ToCoreFromWebviewProtocol)[] = "config/openProfile", "config/updateSharedConfig", "config/updateSelectedModel", + "mcp/reloadServer", "context/getContextItems", "context/getSymbolsForFiles", "context/loadSubmenuItems", diff --git a/extensions/intellij/src/main/kotlin/com/github/continuedev/continueintellijextension/constants/MessageTypes.kt b/extensions/intellij/src/main/kotlin/com/github/continuedev/continueintellijextension/constants/MessageTypes.kt index fcf9a468b3a..7bce39c8190 100644 --- a/extensions/intellij/src/main/kotlin/com/github/continuedev/continueintellijextension/constants/MessageTypes.kt +++ b/extensions/intellij/src/main/kotlin/com/github/continuedev/continueintellijextension/constants/MessageTypes.kt @@ -94,6 +94,7 @@ class MessageTypes { "config/openProfile", "config/updateSharedConfig", "config/updateSelectedModel", + "mcp/reloadServer", "context/getContextItems", "context/getSymbolsForFiles", "context/loadSubmenuItems", diff --git a/gui/src/pages/More/MCPServersPreview.tsx b/gui/src/pages/More/MCPServersPreview.tsx new file mode 100644 index 00000000000..2cdc62e2176 --- /dev/null +++ b/gui/src/pages/More/MCPServersPreview.tsx @@ -0,0 +1,180 @@ +import { + CircleStackIcon, + CommandLineIcon, + InformationCircleIcon, + WrenchScrewdriverIcon, +} from "@heroicons/react/24/outline"; +import { MCPServerStatus } from "core"; +import { useContext } from "react"; +import { SecondaryButton } from "../../components"; +import { ToolTip } from "../../components/gui/Tooltip"; +import { IdeMessengerContext } from "../../context/IdeMessenger"; +import { useAppDispatch, useAppSelector } from "../../redux/hooks"; +import { updateConfig } from "../../redux/slices/configSlice"; + +interface MCPServerStatusProps { + server: MCPServerStatus; +} +function MCPServerPreview({ server }: MCPServerStatusProps) { + const ideMessenger = useContext(IdeMessengerContext); + const config = useAppSelector((store) => store.config.config); + const dispatch = useAppDispatch(); + const toolsTooltipId = `${server.id}-tools`; + const promptsTooltipId = `${server.id}-prompts`; + const resourcesTooltipId = `${server.id}-resources`; + const errorsTooltipId = `${server.id}-errors`; + + async function onRefresh() { + // optimistic config update + dispatch( + updateConfig({ + ...config, + mcpServerStatuses: config.mcpServerStatuses.map((s) => + s.id === server.id + ? { + ...s, + status: "connecting", + } + : s, + ), + }), + ); + ideMessenger.post("mcp/reloadServer", { + id: server.id, + }); + } + + return ( +
+

{server.name}

+
+ {server.status === "not-connected" ? ( +
+
+ Not connected +
+ ) : server.status === "connected" ? ( +
+
+ Connected +
+ ) : server.status === "connecting" ? ( +
+
+ Connecting... +
+ ) : ( +
+
+ Error + + + {server.errors.map((error, idx) => ( + {error} + ))} + {server.errors.length === 0 ? ( + No known errors + ) : null} + +
+ )} + + Refresh + +
+
+ {/* Tools */} +
+ + {`Tools: ${server.tools.length}`} +
+ + {server.tools.map((tool, idx) => ( + {tool.name} + ))} + {server.tools.length === 0 ? ( + No tools + ) : null} + + + {/* Prompts */} +
+ + {`Prompts: ${server.prompts.length}`} +
+ + {server.prompts.map((prompt, idx) => ( + {prompt.name} + ))} + {server.prompts.length === 0 ? ( + No prompts + ) : null} + + {/* Resources */} +
+ + {`Resources: ${server.resources.length}`} +
+ + {server.resources.map((resource, idx) => ( + {resource.name} + ))} + {server.resources.length === 0 ? ( + No resources + ) : null} + +
+
+ ); +} +function MCPServersPreview() { + const servers = useAppSelector( + (store) => store.config.config.mcpServerStatuses, + ); + const ideMessenger = useContext(IdeMessengerContext); + + return ( +
+
+

MCP Servers

+
+ +
+
+ {servers.length === 0 && ( + { + ideMessenger.post("config/openProfile", { + profileId: undefined, + }); + }} + > + Add MCP Servers + + )} +
+ {servers.map((server, idx) => ( + + ))} +
+
+ ); +} + +export default MCPServersPreview; diff --git a/gui/src/pages/More/More.tsx b/gui/src/pages/More/More.tsx index 0adcc1849b3..a528559bcdf 100644 --- a/gui/src/pages/More/More.tsx +++ b/gui/src/pages/More/More.tsx @@ -15,6 +15,7 @@ import { saveCurrentSession } from "../../redux/thunks/session"; import { AccountButton } from "../config/AccountButton"; import IndexingProgress from "./IndexingProgress"; import KeyboardShortcuts from "./KeyboardShortcuts"; +import MCPServersPreview from "./MCPServersPreview"; import MoreHelpRow from "./MoreHelpRow"; import { RulesPreview } from "./RulesPreview"; @@ -66,6 +67,10 @@ function MorePage() {
+
+ +
+

Help center

diff --git a/gui/src/redux/slices/configSlice.ts b/gui/src/redux/slices/configSlice.ts index 39cf8bb6006..3092f01c5ca 100644 --- a/gui/src/redux/slices/configSlice.ts +++ b/gui/src/redux/slices/configSlice.ts @@ -23,6 +23,7 @@ const EMPTY_CONFIG: BrowserSerializedContinueConfig = { contextProviders: [], models: [], tools: [], + mcpServerStatuses: [], usePlatform: true, modelsByRole: { chat: [], From 6345a415912e9c7645539bd63b060cd285eae49e Mon Sep 17 00:00:00 2001 From: Dallin Romney Date: Fri, 21 Mar 2025 10:29:23 -0700 Subject: [PATCH 028/112] mcp server UI updates --- .../InputToolbar/ToggleToolsButton.tsx | 4 +- gui/src/pages/More/MCPServersPreview.tsx | 84 +++++++++++-------- 2 files changed, 49 insertions(+), 39 deletions(-) diff --git a/gui/src/components/mainInput/InputToolbar/ToggleToolsButton.tsx b/gui/src/components/mainInput/InputToolbar/ToggleToolsButton.tsx index fd85fcc1b34..a626003f426 100644 --- a/gui/src/components/mainInput/InputToolbar/ToggleToolsButton.tsx +++ b/gui/src/components/mainInput/InputToolbar/ToggleToolsButton.tsx @@ -128,9 +128,9 @@ export default function ToolDropdown(props: ToolDropdownProps) { > -
+

{server.name}

- {server.status === "not-connected" ? ( -
-
- Not connected -
- ) : server.status === "connected" ? ( -
-
- Connected -
- ) : server.status === "connecting" ? ( -
-
- Connecting... -
- ) : ( -
-
- Error - - - {server.errors.map((error, idx) => ( - {error} - ))} - {server.errors.length === 0 ? ( - No known errors - ) : null} - -
- )} - + {server.status === "not-connected" ? ( +
+
+ Not connected +
+ ) : server.status === "connected" ? ( +
+
+ Connected +
+ ) : server.status === "connecting" ? ( +
+
+ Connecting... +
+ ) : ( +
+
+ Error +
+ )} + {server.errors.length ? ( + <> + + + {server.errors.map((error, idx) => ( + {error} + ))} + {server.errors.length === 0 ? ( + No known errors + ) : null} + + + ) : null} +
+
- Refresh - +
+ +
+ Refresh +
{/* Tools */} From b52794245ea9fc94d12a3ae8a650a5b09d232095 Mon Sep 17 00:00:00 2001 From: Nate Date: Fri, 21 Mar 2025 11:03:45 -0700 Subject: [PATCH 029/112] remove imports --- .../mainInput/Lump/sections/ContextSection.tsx | 4 +--- .../mainInput/Lump/sections/DocsSection.tsx | 4 +--- .../mainInput/Lump/sections/PromptsSection.tsx | 4 +--- .../mainInput/Lump/sections/RulesSection.tsx | 4 +--- .../mainInput/Lump/sections/SelectedSection.tsx | 13 ++++++------- 5 files changed, 10 insertions(+), 19 deletions(-) diff --git a/gui/src/components/mainInput/Lump/sections/ContextSection.tsx b/gui/src/components/mainInput/Lump/sections/ContextSection.tsx index 40faf0c33bd..7524fd08d86 100644 --- a/gui/src/components/mainInput/Lump/sections/ContextSection.tsx +++ b/gui/src/components/mainInput/Lump/sections/ContextSection.tsx @@ -1,5 +1,3 @@ -import React from 'react'; - export function ContextSection() { return
Context content
; -} \ No newline at end of file +} diff --git a/gui/src/components/mainInput/Lump/sections/DocsSection.tsx b/gui/src/components/mainInput/Lump/sections/DocsSection.tsx index 86c8b5fc8aa..9e68397c8e9 100644 --- a/gui/src/components/mainInput/Lump/sections/DocsSection.tsx +++ b/gui/src/components/mainInput/Lump/sections/DocsSection.tsx @@ -1,5 +1,3 @@ -import React from 'react'; - export function DocsSection() { return
Docs content
; -} \ No newline at end of file +} diff --git a/gui/src/components/mainInput/Lump/sections/PromptsSection.tsx b/gui/src/components/mainInput/Lump/sections/PromptsSection.tsx index e7114a8c4c0..8e9212e9a68 100644 --- a/gui/src/components/mainInput/Lump/sections/PromptsSection.tsx +++ b/gui/src/components/mainInput/Lump/sections/PromptsSection.tsx @@ -1,5 +1,3 @@ -import React from 'react'; - export function PromptsSection() { return
Prompts content
; -} \ No newline at end of file +} diff --git a/gui/src/components/mainInput/Lump/sections/RulesSection.tsx b/gui/src/components/mainInput/Lump/sections/RulesSection.tsx index e329ca70cf3..68067006ba6 100644 --- a/gui/src/components/mainInput/Lump/sections/RulesSection.tsx +++ b/gui/src/components/mainInput/Lump/sections/RulesSection.tsx @@ -1,5 +1,3 @@ -import React from 'react'; - export function RulesSection() { return
Rules content
; -} \ No newline at end of file +} diff --git a/gui/src/components/mainInput/Lump/sections/SelectedSection.tsx b/gui/src/components/mainInput/Lump/sections/SelectedSection.tsx index 655c770fe91..18e5f93c6ae 100644 --- a/gui/src/components/mainInput/Lump/sections/SelectedSection.tsx +++ b/gui/src/components/mainInput/Lump/sections/SelectedSection.tsx @@ -1,9 +1,8 @@ -import React from 'react'; -import { ModelsSection } from './ModelsSection'; -import { RulesSection } from './RulesSection'; -import { DocsSection } from './DocsSection'; -import { PromptsSection } from './PromptsSection'; -import { ContextSection } from './ContextSection'; +import { ContextSection } from "./ContextSection"; +import { DocsSection } from "./DocsSection"; +import { ModelsSection } from "./ModelsSection"; +import { PromptsSection } from "./PromptsSection"; +import { RulesSection } from "./RulesSection"; interface SelectedSectionProps { selectedSection: string | null; @@ -24,4 +23,4 @@ export function SelectedSection(props: SelectedSectionProps) { default: return null; } -} \ No newline at end of file +} From d3f4aeb4c676cc4d5e090fa2ea6e497f965a3acd Mon Sep 17 00:00:00 2001 From: Patrick Erichsen Date: Fri, 21 Mar 2025 11:04:04 -0700 Subject: [PATCH 030/112] feat: add bookmark logic --- extensions/vscode/src/VsCodeIde.ts | 2 +- .../ConversationStarterCard.tsx | 42 ++++++++++-- .../ConversationStarterCards.tsx | 43 +++++------- gui/src/components/index.ts | 4 +- .../platform/AssistantSelect.tsx | 2 +- .../platform/AssistantSelectOptions.tsx | 2 +- gui/src/context/Auth.tsx | 12 ++-- gui/src/hooks/useSetup.ts | 2 +- gui/src/pages/config/ScopeSelect.tsx | 4 +- gui/src/pages/config/index.tsx | 2 +- gui/src/pages/gui/StreamError.tsx | 2 +- gui/src/redux/slices/profiles/index.ts | 2 + gui/src/redux/slices/profiles/slice.ts | 59 +++++++++++++++++ .../profiles/thunks.ts} | 32 ++++----- gui/src/redux/slices/sessionSlice.ts | 66 ++++--------------- gui/src/redux/store.ts | 15 +++-- 16 files changed, 165 insertions(+), 126 deletions(-) create mode 100644 gui/src/redux/slices/profiles/index.ts create mode 100644 gui/src/redux/slices/profiles/slice.ts rename gui/src/redux/{thunks/profileAndOrg.ts => slices/profiles/thunks.ts} (76%) diff --git a/extensions/vscode/src/VsCodeIde.ts b/extensions/vscode/src/VsCodeIde.ts index 1aaa1028369..c324edaf268 100644 --- a/extensions/vscode/src/VsCodeIde.ts +++ b/extensions/vscode/src/VsCodeIde.ts @@ -529,7 +529,7 @@ class VsCodeIde implements IDE { const tabArray = vscode.window.tabGroups.all[0].tabs; return tabArray - .filter((t) => t.isPinned) + .filter((t) => t.isBookmarked) .map((t) => (t.input as vscode.TabInputText).uri.toString()); } diff --git a/gui/src/components/ConversationStarters/ConversationStarterCard.tsx b/gui/src/components/ConversationStarters/ConversationStarterCard.tsx index 35a205481c4..1542adadf52 100644 --- a/gui/src/components/ConversationStarters/ConversationStarterCard.tsx +++ b/gui/src/components/ConversationStarters/ConversationStarterCard.tsx @@ -1,33 +1,63 @@ -import { ChatBubbleLeftIcon } from "@heroicons/react/24/outline"; +import { BookmarkIcon, ChatBubbleLeftIcon } from "@heroicons/react/24/outline"; +import { BookmarkIcon as BookmarkIconSolid } from "@heroicons/react/24/solid"; import { SlashCommandDescription } from "core"; -import { defaultBorderRadius, vscInputBackground } from ".."; +import { useState } from "react"; +import { defaultBorderRadius, GhostButton, vscInputBackground } from ".."; interface ConversationStarterCardProps { command: SlashCommandDescription; onClick: (command: SlashCommandDescription) => void; + onBookmark: (command: SlashCommandDescription) => void; + isBookmarked: boolean; } export function ConversationStarterCard({ command, onClick, + onBookmark, + isBookmarked = false, }: ConversationStarterCardProps) { + const [isHovered, setIsHovered] = useState(false); + return (
onClick(command)} - className="mb-2 w-full shadow-md hover:cursor-pointer hover:brightness-110" + className="mb-2 w-full shadow-md hover:brightness-110" style={{ borderRadius: defaultBorderRadius, backgroundColor: vscInputBackground, }} + onMouseEnter={() => setIsHovered(true)} + onMouseLeave={() => setIsHovered(false)} > -
+
-
+
onClick(command)} + className="flex flex-1 flex-col hover:cursor-pointer" + >
{command.name}
{command.description}
+
+ { + e.stopPropagation(); + onBookmark(command); + }} + aria-label={ + isBookmarked ? "Remove bookmarked prompt" : "Bookmark prompt" + } + className={isHovered || isBookmarked ? "opacity-100" : "opacity-0"} + > + {isBookmarked ? ( + + ) : ( + + )} + +
); diff --git a/gui/src/components/ConversationStarters/ConversationStarterCards.tsx b/gui/src/components/ConversationStarters/ConversationStarterCards.tsx index 69020dae50e..8df9cd9084b 100644 --- a/gui/src/components/ConversationStarters/ConversationStarterCards.tsx +++ b/gui/src/components/ConversationStarters/ConversationStarterCards.tsx @@ -10,19 +10,13 @@ const NUM_CARDS_TO_RENDER_COLLAPSED = 3; export function ConversationStarterCards() { const dispatch = useAppDispatch(); - const [isExpanded, setIsExpanded] = useState(false); + const [bookmarkedCommands, setBookmarkedCommands] = useState([]); + const slashCommands = useAppSelector((state) => state.config.config.slashCommands) ?? []; const filteredSlashCommands = slashCommands?.filter(isDeprecatedCommandName); - const numFilteredSlashCommands = filteredSlashCommands.length; - const displayedCommands = isExpanded - ? filteredSlashCommands - : filteredSlashCommands.slice(0, NUM_CARDS_TO_RENDER_COLLAPSED); - const hasMoreCommands = - numFilteredSlashCommands > NUM_CARDS_TO_RENDER_COLLAPSED; - function onClick(command: SlashCommandDescription) { if (command.prompt) { dispatch( @@ -31,8 +25,14 @@ export function ConversationStarterCards() { } } - function handleToggleExpand() { - setIsExpanded(!isExpanded); + function handleBookmarkCommand(command: SlashCommandDescription) { + setBookmarkedCommands((prev) => { + if (prev.includes(command.name)) { + return prev.filter((name) => name !== command.name); + } else { + return [...prev, command.name]; + } + }); } if (!filteredSlashCommands || filteredSlashCommands.length === 0) { @@ -40,29 +40,18 @@ export function ConversationStarterCards() { } return ( -
-

Prompts

- -
- {displayedCommands.map((command, i) => ( +
+ {filteredSlashCommands + .slice(0, NUM_CARDS_TO_RENDER_COLLAPSED) + .map((command, i) => ( ))} -
- - {hasMoreCommands && ( -

- {isExpanded - ? "Show less" - : `Show ${numFilteredSlashCommands - NUM_CARDS_TO_RENDER_COLLAPSED} more...`} -

- )}
); } diff --git a/gui/src/components/index.ts b/gui/src/components/index.ts index 04460f3b158..eb0632646e2 100644 --- a/gui/src/components/index.ts +++ b/gui/src/components/index.ts @@ -1,5 +1,5 @@ import styled from "styled-components"; -import { getFontSize, isJetBrains } from "../util"; +import { getFontSize } from "../util"; export const VSC_INPUT_BACKGROUND_VAR = "--vscode-input-background"; export const VSC_BACKGROUND_VAR = "--vscode-sideBar-background"; @@ -151,7 +151,7 @@ export const SecondaryButton = styled.button` `; export const GhostButton = styled.button` - padding: 10px 12px; + padding: 6px 8px; margin: 8px 0; border-radius: ${defaultBorderRadius}; diff --git a/gui/src/components/modelSelection/platform/AssistantSelect.tsx b/gui/src/components/modelSelection/platform/AssistantSelect.tsx index a4dde488d20..4e1925ce47d 100644 --- a/gui/src/components/modelSelection/platform/AssistantSelect.tsx +++ b/gui/src/components/modelSelection/platform/AssistantSelect.tsx @@ -5,7 +5,7 @@ import { useContext, useEffect, useRef } from "react"; import { useAuth } from "../../../context/Auth"; import { IdeMessengerContext } from "../../../context/IdeMessenger"; import { useAppDispatch } from "../../../redux/hooks"; -import { cycleProfile } from "../../../redux/thunks/profileAndOrg"; +import { cycleProfile } from "../../../redux/slices/profiles/thunks"; import { getFontSize, isMetaEquivalentKeyPressed } from "../../../util"; import PopoverTransition from "../../mainInput/InputToolbar/PopoverTransition"; import AssistantIcon from "./AssistantIcon"; diff --git a/gui/src/components/modelSelection/platform/AssistantSelectOptions.tsx b/gui/src/components/modelSelection/platform/AssistantSelectOptions.tsx index cd8d5cd5cf1..de4db142269 100644 --- a/gui/src/components/modelSelection/platform/AssistantSelectOptions.tsx +++ b/gui/src/components/modelSelection/platform/AssistantSelectOptions.tsx @@ -6,7 +6,7 @@ import { lightGray } from "../.."; import { useAuth } from "../../../context/Auth"; import { IdeMessengerContext } from "../../../context/IdeMessenger"; import { useAppDispatch } from "../../../redux/hooks"; -import { selectProfileThunk } from "../../../redux/thunks/profileAndOrg"; +import { selectProfileThunk } from "../../../redux/slices/profiles/thunks"; import { getFontSize, getMetaKeyLabel, isLocalProfile } from "../../../util"; import { ROUTES } from "../../../util/navigation"; import AssistantIcon from "./AssistantIcon"; diff --git a/gui/src/context/Auth.tsx b/gui/src/context/Auth.tsx index d4e6f792547..844ba1aa352 100644 --- a/gui/src/context/Auth.tsx +++ b/gui/src/context/Auth.tsx @@ -14,11 +14,11 @@ import ConfirmationDialog from "../components/dialogs/ConfirmationDialog"; import { useWebviewListener } from "../hooks/useWebviewListener"; import { useAppDispatch, useAppSelector } from "../redux/hooks"; import { setLastControlServerBetaEnabledStatus } from "../redux/slices/miscSlice"; -import { setDialogMessage, setShowDialog } from "../redux/slices/uiSlice"; import { updateOrgsThunk, updateProfilesThunk, -} from "../redux/thunks/profileAndOrg"; +} from "../redux/slices/profiles/thunks"; +import { setDialogMessage, setShowDialog } from "../redux/slices/uiSlice"; import { IdeMessengerContext } from "./IdeMessenger"; interface AuthContextType { @@ -47,9 +47,9 @@ export const AuthProvider: React.FC<{ children: React.ReactNode }> = ({ ); // Orgs - const orgs = useAppSelector((store) => store.session.organizations); + const orgs = useAppSelector((store) => store.profiles.organizations); const selectedOrgId = useAppSelector( - (store) => store.session.selectedOrganizationId, + (store) => store.profiles.selectedOrganizationId, ); const selectedOrganization = useMemo(() => { if (!selectedOrgId) { @@ -59,9 +59,9 @@ export const AuthProvider: React.FC<{ children: React.ReactNode }> = ({ }, [orgs, selectedOrgId]); // Profiles - const profiles = useAppSelector((store) => store.session.availableProfiles); + const profiles = useAppSelector((store) => store.profiles.availableProfiles); const selectedProfile = useAppSelector( - (store) => store.session.selectedProfile, + (store) => store.profiles.selectedProfile, ); const login: AuthContextType["login"] = (useOnboarding: boolean) => { diff --git a/gui/src/hooks/useSetup.ts b/gui/src/hooks/useSetup.ts index 9d7f607b544..c45c2323ce2 100644 --- a/gui/src/hooks/useSetup.ts +++ b/gui/src/hooks/useSetup.ts @@ -11,12 +11,12 @@ import { } from "../redux/slices/configSlice"; import { updateIndexingStatus } from "../redux/slices/indexingSlice"; import { updateDocsSuggestions } from "../redux/slices/miscSlice"; +import { selectProfileThunk } from "../redux/slices/profiles/thunks"; import { addContextItemsAtIndex, setInactive, } from "../redux/slices/sessionSlice"; import { setTTSActive } from "../redux/slices/uiSlice"; -import { selectProfileThunk } from "../redux/thunks/profileAndOrg"; import { refreshSessionMetadata } from "../redux/thunks/session"; import { streamResponseThunk } from "../redux/thunks/streamResponse"; import { updateFileSymbolsFromHistory } from "../redux/thunks/updateFileSymbols"; diff --git a/gui/src/pages/config/ScopeSelect.tsx b/gui/src/pages/config/ScopeSelect.tsx index 2d42483a00f..3b001a4210d 100644 --- a/gui/src/pages/config/ScopeSelect.tsx +++ b/gui/src/pages/config/ScopeSelect.tsx @@ -7,12 +7,12 @@ import { import { useAuth } from "../../context/Auth"; import { useWebviewListener } from "../../hooks/useWebviewListener"; import { useAppDispatch, useAppSelector } from "../../redux/hooks"; -import { selectOrgThunk } from "../../redux/thunks/profileAndOrg"; +import { selectOrgThunk } from "../../redux/slices/profiles/thunks"; export function ScopeSelect() { const { organizations, selectedOrganization } = useAuth(); const selectedOrgId = useAppSelector( - (state) => state.session.selectedOrganizationId, + (state) => state.profiles.selectedOrganizationId, ); const dispatch = useAppDispatch(); diff --git a/gui/src/pages/config/index.tsx b/gui/src/pages/config/index.tsx index 3cf9b84a278..90530fa3a53 100644 --- a/gui/src/pages/config/index.tsx +++ b/gui/src/pages/config/index.tsx @@ -29,7 +29,7 @@ import { setDefaultModel, updateConfig, } from "../../redux/slices/configSlice"; -import { selectProfileThunk } from "../../redux/thunks/profileAndOrg"; +import { selectProfileThunk } from "../../redux/slices/profiles/thunks"; import { getFontSize, isJetBrains } from "../../util"; import ModelRoleSelector from "./ModelRoleSelector"; import { ScopeSelect } from "./ScopeSelect"; diff --git a/gui/src/pages/gui/StreamError.tsx b/gui/src/pages/gui/StreamError.tsx index 7e372720c47..b575ef0ec80 100644 --- a/gui/src/pages/gui/StreamError.tsx +++ b/gui/src/pages/gui/StreamError.tsx @@ -22,7 +22,7 @@ const StreamErrorDialog = ({ error }: StreamErrorProps) => { const selectedModel = useAppSelector(selectDefaultModel); const hubEnabled = useAppSelector(selectUseHub); const selectedProfile = useAppSelector( - (store) => store.session.selectedProfile, + (store) => store.profiles.selectedProfile, ); const { session, refreshProfiles } = useAuth(); diff --git a/gui/src/redux/slices/profiles/index.ts b/gui/src/redux/slices/profiles/index.ts new file mode 100644 index 00000000000..22be336b5f5 --- /dev/null +++ b/gui/src/redux/slices/profiles/index.ts @@ -0,0 +1,2 @@ +export * from "./slice"; +export * from "./thunks"; diff --git a/gui/src/redux/slices/profiles/slice.ts b/gui/src/redux/slices/profiles/slice.ts new file mode 100644 index 00000000000..b160c54b96c --- /dev/null +++ b/gui/src/redux/slices/profiles/slice.ts @@ -0,0 +1,59 @@ +import { createSlice, PayloadAction } from "@reduxjs/toolkit"; +import { ProfileDescription } from "core/config/ConfigHandler"; +import { OrganizationDescription } from "core/config/ProfileLifecycleManager"; + +interface ProfilesState { + availableProfiles: ProfileDescription[] | null; + selectedProfile: ProfileDescription | null; + organizations: OrganizationDescription[]; + selectedOrganizationId: string | null; +} + +const initialState: ProfilesState = { + availableProfiles: null, + selectedProfile: null, + organizations: [], + selectedOrganizationId: null, +}; + +export const profilesSlice = createSlice({ + name: "profiles", + initialState, + // Important: these reducers don't handle selected profile/organization fallback logic + // That is done in thunks + reducers: { + setSelectedProfile: ( + state, + { payload }: PayloadAction, + ) => { + state.selectedProfile = payload; + }, + setAvailableProfiles: ( + state, + { payload }: PayloadAction, + ) => { + state.availableProfiles = payload; + }, + setOrganizations: ( + state, + { payload }: PayloadAction, + ) => { + state.organizations = payload; + }, + setSelectedOrganizationId: ( + state, + { payload }: PayloadAction, + ) => { + state.selectedOrganizationId = payload; + }, + }, +}); + +export const { + setSelectedProfile, + setAvailableProfiles, + setOrganizations, + setSelectedOrganizationId, +} = profilesSlice.actions; + +export const profilesReducer = profilesSlice.reducer; diff --git a/gui/src/redux/thunks/profileAndOrg.ts b/gui/src/redux/slices/profiles/thunks.ts similarity index 76% rename from gui/src/redux/thunks/profileAndOrg.ts rename to gui/src/redux/slices/profiles/thunks.ts index 82a9602c0f9..f55d05f3cfc 100644 --- a/gui/src/redux/thunks/profileAndOrg.ts +++ b/gui/src/redux/slices/profiles/thunks.ts @@ -1,13 +1,13 @@ import { createAsyncThunk } from "@reduxjs/toolkit"; import { ProfileDescription } from "core/config/ConfigHandler"; import { OrganizationDescription } from "core/config/ProfileLifecycleManager"; +import { ThunkApiType } from "../../store"; import { setAvailableProfiles, setOrganizations, setSelectedOrganizationId, setSelectedProfile, -} from "../slices/sessionSlice"; -import { ThunkApiType } from "../store"; +} from "./slice"; export const selectProfileThunk = createAsyncThunk< void, @@ -16,29 +16,29 @@ export const selectProfileThunk = createAsyncThunk< >("profiles/select", async (id, { dispatch, extra, getState }) => { const state = getState(); - if (state.session.availableProfiles === null) { + if (state.profiles.availableProfiles === null) { // Currently in loading state return; } - const initialId = state.session.selectedProfile?.id; + const initialId = state.profiles.selectedProfile?.id; let newId = id; // If no profiles, force clear - if (state.session.availableProfiles.length === 0) { + if (state.profiles.availableProfiles.length === 0) { newId = null; } else { // If new id doesn't match an existing profile, clear it if (newId) { - if (!state.session.availableProfiles.find((p) => p.id === newId)) { + if (!state.profiles.availableProfiles.find((p) => p.id === newId)) { newId = null; } } if (!newId) { // At this point if null ID and there ARE profiles, // Fallback to a profile, prioritizing the first in the list - newId = state.session.availableProfiles[0].id; + newId = state.profiles.availableProfiles[0].id; } } @@ -46,7 +46,7 @@ export const selectProfileThunk = createAsyncThunk< if ((newId ?? null) !== (initialId ?? null)) { dispatch( setSelectedProfile( - state.session.availableProfiles.find((p) => p.id === newId) ?? null, + state.profiles.availableProfiles.find((p) => p.id === newId) ?? null, ), ); extra.ideMessenger.post("didChangeSelectedProfile", { @@ -60,11 +60,11 @@ export const cycleProfile = createAsyncThunk( async (_, { dispatch, getState }) => { const state = getState(); - if (state.session.availableProfiles === null) { + if (state.profiles.availableProfiles === null) { return; } - const profileIds = state.session.availableProfiles.map( + const profileIds = state.profiles.availableProfiles.map( (profile) => profile.id, ); // In case of no profiles just does nothing @@ -72,8 +72,8 @@ export const cycleProfile = createAsyncThunk( return; } let nextId = profileIds[0]; - if (state.session.selectedProfile) { - const curIndex = profileIds.indexOf(state.session.selectedProfile?.id); + if (state.profiles.selectedProfile) { + const curIndex = profileIds.indexOf(state.profiles.selectedProfile?.id); const nextIndex = (curIndex + 1) % profileIds.length; nextId = profileIds[nextIndex]; } @@ -100,15 +100,15 @@ export const selectOrgThunk = createAsyncThunk< ThunkApiType >("session/selectOrg", async (id, { dispatch, extra, getState }) => { const state = getState(); - const initialId = state.session.selectedOrganizationId; + const initialId = state.profiles.selectedOrganizationId; let newId = id; // If no orgs, force clear - if (state.session.organizations.length === 0) { + if (state.profiles.organizations.length === 0) { newId = null; } else if (newId) { // If new id doesn't match an existing org, clear it - if (!state.session.organizations.find((o) => o.id === newId)) { + if (!state.profiles.organizations.find((o) => o.id === newId)) { newId = null; } } @@ -133,5 +133,5 @@ export const updateOrgsThunk = createAsyncThunk< dispatch(setOrganizations(orgs)); // This will trigger reselection if needed - dispatch(selectOrgThunk(state.session.selectedOrganizationId)); + dispatch(selectOrgThunk(state.profiles.selectedOrganizationId)); }); diff --git a/gui/src/redux/slices/sessionSlice.ts b/gui/src/redux/slices/sessionSlice.ts index 04bb7ab19f4..33555660ca1 100644 --- a/gui/src/redux/slices/sessionSlice.ts +++ b/gui/src/redux/slices/sessionSlice.ts @@ -21,8 +21,6 @@ import { ToolCallDelta, ToolCallState, } from "core"; -import { ProfileDescription } from "core/config/ConfigHandler"; -import { OrganizationDescription } from "core/config/ProfileLifecycleManager"; import { NEW_SESSION_TITLE } from "core/util/constants"; import { incrementalParseJson } from "core/util/incrementalParseJson"; import { renderChatMessage } from "core/util/messageContent"; @@ -45,11 +43,6 @@ type SessionState = { isStreaming: boolean; title: string; id: string; - /** null indicates loading state */ - availableProfiles: ProfileDescription[] | null; - selectedProfile: ProfileDescription | null; - organizations: OrganizationDescription[]; - selectedOrganizationId: string | null; streamAborter: AbortController; codeToEdit: CodeToEdit[]; curCheckpointIndex: number; @@ -88,10 +81,6 @@ const initialState: SessionState = { isStreaming: false, title: NEW_SESSION_TITLE, id: uuidv4(), - selectedProfile: null, - availableProfiles: null, - organizations: [], - selectedOrganizationId: "", curCheckpointIndex: 0, streamAborter: new AbortController(), codeToEdit: [], @@ -294,7 +283,6 @@ export const sessionSlice = createSlice({ state.streamAborter = new AbortController(); }, streamUpdate: (state, action: PayloadAction) => { - if (state.history.length) { function toolCallDeltaToState( toolCallDelta: ToolCallDelta, @@ -332,7 +320,7 @@ export const sessionSlice = createSlice({ id: uuidv4(), }, contextItems: [], - }) + }); continue; } @@ -345,7 +333,7 @@ export const sessionSlice = createSlice({ !(!lastMessage.toolCalls?.length && !lastMessage.content) && // And there's a difference in tool call presence (lastMessage.toolCalls?.length ?? 0) !== - (message.toolCalls?.length ?? 0)) + (message.toolCalls?.length ?? 0)) ) { // Create a new message const historyItem: ChatHistoryItemWithMessageId = { @@ -495,9 +483,9 @@ export const sessionSlice = createSlice({ state.allSessionMetadata = state.allSessionMetadata.map((session) => session.sessionId === payload.sessionId ? { - ...session, - ...payload, - } + ...session, + ...payload, + } : session, ); if (payload.title && payload.sessionId === state.id) { @@ -532,8 +520,9 @@ export const sessionSlice = createSlice({ payload.rangeInFileWithContents.filepath, ); - const lineNums = `(${payload.rangeInFileWithContents.range.start.line + 1 - }-${payload.rangeInFileWithContents.range.end.line + 1})`; + const lineNums = `(${ + payload.rangeInFileWithContents.range.start.line + 1 + }-${payload.rangeInFileWithContents.range.end.line + 1})`; contextItems.push({ name: `${fileName} ${lineNums}`, @@ -553,34 +542,6 @@ export const sessionSlice = createSlice({ state.history[state.history.length - 1].contextItems = contextItems; }, - // Important: these reducers don't handle selected profile/organization fallback logic - // That is done in thunks - setSelectedProfile: ( - state, - { payload }: PayloadAction, - ) => { - state.selectedProfile = payload; - }, - setAvailableProfiles: ( - state, - { payload }: PayloadAction, - ) => { - state.availableProfiles = payload; - }, - setOrganizations: ( - state, - { payload }: PayloadAction, - ) => { - state.organizations = payload; - }, - setSelectedOrganizationId: ( - state, - { payload }: PayloadAction, - ) => { - state.selectedOrganizationId = payload; - }, - /////////////// - updateCurCheckpoint: ( state, { payload }: PayloadAction<{ filepath: string; content: string }>, @@ -718,9 +679,9 @@ function addPassthroughCases( ) { thunks.forEach((thunk) => { builder - .addCase(thunk.fulfilled, (state, action) => { }) - .addCase(thunk.rejected, (state, action) => { }) - .addCase(thunk.pending, (state, action) => { }); + .addCase(thunk.fulfilled, (state, action) => {}) + .addCase(thunk.rejected, (state, action) => {}) + .addCase(thunk.pending, (state, action) => {}); }); } @@ -777,11 +738,6 @@ export const { updateSessionMetadata, deleteSessionMetadata, setNewestCodeblocksForInput, - - setAvailableProfiles, - setSelectedProfile, - setOrganizations, - setSelectedOrganizationId, } = sessionSlice.actions; export const { diff --git a/gui/src/redux/store.ts b/gui/src/redux/store.ts index fb3deec7987..d7fea11c196 100644 --- a/gui/src/redux/store.ts +++ b/gui/src/redux/store.ts @@ -13,6 +13,7 @@ import configReducer from "./slices/configSlice"; import editModeStateReducer from "./slices/editModeState"; import indexingReducer from "./slices/indexingSlice"; import miscReducer from "./slices/miscSlice"; +import { profilesReducer } from "./slices/profiles"; import sessionReducer from "./slices/sessionSlice"; import tabsReducer from "./slices/tabsSlice"; import uiReducer from "./slices/uiSlice"; @@ -30,13 +31,12 @@ const rootReducer = combineReducers({ config: configReducer, indexing: indexingReducer, tabs: tabsReducer, + profiles: profilesReducer, }); const saveSubsetFilters = [ createFilter("session", [ "history", - "selectedOrganizationId", - "selectedProfile", "id", "lastSessionId", "title", @@ -45,10 +45,6 @@ const saveSubsetFilters = [ "mode", "codeToEdit", - // TODO consider removing persisted profiles/orgs - "availableProfiles", - "organizations", - // higher risk to persist // codeBlockApplyStates // symbols @@ -60,6 +56,13 @@ const saveSubsetFilters = [ createFilter("ui", ["toolSettings", "useTools"]), createFilter("indexing", []), createFilter("tabs", ["tabs"]), + createFilter("profiles", [ + // TODO consider removing persisted profiles/orgs + "availableProfiles", + "organizations", + "selectedOrganizationId", + "selectedProfile", + ]), ]; const migrations: MigrationManifest = { From 730ac56d5a15a6b2931330aeb849e2d260d2644a Mon Sep 17 00:00:00 2001 From: Patrick Erichsen Date: Fri, 21 Mar 2025 11:10:41 -0700 Subject: [PATCH 031/112] Revert "feat: add bookmark logic" This reverts commit d3f4aeb4c676cc4d5e090fa2ea6e497f965a3acd. --- extensions/vscode/src/VsCodeIde.ts | 2 +- .../ConversationStarterCard.tsx | 42 ++---------- .../ConversationStarterCards.tsx | 43 +++++++----- gui/src/components/index.ts | 4 +- .../platform/AssistantSelect.tsx | 2 +- .../platform/AssistantSelectOptions.tsx | 2 +- gui/src/context/Auth.tsx | 12 ++-- gui/src/hooks/useSetup.ts | 2 +- gui/src/pages/config/ScopeSelect.tsx | 4 +- gui/src/pages/config/index.tsx | 2 +- gui/src/pages/gui/StreamError.tsx | 2 +- gui/src/redux/slices/profiles/index.ts | 2 - gui/src/redux/slices/profiles/slice.ts | 59 ----------------- gui/src/redux/slices/sessionSlice.ts | 66 +++++++++++++++---- gui/src/redux/store.ts | 15 ++--- .../thunks.ts => thunks/profileAndOrg.ts} | 32 ++++----- 16 files changed, 126 insertions(+), 165 deletions(-) delete mode 100644 gui/src/redux/slices/profiles/index.ts delete mode 100644 gui/src/redux/slices/profiles/slice.ts rename gui/src/redux/{slices/profiles/thunks.ts => thunks/profileAndOrg.ts} (76%) diff --git a/extensions/vscode/src/VsCodeIde.ts b/extensions/vscode/src/VsCodeIde.ts index c324edaf268..1aaa1028369 100644 --- a/extensions/vscode/src/VsCodeIde.ts +++ b/extensions/vscode/src/VsCodeIde.ts @@ -529,7 +529,7 @@ class VsCodeIde implements IDE { const tabArray = vscode.window.tabGroups.all[0].tabs; return tabArray - .filter((t) => t.isBookmarked) + .filter((t) => t.isPinned) .map((t) => (t.input as vscode.TabInputText).uri.toString()); } diff --git a/gui/src/components/ConversationStarters/ConversationStarterCard.tsx b/gui/src/components/ConversationStarters/ConversationStarterCard.tsx index 1542adadf52..35a205481c4 100644 --- a/gui/src/components/ConversationStarters/ConversationStarterCard.tsx +++ b/gui/src/components/ConversationStarters/ConversationStarterCard.tsx @@ -1,63 +1,33 @@ -import { BookmarkIcon, ChatBubbleLeftIcon } from "@heroicons/react/24/outline"; -import { BookmarkIcon as BookmarkIconSolid } from "@heroicons/react/24/solid"; +import { ChatBubbleLeftIcon } from "@heroicons/react/24/outline"; import { SlashCommandDescription } from "core"; -import { useState } from "react"; -import { defaultBorderRadius, GhostButton, vscInputBackground } from ".."; +import { defaultBorderRadius, vscInputBackground } from ".."; interface ConversationStarterCardProps { command: SlashCommandDescription; onClick: (command: SlashCommandDescription) => void; - onBookmark: (command: SlashCommandDescription) => void; - isBookmarked: boolean; } export function ConversationStarterCard({ command, onClick, - onBookmark, - isBookmarked = false, }: ConversationStarterCardProps) { - const [isHovered, setIsHovered] = useState(false); - return (
onClick(command)} + className="mb-2 w-full shadow-md hover:cursor-pointer hover:brightness-110" style={{ borderRadius: defaultBorderRadius, backgroundColor: vscInputBackground, }} - onMouseEnter={() => setIsHovered(true)} - onMouseLeave={() => setIsHovered(false)} > -
+
-
onClick(command)} - className="flex flex-1 flex-col hover:cursor-pointer" - > +
{command.name}
{command.description}
-
- { - e.stopPropagation(); - onBookmark(command); - }} - aria-label={ - isBookmarked ? "Remove bookmarked prompt" : "Bookmark prompt" - } - className={isHovered || isBookmarked ? "opacity-100" : "opacity-0"} - > - {isBookmarked ? ( - - ) : ( - - )} - -
); diff --git a/gui/src/components/ConversationStarters/ConversationStarterCards.tsx b/gui/src/components/ConversationStarters/ConversationStarterCards.tsx index 8df9cd9084b..69020dae50e 100644 --- a/gui/src/components/ConversationStarters/ConversationStarterCards.tsx +++ b/gui/src/components/ConversationStarters/ConversationStarterCards.tsx @@ -10,13 +10,19 @@ const NUM_CARDS_TO_RENDER_COLLAPSED = 3; export function ConversationStarterCards() { const dispatch = useAppDispatch(); - const [bookmarkedCommands, setBookmarkedCommands] = useState([]); - + const [isExpanded, setIsExpanded] = useState(false); const slashCommands = useAppSelector((state) => state.config.config.slashCommands) ?? []; const filteredSlashCommands = slashCommands?.filter(isDeprecatedCommandName); + const numFilteredSlashCommands = filteredSlashCommands.length; + const displayedCommands = isExpanded + ? filteredSlashCommands + : filteredSlashCommands.slice(0, NUM_CARDS_TO_RENDER_COLLAPSED); + const hasMoreCommands = + numFilteredSlashCommands > NUM_CARDS_TO_RENDER_COLLAPSED; + function onClick(command: SlashCommandDescription) { if (command.prompt) { dispatch( @@ -25,14 +31,8 @@ export function ConversationStarterCards() { } } - function handleBookmarkCommand(command: SlashCommandDescription) { - setBookmarkedCommands((prev) => { - if (prev.includes(command.name)) { - return prev.filter((name) => name !== command.name); - } else { - return [...prev, command.name]; - } - }); + function handleToggleExpand() { + setIsExpanded(!isExpanded); } if (!filteredSlashCommands || filteredSlashCommands.length === 0) { @@ -40,18 +40,29 @@ export function ConversationStarterCards() { } return ( -
- {filteredSlashCommands - .slice(0, NUM_CARDS_TO_RENDER_COLLAPSED) - .map((command, i) => ( +
+

Prompts

+ +
+ {displayedCommands.map((command, i) => ( ))} +
+ + {hasMoreCommands && ( +

+ {isExpanded + ? "Show less" + : `Show ${numFilteredSlashCommands - NUM_CARDS_TO_RENDER_COLLAPSED} more...`} +

+ )}
); } diff --git a/gui/src/components/index.ts b/gui/src/components/index.ts index eb0632646e2..04460f3b158 100644 --- a/gui/src/components/index.ts +++ b/gui/src/components/index.ts @@ -1,5 +1,5 @@ import styled from "styled-components"; -import { getFontSize } from "../util"; +import { getFontSize, isJetBrains } from "../util"; export const VSC_INPUT_BACKGROUND_VAR = "--vscode-input-background"; export const VSC_BACKGROUND_VAR = "--vscode-sideBar-background"; @@ -151,7 +151,7 @@ export const SecondaryButton = styled.button` `; export const GhostButton = styled.button` - padding: 6px 8px; + padding: 10px 12px; margin: 8px 0; border-radius: ${defaultBorderRadius}; diff --git a/gui/src/components/modelSelection/platform/AssistantSelect.tsx b/gui/src/components/modelSelection/platform/AssistantSelect.tsx index 4e1925ce47d..a4dde488d20 100644 --- a/gui/src/components/modelSelection/platform/AssistantSelect.tsx +++ b/gui/src/components/modelSelection/platform/AssistantSelect.tsx @@ -5,7 +5,7 @@ import { useContext, useEffect, useRef } from "react"; import { useAuth } from "../../../context/Auth"; import { IdeMessengerContext } from "../../../context/IdeMessenger"; import { useAppDispatch } from "../../../redux/hooks"; -import { cycleProfile } from "../../../redux/slices/profiles/thunks"; +import { cycleProfile } from "../../../redux/thunks/profileAndOrg"; import { getFontSize, isMetaEquivalentKeyPressed } from "../../../util"; import PopoverTransition from "../../mainInput/InputToolbar/PopoverTransition"; import AssistantIcon from "./AssistantIcon"; diff --git a/gui/src/components/modelSelection/platform/AssistantSelectOptions.tsx b/gui/src/components/modelSelection/platform/AssistantSelectOptions.tsx index de4db142269..cd8d5cd5cf1 100644 --- a/gui/src/components/modelSelection/platform/AssistantSelectOptions.tsx +++ b/gui/src/components/modelSelection/platform/AssistantSelectOptions.tsx @@ -6,7 +6,7 @@ import { lightGray } from "../.."; import { useAuth } from "../../../context/Auth"; import { IdeMessengerContext } from "../../../context/IdeMessenger"; import { useAppDispatch } from "../../../redux/hooks"; -import { selectProfileThunk } from "../../../redux/slices/profiles/thunks"; +import { selectProfileThunk } from "../../../redux/thunks/profileAndOrg"; import { getFontSize, getMetaKeyLabel, isLocalProfile } from "../../../util"; import { ROUTES } from "../../../util/navigation"; import AssistantIcon from "./AssistantIcon"; diff --git a/gui/src/context/Auth.tsx b/gui/src/context/Auth.tsx index 844ba1aa352..d4e6f792547 100644 --- a/gui/src/context/Auth.tsx +++ b/gui/src/context/Auth.tsx @@ -14,11 +14,11 @@ import ConfirmationDialog from "../components/dialogs/ConfirmationDialog"; import { useWebviewListener } from "../hooks/useWebviewListener"; import { useAppDispatch, useAppSelector } from "../redux/hooks"; import { setLastControlServerBetaEnabledStatus } from "../redux/slices/miscSlice"; +import { setDialogMessage, setShowDialog } from "../redux/slices/uiSlice"; import { updateOrgsThunk, updateProfilesThunk, -} from "../redux/slices/profiles/thunks"; -import { setDialogMessage, setShowDialog } from "../redux/slices/uiSlice"; +} from "../redux/thunks/profileAndOrg"; import { IdeMessengerContext } from "./IdeMessenger"; interface AuthContextType { @@ -47,9 +47,9 @@ export const AuthProvider: React.FC<{ children: React.ReactNode }> = ({ ); // Orgs - const orgs = useAppSelector((store) => store.profiles.organizations); + const orgs = useAppSelector((store) => store.session.organizations); const selectedOrgId = useAppSelector( - (store) => store.profiles.selectedOrganizationId, + (store) => store.session.selectedOrganizationId, ); const selectedOrganization = useMemo(() => { if (!selectedOrgId) { @@ -59,9 +59,9 @@ export const AuthProvider: React.FC<{ children: React.ReactNode }> = ({ }, [orgs, selectedOrgId]); // Profiles - const profiles = useAppSelector((store) => store.profiles.availableProfiles); + const profiles = useAppSelector((store) => store.session.availableProfiles); const selectedProfile = useAppSelector( - (store) => store.profiles.selectedProfile, + (store) => store.session.selectedProfile, ); const login: AuthContextType["login"] = (useOnboarding: boolean) => { diff --git a/gui/src/hooks/useSetup.ts b/gui/src/hooks/useSetup.ts index c45c2323ce2..9d7f607b544 100644 --- a/gui/src/hooks/useSetup.ts +++ b/gui/src/hooks/useSetup.ts @@ -11,12 +11,12 @@ import { } from "../redux/slices/configSlice"; import { updateIndexingStatus } from "../redux/slices/indexingSlice"; import { updateDocsSuggestions } from "../redux/slices/miscSlice"; -import { selectProfileThunk } from "../redux/slices/profiles/thunks"; import { addContextItemsAtIndex, setInactive, } from "../redux/slices/sessionSlice"; import { setTTSActive } from "../redux/slices/uiSlice"; +import { selectProfileThunk } from "../redux/thunks/profileAndOrg"; import { refreshSessionMetadata } from "../redux/thunks/session"; import { streamResponseThunk } from "../redux/thunks/streamResponse"; import { updateFileSymbolsFromHistory } from "../redux/thunks/updateFileSymbols"; diff --git a/gui/src/pages/config/ScopeSelect.tsx b/gui/src/pages/config/ScopeSelect.tsx index 3b001a4210d..2d42483a00f 100644 --- a/gui/src/pages/config/ScopeSelect.tsx +++ b/gui/src/pages/config/ScopeSelect.tsx @@ -7,12 +7,12 @@ import { import { useAuth } from "../../context/Auth"; import { useWebviewListener } from "../../hooks/useWebviewListener"; import { useAppDispatch, useAppSelector } from "../../redux/hooks"; -import { selectOrgThunk } from "../../redux/slices/profiles/thunks"; +import { selectOrgThunk } from "../../redux/thunks/profileAndOrg"; export function ScopeSelect() { const { organizations, selectedOrganization } = useAuth(); const selectedOrgId = useAppSelector( - (state) => state.profiles.selectedOrganizationId, + (state) => state.session.selectedOrganizationId, ); const dispatch = useAppDispatch(); diff --git a/gui/src/pages/config/index.tsx b/gui/src/pages/config/index.tsx index 90530fa3a53..3cf9b84a278 100644 --- a/gui/src/pages/config/index.tsx +++ b/gui/src/pages/config/index.tsx @@ -29,7 +29,7 @@ import { setDefaultModel, updateConfig, } from "../../redux/slices/configSlice"; -import { selectProfileThunk } from "../../redux/slices/profiles/thunks"; +import { selectProfileThunk } from "../../redux/thunks/profileAndOrg"; import { getFontSize, isJetBrains } from "../../util"; import ModelRoleSelector from "./ModelRoleSelector"; import { ScopeSelect } from "./ScopeSelect"; diff --git a/gui/src/pages/gui/StreamError.tsx b/gui/src/pages/gui/StreamError.tsx index b575ef0ec80..7e372720c47 100644 --- a/gui/src/pages/gui/StreamError.tsx +++ b/gui/src/pages/gui/StreamError.tsx @@ -22,7 +22,7 @@ const StreamErrorDialog = ({ error }: StreamErrorProps) => { const selectedModel = useAppSelector(selectDefaultModel); const hubEnabled = useAppSelector(selectUseHub); const selectedProfile = useAppSelector( - (store) => store.profiles.selectedProfile, + (store) => store.session.selectedProfile, ); const { session, refreshProfiles } = useAuth(); diff --git a/gui/src/redux/slices/profiles/index.ts b/gui/src/redux/slices/profiles/index.ts deleted file mode 100644 index 22be336b5f5..00000000000 --- a/gui/src/redux/slices/profiles/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from "./slice"; -export * from "./thunks"; diff --git a/gui/src/redux/slices/profiles/slice.ts b/gui/src/redux/slices/profiles/slice.ts deleted file mode 100644 index b160c54b96c..00000000000 --- a/gui/src/redux/slices/profiles/slice.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { createSlice, PayloadAction } from "@reduxjs/toolkit"; -import { ProfileDescription } from "core/config/ConfigHandler"; -import { OrganizationDescription } from "core/config/ProfileLifecycleManager"; - -interface ProfilesState { - availableProfiles: ProfileDescription[] | null; - selectedProfile: ProfileDescription | null; - organizations: OrganizationDescription[]; - selectedOrganizationId: string | null; -} - -const initialState: ProfilesState = { - availableProfiles: null, - selectedProfile: null, - organizations: [], - selectedOrganizationId: null, -}; - -export const profilesSlice = createSlice({ - name: "profiles", - initialState, - // Important: these reducers don't handle selected profile/organization fallback logic - // That is done in thunks - reducers: { - setSelectedProfile: ( - state, - { payload }: PayloadAction, - ) => { - state.selectedProfile = payload; - }, - setAvailableProfiles: ( - state, - { payload }: PayloadAction, - ) => { - state.availableProfiles = payload; - }, - setOrganizations: ( - state, - { payload }: PayloadAction, - ) => { - state.organizations = payload; - }, - setSelectedOrganizationId: ( - state, - { payload }: PayloadAction, - ) => { - state.selectedOrganizationId = payload; - }, - }, -}); - -export const { - setSelectedProfile, - setAvailableProfiles, - setOrganizations, - setSelectedOrganizationId, -} = profilesSlice.actions; - -export const profilesReducer = profilesSlice.reducer; diff --git a/gui/src/redux/slices/sessionSlice.ts b/gui/src/redux/slices/sessionSlice.ts index 33555660ca1..04bb7ab19f4 100644 --- a/gui/src/redux/slices/sessionSlice.ts +++ b/gui/src/redux/slices/sessionSlice.ts @@ -21,6 +21,8 @@ import { ToolCallDelta, ToolCallState, } from "core"; +import { ProfileDescription } from "core/config/ConfigHandler"; +import { OrganizationDescription } from "core/config/ProfileLifecycleManager"; import { NEW_SESSION_TITLE } from "core/util/constants"; import { incrementalParseJson } from "core/util/incrementalParseJson"; import { renderChatMessage } from "core/util/messageContent"; @@ -43,6 +45,11 @@ type SessionState = { isStreaming: boolean; title: string; id: string; + /** null indicates loading state */ + availableProfiles: ProfileDescription[] | null; + selectedProfile: ProfileDescription | null; + organizations: OrganizationDescription[]; + selectedOrganizationId: string | null; streamAborter: AbortController; codeToEdit: CodeToEdit[]; curCheckpointIndex: number; @@ -81,6 +88,10 @@ const initialState: SessionState = { isStreaming: false, title: NEW_SESSION_TITLE, id: uuidv4(), + selectedProfile: null, + availableProfiles: null, + organizations: [], + selectedOrganizationId: "", curCheckpointIndex: 0, streamAborter: new AbortController(), codeToEdit: [], @@ -283,6 +294,7 @@ export const sessionSlice = createSlice({ state.streamAborter = new AbortController(); }, streamUpdate: (state, action: PayloadAction) => { + if (state.history.length) { function toolCallDeltaToState( toolCallDelta: ToolCallDelta, @@ -320,7 +332,7 @@ export const sessionSlice = createSlice({ id: uuidv4(), }, contextItems: [], - }); + }) continue; } @@ -333,7 +345,7 @@ export const sessionSlice = createSlice({ !(!lastMessage.toolCalls?.length && !lastMessage.content) && // And there's a difference in tool call presence (lastMessage.toolCalls?.length ?? 0) !== - (message.toolCalls?.length ?? 0)) + (message.toolCalls?.length ?? 0)) ) { // Create a new message const historyItem: ChatHistoryItemWithMessageId = { @@ -483,9 +495,9 @@ export const sessionSlice = createSlice({ state.allSessionMetadata = state.allSessionMetadata.map((session) => session.sessionId === payload.sessionId ? { - ...session, - ...payload, - } + ...session, + ...payload, + } : session, ); if (payload.title && payload.sessionId === state.id) { @@ -520,9 +532,8 @@ export const sessionSlice = createSlice({ payload.rangeInFileWithContents.filepath, ); - const lineNums = `(${ - payload.rangeInFileWithContents.range.start.line + 1 - }-${payload.rangeInFileWithContents.range.end.line + 1})`; + const lineNums = `(${payload.rangeInFileWithContents.range.start.line + 1 + }-${payload.rangeInFileWithContents.range.end.line + 1})`; contextItems.push({ name: `${fileName} ${lineNums}`, @@ -542,6 +553,34 @@ export const sessionSlice = createSlice({ state.history[state.history.length - 1].contextItems = contextItems; }, + // Important: these reducers don't handle selected profile/organization fallback logic + // That is done in thunks + setSelectedProfile: ( + state, + { payload }: PayloadAction, + ) => { + state.selectedProfile = payload; + }, + setAvailableProfiles: ( + state, + { payload }: PayloadAction, + ) => { + state.availableProfiles = payload; + }, + setOrganizations: ( + state, + { payload }: PayloadAction, + ) => { + state.organizations = payload; + }, + setSelectedOrganizationId: ( + state, + { payload }: PayloadAction, + ) => { + state.selectedOrganizationId = payload; + }, + /////////////// + updateCurCheckpoint: ( state, { payload }: PayloadAction<{ filepath: string; content: string }>, @@ -679,9 +718,9 @@ function addPassthroughCases( ) { thunks.forEach((thunk) => { builder - .addCase(thunk.fulfilled, (state, action) => {}) - .addCase(thunk.rejected, (state, action) => {}) - .addCase(thunk.pending, (state, action) => {}); + .addCase(thunk.fulfilled, (state, action) => { }) + .addCase(thunk.rejected, (state, action) => { }) + .addCase(thunk.pending, (state, action) => { }); }); } @@ -738,6 +777,11 @@ export const { updateSessionMetadata, deleteSessionMetadata, setNewestCodeblocksForInput, + + setAvailableProfiles, + setSelectedProfile, + setOrganizations, + setSelectedOrganizationId, } = sessionSlice.actions; export const { diff --git a/gui/src/redux/store.ts b/gui/src/redux/store.ts index d7fea11c196..fb3deec7987 100644 --- a/gui/src/redux/store.ts +++ b/gui/src/redux/store.ts @@ -13,7 +13,6 @@ import configReducer from "./slices/configSlice"; import editModeStateReducer from "./slices/editModeState"; import indexingReducer from "./slices/indexingSlice"; import miscReducer from "./slices/miscSlice"; -import { profilesReducer } from "./slices/profiles"; import sessionReducer from "./slices/sessionSlice"; import tabsReducer from "./slices/tabsSlice"; import uiReducer from "./slices/uiSlice"; @@ -31,12 +30,13 @@ const rootReducer = combineReducers({ config: configReducer, indexing: indexingReducer, tabs: tabsReducer, - profiles: profilesReducer, }); const saveSubsetFilters = [ createFilter("session", [ "history", + "selectedOrganizationId", + "selectedProfile", "id", "lastSessionId", "title", @@ -45,6 +45,10 @@ const saveSubsetFilters = [ "mode", "codeToEdit", + // TODO consider removing persisted profiles/orgs + "availableProfiles", + "organizations", + // higher risk to persist // codeBlockApplyStates // symbols @@ -56,13 +60,6 @@ const saveSubsetFilters = [ createFilter("ui", ["toolSettings", "useTools"]), createFilter("indexing", []), createFilter("tabs", ["tabs"]), - createFilter("profiles", [ - // TODO consider removing persisted profiles/orgs - "availableProfiles", - "organizations", - "selectedOrganizationId", - "selectedProfile", - ]), ]; const migrations: MigrationManifest = { diff --git a/gui/src/redux/slices/profiles/thunks.ts b/gui/src/redux/thunks/profileAndOrg.ts similarity index 76% rename from gui/src/redux/slices/profiles/thunks.ts rename to gui/src/redux/thunks/profileAndOrg.ts index f55d05f3cfc..82a9602c0f9 100644 --- a/gui/src/redux/slices/profiles/thunks.ts +++ b/gui/src/redux/thunks/profileAndOrg.ts @@ -1,13 +1,13 @@ import { createAsyncThunk } from "@reduxjs/toolkit"; import { ProfileDescription } from "core/config/ConfigHandler"; import { OrganizationDescription } from "core/config/ProfileLifecycleManager"; -import { ThunkApiType } from "../../store"; import { setAvailableProfiles, setOrganizations, setSelectedOrganizationId, setSelectedProfile, -} from "./slice"; +} from "../slices/sessionSlice"; +import { ThunkApiType } from "../store"; export const selectProfileThunk = createAsyncThunk< void, @@ -16,29 +16,29 @@ export const selectProfileThunk = createAsyncThunk< >("profiles/select", async (id, { dispatch, extra, getState }) => { const state = getState(); - if (state.profiles.availableProfiles === null) { + if (state.session.availableProfiles === null) { // Currently in loading state return; } - const initialId = state.profiles.selectedProfile?.id; + const initialId = state.session.selectedProfile?.id; let newId = id; // If no profiles, force clear - if (state.profiles.availableProfiles.length === 0) { + if (state.session.availableProfiles.length === 0) { newId = null; } else { // If new id doesn't match an existing profile, clear it if (newId) { - if (!state.profiles.availableProfiles.find((p) => p.id === newId)) { + if (!state.session.availableProfiles.find((p) => p.id === newId)) { newId = null; } } if (!newId) { // At this point if null ID and there ARE profiles, // Fallback to a profile, prioritizing the first in the list - newId = state.profiles.availableProfiles[0].id; + newId = state.session.availableProfiles[0].id; } } @@ -46,7 +46,7 @@ export const selectProfileThunk = createAsyncThunk< if ((newId ?? null) !== (initialId ?? null)) { dispatch( setSelectedProfile( - state.profiles.availableProfiles.find((p) => p.id === newId) ?? null, + state.session.availableProfiles.find((p) => p.id === newId) ?? null, ), ); extra.ideMessenger.post("didChangeSelectedProfile", { @@ -60,11 +60,11 @@ export const cycleProfile = createAsyncThunk( async (_, { dispatch, getState }) => { const state = getState(); - if (state.profiles.availableProfiles === null) { + if (state.session.availableProfiles === null) { return; } - const profileIds = state.profiles.availableProfiles.map( + const profileIds = state.session.availableProfiles.map( (profile) => profile.id, ); // In case of no profiles just does nothing @@ -72,8 +72,8 @@ export const cycleProfile = createAsyncThunk( return; } let nextId = profileIds[0]; - if (state.profiles.selectedProfile) { - const curIndex = profileIds.indexOf(state.profiles.selectedProfile?.id); + if (state.session.selectedProfile) { + const curIndex = profileIds.indexOf(state.session.selectedProfile?.id); const nextIndex = (curIndex + 1) % profileIds.length; nextId = profileIds[nextIndex]; } @@ -100,15 +100,15 @@ export const selectOrgThunk = createAsyncThunk< ThunkApiType >("session/selectOrg", async (id, { dispatch, extra, getState }) => { const state = getState(); - const initialId = state.profiles.selectedOrganizationId; + const initialId = state.session.selectedOrganizationId; let newId = id; // If no orgs, force clear - if (state.profiles.organizations.length === 0) { + if (state.session.organizations.length === 0) { newId = null; } else if (newId) { // If new id doesn't match an existing org, clear it - if (!state.profiles.organizations.find((o) => o.id === newId)) { + if (!state.session.organizations.find((o) => o.id === newId)) { newId = null; } } @@ -133,5 +133,5 @@ export const updateOrgsThunk = createAsyncThunk< dispatch(setOrganizations(orgs)); // This will trigger reselection if needed - dispatch(selectOrgThunk(state.profiles.selectedOrganizationId)); + dispatch(selectOrgThunk(state.session.selectedOrganizationId)); }); From c4ab5a2f226764e777095546dc3f0a34b9776250 Mon Sep 17 00:00:00 2001 From: Dallin Romney Date: Fri, 21 Mar 2025 11:20:52 -0700 Subject: [PATCH 032/112] tool policies dialog --- .../InputToolbar/ToggleToolsButton.tsx | 164 +++--------------- .../InputToolbar/ToolDropdownItem.tsx | 24 +-- .../InputToolbar/ToolPermissionsDialog.tsx | 64 +++++++ 3 files changed, 103 insertions(+), 149 deletions(-) create mode 100644 gui/src/components/mainInput/InputToolbar/ToolPermissionsDialog.tsx diff --git a/gui/src/components/mainInput/InputToolbar/ToggleToolsButton.tsx b/gui/src/components/mainInput/InputToolbar/ToggleToolsButton.tsx index a626003f426..52850d991cd 100644 --- a/gui/src/components/mainInput/InputToolbar/ToggleToolsButton.tsx +++ b/gui/src/components/mainInput/InputToolbar/ToggleToolsButton.tsx @@ -1,71 +1,39 @@ -import { Listbox } from "@headlessui/react"; import { EllipsisHorizontalCircleIcon as EllipsisHorizontalIcon, WrenchScrewdriverIcon as WrenchScrewdriverIconOutline, } from "@heroicons/react/24/outline"; import { WrenchScrewdriverIcon as WrenchScrewdriverIconSolid } from "@heroicons/react/24/solid"; -import { useEffect, useMemo, useRef, useState } from "react"; -import { useDispatch } from "react-redux"; -import { lightGray, vscForeground } from "../.."; -import { useAppSelector } from "../../../redux/hooks"; +import { useState } from "react"; +import { useAppDispatch, useAppSelector } from "../../../redux/hooks"; import { selectIsInEditMode } from "../../../redux/slices/sessionSlice"; -import { toggleUseTools } from "../../../redux/slices/uiSlice"; +import { + setDialogMessage, + setShowDialog, + toggleUseTools, +} from "../../../redux/slices/uiSlice"; import { ToolTip } from "../../gui/Tooltip"; -import InfoHover from "../../InfoHover"; import HoverItem from "./HoverItem"; -import PopoverTransition from "./PopoverTransition"; -import ToolDropdownItem from "./ToolDropdownItem"; +import ToolPermissionsDialog from "./ToolPermissionsDialog"; -interface ToolDropdownProps { +interface ToggleToolsButtonProps { disabled: boolean; } -export default function ToolDropdown(props: ToolDropdownProps) { - const buttonRef = useRef(null); - const dispatch = useDispatch(); - const [isDropdownOpen, setDropdownOpen] = useState(false); +export default function ToggleToolsButton(props: ToggleToolsButtonProps) { + const dispatch = useAppDispatch(); const [isHovered, setIsHovered] = useState(false); const useTools = useAppSelector((state) => state.ui.useTools); - const availableTools = useAppSelector((state) => state.config.config.tools); - const [showAbove, setShowAbove] = useState(false); const isInEditMode = useAppSelector(selectIsInEditMode); const ToolsIcon = useTools ? WrenchScrewdriverIconSolid : WrenchScrewdriverIconOutline; - useEffect(() => { - const checkPosition = () => { - if (buttonRef.current) { - const rect = buttonRef.current.getBoundingClientRect(); - const windowHeight = window.innerHeight; - const spaceBelow = windowHeight - rect.bottom; - setShowAbove(spaceBelow < 250); - } - }; - - if (isDropdownOpen) { - checkPosition(); - } - }, [isDropdownOpen]); - - const tools = useAppSelector((store) => store.config.config.tools); - - // Detect duplicate tool names - const duplicateDetection = useMemo(() => { - const counts: Record = {}; - tools.forEach((tool) => { - if (counts[tool.function.name]) { - counts[tool.function.name] = counts[tool.function.name] + 1; - } else { - counts[tool.function.name] = 1; - } - }); - return Object.fromEntries( - Object.entries(counts).map(([k, v]) => [k, v > 1]), - ); - }, [tools]); + function showTools() { + dispatch(setDialogMessage()); + dispatch(setShowDialog(true)); + } const isDisabled = props.disabled || isInEditMode; @@ -100,98 +68,18 @@ export default function ToolDropdown(props: ToolDropdownProps) { {useTools && !isDisabled && ( <> Tools - -
- {}} - as="div" - onClick={(e) => e.stopPropagation()} - disabled={isDisabled} - > - {({ open }) => ( - <> - { - e.stopPropagation(); - setDropdownOpen(!isDropdownOpen); - }} - className="text-lightgray flex cursor-pointer items-center border-none bg-transparent px-0 outline-none" - aria-disabled={isDisabled} - > - - - setDropdownOpen(false)} - > - -
-
- Tool policies{" "} - -

- - Automatic: - {" "} - Can be used without asking -

-

- - Allowed: - {" "} - Will ask before using -

-

- - Disabled: - {" "} - Cannot be used -

-
- } - /> -
-
-
- {availableTools.map((tool) => ( - - - - ))} -
- - - - )} - +
{ + e.stopPropagation(); + showTools(); + }} + className="text-lightgray flex cursor-pointer items-center" + aria-disabled={isDisabled} + > +
+ Tool policies )}
diff --git a/gui/src/components/mainInput/InputToolbar/ToolDropdownItem.tsx b/gui/src/components/mainInput/InputToolbar/ToolDropdownItem.tsx index 4e2a3fd6635..64a36c959b5 100644 --- a/gui/src/components/mainInput/InputToolbar/ToolDropdownItem.tsx +++ b/gui/src/components/mainInput/InputToolbar/ToolDropdownItem.tsx @@ -29,14 +29,14 @@ function ToolDropdownItem(props: ToolDropdownItemProps) { return (
{ dispatch(toggleToolSetting(props.tool.function.name)); e.stopPropagation(); e.preventDefault(); }} > - +
{props.duplicatesDetected ? ( <> ) : null} - {props.tool.faviconUrl && ( - {props.tool.displayTitle} - )} - {props.tool.displayTitle}{" "} - + + {props.tool.faviconUrl && ( + {props.tool.displayTitle} + )} + {props.tool.displayTitle}{" "} + +
{(settings === "allowedWithPermission" || settings === undefined) && ( Allowed diff --git a/gui/src/components/mainInput/InputToolbar/ToolPermissionsDialog.tsx b/gui/src/components/mainInput/InputToolbar/ToolPermissionsDialog.tsx new file mode 100644 index 00000000000..e8ca6371801 --- /dev/null +++ b/gui/src/components/mainInput/InputToolbar/ToolPermissionsDialog.tsx @@ -0,0 +1,64 @@ +import { useMemo } from "react"; +import { useAppSelector } from "../../../redux/hooks"; +import InfoHover from "../../InfoHover"; +import ToolDropdownItem from "./ToolDropdownItem"; + +const ToolPermissionsDialog = () => { + const availableTools = useAppSelector((state) => state.config.config.tools); + + // Detect duplicate tool names + const duplicateDetection = useMemo(() => { + const counts: Record = {}; + availableTools.forEach((tool) => { + if (counts[tool.function.name]) { + counts[tool.function.name] = counts[tool.function.name] + 1; + } else { + counts[tool.function.name] = 1; + } + }); + return Object.fromEntries( + Object.entries(counts).map(([k, v]) => [k, v > 1]), + ); + }, [availableTools]); + + return ( +
+
+

Tool policies

+ +

+ Automatic: Can be used + without asking +

+

+ Allowed: Will ask + before using +

+

+ Disabled: Cannot be used +

+
+ } + /> +
+
+ {availableTools.map((tool) => ( + + ))} +
+
+ ); +}; + +export default ToolPermissionsDialog; From f613b438da136abc75b77d9175286b200d9ea7a6 Mon Sep 17 00:00:00 2001 From: Nate Date: Fri, 21 Mar 2025 11:27:58 -0700 Subject: [PATCH 033/112] tool lump section --- gui/src/components/mainInput/InputToolbar.tsx | 3 - .../InputToolbar/ToggleToolsButton.tsx | 178 ------------------ .../InputToolbar/ToolDropdownItem.tsx | 2 +- .../mainInput/Lump/TopInputToolbar.tsx | 11 ++ gui/src/components/mainInput/Lump/index.tsx | 4 +- .../Lump/sections/SelectedSection.tsx | 3 + .../mainInput/Lump/sections/ToolsSection.tsx | 25 +++ 7 files changed, 43 insertions(+), 183 deletions(-) delete mode 100644 gui/src/components/mainInput/InputToolbar/ToggleToolsButton.tsx create mode 100644 gui/src/components/mainInput/Lump/sections/ToolsSection.tsx diff --git a/gui/src/components/mainInput/InputToolbar.tsx b/gui/src/components/mainInput/InputToolbar.tsx index 2642fc0899c..9c1bdb15e3f 100644 --- a/gui/src/components/mainInput/InputToolbar.tsx +++ b/gui/src/components/mainInput/InputToolbar.tsx @@ -29,7 +29,6 @@ import { import { ToolTip } from "../gui/Tooltip"; import ModelSelect from "../modelSelection/ModelSelect"; import HoverItem from "./InputToolbar/HoverItem"; -import ToggleToolsButton from "./InputToolbar/ToggleToolsButton"; const StyledDiv = styled.div<{ isHidden?: boolean }>` padding-top: 4px; @@ -158,8 +157,6 @@ function InputToolbar(props: InputToolbarProps) { )} - -
diff --git a/gui/src/components/mainInput/InputToolbar/ToggleToolsButton.tsx b/gui/src/components/mainInput/InputToolbar/ToggleToolsButton.tsx deleted file mode 100644 index 20dae916025..00000000000 --- a/gui/src/components/mainInput/InputToolbar/ToggleToolsButton.tsx +++ /dev/null @@ -1,178 +0,0 @@ -import { Listbox } from "@headlessui/react"; -import { - EllipsisHorizontalCircleIcon as EllipsisHorizontalIcon, - WrenchScrewdriverIcon as WrenchScrewdriverIconOutline, -} from "@heroicons/react/24/outline"; -import { WrenchScrewdriverIcon as WrenchScrewdriverIconSolid } from "@heroicons/react/24/solid"; -import { useEffect, useRef, useState } from "react"; -import { useDispatch } from "react-redux"; -import { lightGray, vscForeground } from "../.."; -import { useAppSelector } from "../../../redux/hooks"; -import { toggleUseTools } from "../../../redux/slices/uiSlice"; -import { ToolTip } from "../../gui/Tooltip"; -import InfoHover from "../../InfoHover"; -import HoverItem from "./HoverItem"; -import PopoverTransition from "./PopoverTransition"; -import ToolDropdownItem from "./ToolDropdownItem"; -import { selectIsInEditMode } from "../../../redux/slices/sessionSlice"; - -interface ToolDropdownProps { - disabled: boolean; -} - -export default function ToolDropdown(props: ToolDropdownProps) { - const buttonRef = useRef(null); - const dispatch = useDispatch(); - const [isDropdownOpen, setDropdownOpen] = useState(false); - const [isHovered, setIsHovered] = useState(false); - - const useTools = useAppSelector((state) => state.ui.useTools); - const availableTools = useAppSelector((state) => state.config.config.tools); - const [showAbove, setShowAbove] = useState(false); - const isInEditMode = useAppSelector(selectIsInEditMode); - - const ToolsIcon = useTools - ? WrenchScrewdriverIconSolid - : WrenchScrewdriverIconOutline; - - useEffect(() => { - const checkPosition = () => { - if (buttonRef.current) { - const rect = buttonRef.current.getBoundingClientRect(); - const windowHeight = window.innerHeight; - const spaceBelow = windowHeight - rect.bottom; - setShowAbove(spaceBelow < 250); - } - }; - - if (isDropdownOpen) { - checkPosition(); - } - }, [isDropdownOpen]); - - const isDisabled = props.disabled || isInEditMode; - - return ( - !isDisabled && dispatch(toggleUseTools())}> -
- !isDisabled && setIsHovered(true)} - onMouseLeave={() => !isDisabled && setIsHovered(false)} - /> - {isDisabled && ( - - {isInEditMode - ? "Tool use not supported in edit mode" - : "This model does not support tool use"} - - )} - {!useTools && !isDisabled && ( - - Enable tool usage - - )} - - {useTools && !isDisabled && ( - <> - Tools - -
- {}} - as="div" - onClick={(e) => e.stopPropagation()} - disabled={isDisabled} - > - {({ open }) => ( - <> - { - e.stopPropagation(); - setDropdownOpen(!isDropdownOpen); - }} - className="text-lightgray flex cursor-pointer items-center border-none bg-transparent px-0 outline-none" - aria-disabled={isDisabled} - > - - - setDropdownOpen(false)} - > - -
-
- Tool policies{" "} - -

- - Automatic: - {" "} - Can be used without asking -

-

- - Allowed: - {" "} - Will ask before using -

-

- - Disabled: - {" "} - Cannot be used -

-
- } - /> -
-
-
- {availableTools.map((tool: any) => ( - - - - ))} -
- - - - )} - -
- - )} -
- - ); -} diff --git a/gui/src/components/mainInput/InputToolbar/ToolDropdownItem.tsx b/gui/src/components/mainInput/InputToolbar/ToolDropdownItem.tsx index 5df66f147a3..adea1943b7e 100644 --- a/gui/src/components/mainInput/InputToolbar/ToolDropdownItem.tsx +++ b/gui/src/components/mainInput/InputToolbar/ToolDropdownItem.tsx @@ -26,7 +26,7 @@ function ToolDropdownItem(props: ToolDropdownItemProps) { return (
{ dispatch(toggleToolSetting(props.tool.function.name)); e.stopPropagation(); diff --git a/gui/src/components/mainInput/Lump/TopInputToolbar.tsx b/gui/src/components/mainInput/Lump/TopInputToolbar.tsx index b6a6633fc12..ab51c8bfa21 100644 --- a/gui/src/components/mainInput/Lump/TopInputToolbar.tsx +++ b/gui/src/components/mainInput/Lump/TopInputToolbar.tsx @@ -4,6 +4,7 @@ import { CubeIcon, FolderIcon, PencilIcon, + WrenchScrewdriverIcon, } from "@heroicons/react/24/outline"; import AssistantSelect from "../../modelSelection/platform/AssistantSelect"; import HoverItem from "../InputToolbar/HoverItem"; @@ -90,6 +91,16 @@ export function TopInputToolbar(props: TopInputProps) { ) } /> + + props.setSelectedSection( + props.selectedSection === "tools" ? null : "tools", + ) + } + />
diff --git a/gui/src/components/mainInput/Lump/index.tsx b/gui/src/components/mainInput/Lump/index.tsx index 3c50eef3267..bd54b5015ad 100644 --- a/gui/src/components/mainInput/Lump/index.tsx +++ b/gui/src/components/mainInput/Lump/index.tsx @@ -39,7 +39,9 @@ export function Lump(props: LumpProps) { setSelectedSection={setSelectedSection} /> - +
+ +
); diff --git a/gui/src/components/mainInput/Lump/sections/SelectedSection.tsx b/gui/src/components/mainInput/Lump/sections/SelectedSection.tsx index 18e5f93c6ae..0e0da16d9b7 100644 --- a/gui/src/components/mainInput/Lump/sections/SelectedSection.tsx +++ b/gui/src/components/mainInput/Lump/sections/SelectedSection.tsx @@ -3,6 +3,7 @@ import { DocsSection } from "./DocsSection"; import { ModelsSection } from "./ModelsSection"; import { PromptsSection } from "./PromptsSection"; import { RulesSection } from "./RulesSection"; +import { ToolsSection } from "./ToolsSection"; interface SelectedSectionProps { selectedSection: string | null; @@ -20,6 +21,8 @@ export function SelectedSection(props: SelectedSectionProps) { return ; case "context": return ; + case "tools": + return ; default: return null; } diff --git a/gui/src/components/mainInput/Lump/sections/ToolsSection.tsx b/gui/src/components/mainInput/Lump/sections/ToolsSection.tsx new file mode 100644 index 00000000000..34106b701c2 --- /dev/null +++ b/gui/src/components/mainInput/Lump/sections/ToolsSection.tsx @@ -0,0 +1,25 @@ +import { useAppSelector } from "../../../../redux/hooks"; +import { getFontSize } from "../../../../util"; +import ToolDropdownItem from "../../InputToolbar/ToolDropdownItem"; + +interface ToolsSectionProps {} + +export function ToolsSection({}: ToolsSectionProps) { + const availableTools = useAppSelector((state) => state.config.config.tools); + + return ( +
+ {availableTools.map((tool: any) => ( +
+ +
+ ))} +
+ ); +} From efff2d30181648b9dedc86313740a80353d5a899 Mon Sep 17 00:00:00 2001 From: Patrick Erichsen Date: Fri, 21 Mar 2025 11:35:24 -0700 Subject: [PATCH 034/112] Revert "feat: add bookmark logic" This reverts commit d3f4aeb4c676cc4d5e090fa2ea6e497f965a3acd. --- .../ConversationStarterCard.tsx | 42 +++++++++++++++--- .../ConversationStarterCards.tsx | 43 +++++++------------ gui/src/components/index.ts | 4 +- 3 files changed, 54 insertions(+), 35 deletions(-) diff --git a/gui/src/components/ConversationStarters/ConversationStarterCard.tsx b/gui/src/components/ConversationStarters/ConversationStarterCard.tsx index 35a205481c4..1542adadf52 100644 --- a/gui/src/components/ConversationStarters/ConversationStarterCard.tsx +++ b/gui/src/components/ConversationStarters/ConversationStarterCard.tsx @@ -1,33 +1,63 @@ -import { ChatBubbleLeftIcon } from "@heroicons/react/24/outline"; +import { BookmarkIcon, ChatBubbleLeftIcon } from "@heroicons/react/24/outline"; +import { BookmarkIcon as BookmarkIconSolid } from "@heroicons/react/24/solid"; import { SlashCommandDescription } from "core"; -import { defaultBorderRadius, vscInputBackground } from ".."; +import { useState } from "react"; +import { defaultBorderRadius, GhostButton, vscInputBackground } from ".."; interface ConversationStarterCardProps { command: SlashCommandDescription; onClick: (command: SlashCommandDescription) => void; + onBookmark: (command: SlashCommandDescription) => void; + isBookmarked: boolean; } export function ConversationStarterCard({ command, onClick, + onBookmark, + isBookmarked = false, }: ConversationStarterCardProps) { + const [isHovered, setIsHovered] = useState(false); + return (
onClick(command)} - className="mb-2 w-full shadow-md hover:cursor-pointer hover:brightness-110" + className="mb-2 w-full shadow-md hover:brightness-110" style={{ borderRadius: defaultBorderRadius, backgroundColor: vscInputBackground, }} + onMouseEnter={() => setIsHovered(true)} + onMouseLeave={() => setIsHovered(false)} > -
+
-
+
onClick(command)} + className="flex flex-1 flex-col hover:cursor-pointer" + >
{command.name}
{command.description}
+
+ { + e.stopPropagation(); + onBookmark(command); + }} + aria-label={ + isBookmarked ? "Remove bookmarked prompt" : "Bookmark prompt" + } + className={isHovered || isBookmarked ? "opacity-100" : "opacity-0"} + > + {isBookmarked ? ( + + ) : ( + + )} + +
); diff --git a/gui/src/components/ConversationStarters/ConversationStarterCards.tsx b/gui/src/components/ConversationStarters/ConversationStarterCards.tsx index 69020dae50e..8df9cd9084b 100644 --- a/gui/src/components/ConversationStarters/ConversationStarterCards.tsx +++ b/gui/src/components/ConversationStarters/ConversationStarterCards.tsx @@ -10,19 +10,13 @@ const NUM_CARDS_TO_RENDER_COLLAPSED = 3; export function ConversationStarterCards() { const dispatch = useAppDispatch(); - const [isExpanded, setIsExpanded] = useState(false); + const [bookmarkedCommands, setBookmarkedCommands] = useState([]); + const slashCommands = useAppSelector((state) => state.config.config.slashCommands) ?? []; const filteredSlashCommands = slashCommands?.filter(isDeprecatedCommandName); - const numFilteredSlashCommands = filteredSlashCommands.length; - const displayedCommands = isExpanded - ? filteredSlashCommands - : filteredSlashCommands.slice(0, NUM_CARDS_TO_RENDER_COLLAPSED); - const hasMoreCommands = - numFilteredSlashCommands > NUM_CARDS_TO_RENDER_COLLAPSED; - function onClick(command: SlashCommandDescription) { if (command.prompt) { dispatch( @@ -31,8 +25,14 @@ export function ConversationStarterCards() { } } - function handleToggleExpand() { - setIsExpanded(!isExpanded); + function handleBookmarkCommand(command: SlashCommandDescription) { + setBookmarkedCommands((prev) => { + if (prev.includes(command.name)) { + return prev.filter((name) => name !== command.name); + } else { + return [...prev, command.name]; + } + }); } if (!filteredSlashCommands || filteredSlashCommands.length === 0) { @@ -40,29 +40,18 @@ export function ConversationStarterCards() { } return ( -
-

Prompts

- -
- {displayedCommands.map((command, i) => ( +
+ {filteredSlashCommands + .slice(0, NUM_CARDS_TO_RENDER_COLLAPSED) + .map((command, i) => ( ))} -
- - {hasMoreCommands && ( -

- {isExpanded - ? "Show less" - : `Show ${numFilteredSlashCommands - NUM_CARDS_TO_RENDER_COLLAPSED} more...`} -

- )}
); } diff --git a/gui/src/components/index.ts b/gui/src/components/index.ts index 04460f3b158..eb0632646e2 100644 --- a/gui/src/components/index.ts +++ b/gui/src/components/index.ts @@ -1,5 +1,5 @@ import styled from "styled-components"; -import { getFontSize, isJetBrains } from "../util"; +import { getFontSize } from "../util"; export const VSC_INPUT_BACKGROUND_VAR = "--vscode-input-background"; export const VSC_BACKGROUND_VAR = "--vscode-sideBar-background"; @@ -151,7 +151,7 @@ export const SecondaryButton = styled.button` `; export const GhostButton = styled.button` - padding: 10px 12px; + padding: 6px 8px; margin: 8px 0; border-radius: ${defaultBorderRadius}; From 03e7d5d1e931af67deeb81a9cae0852dc9bdd3a4 Mon Sep 17 00:00:00 2001 From: Dallin Romney Date: Fri, 21 Mar 2025 11:35:38 -0700 Subject: [PATCH 035/112] tool groupe name --- core/config/profile/doLoadConfig.ts | 1 + core/index.d.ts | 1 + core/tools/builtIn.ts | 3 ++- core/tools/definitions/createNewFile.ts | 3 ++- core/tools/definitions/exactSearch.ts | 3 ++- .../definitions/readCurrentlyOpenFile.ts | 3 ++- core/tools/definitions/readFile.ts | 3 ++- core/tools/definitions/runTerminalCommand.ts | 3 ++- core/tools/definitions/searchWeb.ts | 3 ++- core/tools/definitions/viewDiff.ts | 3 ++- core/tools/definitions/viewRepoMap.ts | 3 ++- core/tools/definitions/viewSubdirectory.ts | 3 ++- .../InputToolbar/ToolDropdownItem.tsx | 19 ++++++++++--------- 13 files changed, 32 insertions(+), 19 deletions(-) diff --git a/core/config/profile/doLoadConfig.ts b/core/config/profile/doLoadConfig.ts index 8065718d92a..33bdf9b6cbc 100644 --- a/core/config/profile/doLoadConfig.ts +++ b/core/config/profile/doLoadConfig.ts @@ -134,6 +134,7 @@ export default async function doLoadConfig( type: "function" as const, wouldLikeTo: "", uri: encodeMCPToolUri(server.id, tool.name), + group: server.name, })); newConfig.tools.push(...serverTools); diff --git a/core/index.d.ts b/core/index.d.ts index 6a6614b6137..f73fec9ceab 100644 --- a/core/index.d.ts +++ b/core/index.d.ts @@ -912,6 +912,7 @@ export interface Tool { readonly: boolean; uri?: string; faviconUrl?: string; + group: string; } interface ToolChoice { diff --git a/core/tools/builtIn.ts b/core/tools/builtIn.ts index d15db456c46..268cbb9a857 100644 --- a/core/tools/builtIn.ts +++ b/core/tools/builtIn.ts @@ -8,4 +8,5 @@ export enum BuiltInToolNames { ExactSearch = "builtin_exact_search", SearchWeb = "builtin_search_web", ViewDiff = "builtin_view_diff", -} \ No newline at end of file +} +export const BUILT_IN_GROUP_NAME = "Built-In"; diff --git a/core/tools/definitions/createNewFile.ts b/core/tools/definitions/createNewFile.ts index 7af42d6a87d..f932ae87b1e 100644 --- a/core/tools/definitions/createNewFile.ts +++ b/core/tools/definitions/createNewFile.ts @@ -1,10 +1,11 @@ import { Tool } from "../.."; -import { BuiltInToolNames } from "../builtIn"; +import { BUILT_IN_GROUP_NAME, BuiltInToolNames } from "../builtIn"; export const createNewFileTool: Tool = { type: "function", displayTitle: "Create New File", wouldLikeTo: "create a new file", + group: BUILT_IN_GROUP_NAME, readonly: false, function: { name: BuiltInToolNames.CreateNewFile, diff --git a/core/tools/definitions/exactSearch.ts b/core/tools/definitions/exactSearch.ts index 8358b55da10..400adbd9ef3 100644 --- a/core/tools/definitions/exactSearch.ts +++ b/core/tools/definitions/exactSearch.ts @@ -1,11 +1,12 @@ import { Tool } from "../.."; -import { BuiltInToolNames } from "../builtIn"; +import { BUILT_IN_GROUP_NAME, BuiltInToolNames } from "../builtIn"; export const exactSearchTool: Tool = { type: "function", displayTitle: "Exact Search", wouldLikeTo: 'search for "{{{ query }}}" in the repository', readonly: true, + group: BUILT_IN_GROUP_NAME, function: { name: BuiltInToolNames.ExactSearch, description: "Perform an exact search over the repository using ripgrep.", diff --git a/core/tools/definitions/readCurrentlyOpenFile.ts b/core/tools/definitions/readCurrentlyOpenFile.ts index 5abc2edb1b9..75a0e8169e2 100644 --- a/core/tools/definitions/readCurrentlyOpenFile.ts +++ b/core/tools/definitions/readCurrentlyOpenFile.ts @@ -1,11 +1,12 @@ import { Tool } from "../.."; -import { BuiltInToolNames } from "../builtIn"; +import { BUILT_IN_GROUP_NAME, BuiltInToolNames } from "../builtIn"; export const readCurrentlyOpenFileTool: Tool = { type: "function", displayTitle: "Read Currently Open File", wouldLikeTo: "read the current file", readonly: true, + group: BUILT_IN_GROUP_NAME, function: { name: BuiltInToolNames.ReadCurrentlyOpenFile, description: diff --git a/core/tools/definitions/readFile.ts b/core/tools/definitions/readFile.ts index 4f5366e23e4..53d381e62fa 100644 --- a/core/tools/definitions/readFile.ts +++ b/core/tools/definitions/readFile.ts @@ -1,11 +1,12 @@ import { Tool } from "../.."; -import { BuiltInToolNames } from "../builtIn"; +import { BUILT_IN_GROUP_NAME, BuiltInToolNames } from "../builtIn"; export const readFileTool: Tool = { type: "function", displayTitle: "Read File", wouldLikeTo: "read {{{ filepath }}}", readonly: true, + group: BUILT_IN_GROUP_NAME, function: { name: BuiltInToolNames.ReadFile, description: diff --git a/core/tools/definitions/runTerminalCommand.ts b/core/tools/definitions/runTerminalCommand.ts index 1b526009aaa..2b7882167c6 100644 --- a/core/tools/definitions/runTerminalCommand.ts +++ b/core/tools/definitions/runTerminalCommand.ts @@ -1,11 +1,12 @@ import { Tool } from "../.."; -import { BuiltInToolNames } from "../builtIn"; +import { BUILT_IN_GROUP_NAME, BuiltInToolNames } from "../builtIn"; export const runTerminalCommandTool: Tool = { type: "function", displayTitle: "Run Terminal Command", wouldLikeTo: "run a terminal command", readonly: false, + group: BUILT_IN_GROUP_NAME, function: { name: BuiltInToolNames.RunTerminalCommand, description: diff --git a/core/tools/definitions/searchWeb.ts b/core/tools/definitions/searchWeb.ts index dfbcb04f760..7e2724a7cb0 100644 --- a/core/tools/definitions/searchWeb.ts +++ b/core/tools/definitions/searchWeb.ts @@ -1,12 +1,13 @@ import { Tool } from "../.."; -import { BuiltInToolNames } from "../builtIn"; +import { BUILT_IN_GROUP_NAME, BuiltInToolNames } from "../builtIn"; export const searchWebTool: Tool = { type: "function", displayTitle: "Search Web", wouldLikeTo: 'search the web for "{{{ query }}}"', readonly: true, + group: BUILT_IN_GROUP_NAME, function: { name: BuiltInToolNames.SearchWeb, description: diff --git a/core/tools/definitions/viewDiff.ts b/core/tools/definitions/viewDiff.ts index e54086d052c..3da0c71a908 100644 --- a/core/tools/definitions/viewDiff.ts +++ b/core/tools/definitions/viewDiff.ts @@ -1,12 +1,13 @@ import { Tool } from "../.."; -import { BuiltInToolNames } from "../builtIn"; +import { BUILT_IN_GROUP_NAME, BuiltInToolNames } from "../builtIn"; export const viewDiffTool: Tool = { type: "function", displayTitle: "View Diff", wouldLikeTo: "view a diff", readonly: true, + group: BUILT_IN_GROUP_NAME, function: { name: BuiltInToolNames.ViewDiff, description: "View the current diff of working changes", diff --git a/core/tools/definitions/viewRepoMap.ts b/core/tools/definitions/viewRepoMap.ts index 9cf3d319d2f..60d671177cf 100644 --- a/core/tools/definitions/viewRepoMap.ts +++ b/core/tools/definitions/viewRepoMap.ts @@ -1,12 +1,13 @@ import { Tool } from "../.."; -import { BuiltInToolNames } from "../builtIn"; +import { BUILT_IN_GROUP_NAME, BuiltInToolNames } from "../builtIn"; export const viewRepoMapTool: Tool = { type: "function", displayTitle: "View Repo Map", wouldLikeTo: "view the repository map", readonly: true, + group: BUILT_IN_GROUP_NAME, function: { name: BuiltInToolNames.ViewRepoMap, description: "View the repository map", diff --git a/core/tools/definitions/viewSubdirectory.ts b/core/tools/definitions/viewSubdirectory.ts index 70b7524bd88..b78daba769f 100644 --- a/core/tools/definitions/viewSubdirectory.ts +++ b/core/tools/definitions/viewSubdirectory.ts @@ -1,11 +1,12 @@ import { Tool } from "../.."; -import { BuiltInToolNames } from "../builtIn"; +import { BUILT_IN_GROUP_NAME, BuiltInToolNames } from "../builtIn"; export const viewSubdirectoryTool: Tool = { type: "function", displayTitle: "View Subdirectory", wouldLikeTo: 'view the contents of "{{{ directory_path }}}"', readonly: true, + group: BUILT_IN_GROUP_NAME, function: { name: BuiltInToolNames.ViewSubdirectory, description: "View the contents of a subdirectory", diff --git a/gui/src/components/mainInput/InputToolbar/ToolDropdownItem.tsx b/gui/src/components/mainInput/InputToolbar/ToolDropdownItem.tsx index 64a36c959b5..c75ea5847de 100644 --- a/gui/src/components/mainInput/InputToolbar/ToolDropdownItem.tsx +++ b/gui/src/components/mainInput/InputToolbar/ToolDropdownItem.tsx @@ -29,21 +29,22 @@ function ToolDropdownItem(props: ToolDropdownItemProps) { return (
{ dispatch(toggleToolSetting(props.tool.function.name)); e.stopPropagation(); e.preventDefault(); }} > -
+
{props.duplicatesDetected ? ( <> - - +
+ +
) : null} - + {props.tool.faviconUrl && (
-
+
{(settings === "allowedWithPermission" || settings === undefined) && ( Allowed )} From 9c2db6b9c7d7fd0a0164b3e2288a4135df759707 Mon Sep 17 00:00:00 2001 From: Patrick Erichsen Date: Fri, 21 Mar 2025 12:36:21 -0700 Subject: [PATCH 036/112] feat: create profiles slice --- .../CodeToEditCard/AddFileCombobox.tsx | 8 +-- .../platform/AssistantSelect.tsx | 2 +- .../platform/AssistantSelectOptions.tsx | 2 +- gui/src/context/Auth.tsx | 5 +- gui/src/hooks/useSetup.ts | 2 +- gui/src/pages/config/AccountManagement.tsx | 2 +- gui/src/pages/config/ScopeSelect.tsx | 2 +- gui/src/redux/index.ts | 1 + gui/src/redux/slices/index.ts | 1 + gui/src/redux/slices/profiles/index.ts | 2 + gui/src/redux/slices/profiles/slice.ts | 65 +++++++++++++++++++ .../profiles/thunks.ts} | 4 +- gui/src/redux/store.ts | 2 + 13 files changed, 83 insertions(+), 15 deletions(-) create mode 100644 gui/src/redux/index.ts create mode 100644 gui/src/redux/slices/index.ts create mode 100644 gui/src/redux/slices/profiles/index.ts create mode 100644 gui/src/redux/slices/profiles/slice.ts rename gui/src/redux/{thunks/profileAndOrg.ts => slices/profiles/thunks.ts} (98%) diff --git a/gui/src/components/CodeToEditCard/AddFileCombobox.tsx b/gui/src/components/CodeToEditCard/AddFileCombobox.tsx index 07ab68a2cb6..9450ba48066 100644 --- a/gui/src/components/CodeToEditCard/AddFileCombobox.tsx +++ b/gui/src/components/CodeToEditCard/AddFileCombobox.tsx @@ -1,9 +1,9 @@ -import { useState, useEffect, useRef } from "react"; -import { useSubmenuContextProviders } from "../../context/SubmenuContextProviders"; import { Combobox } from "@headlessui/react"; -import FileIcon from "../FileIcon"; -import { useAppSelector } from "../../redux/hooks"; import { ContextSubmenuItemWithProvider } from "core"; +import { useEffect, useRef, useState } from "react"; +import { useSubmenuContextProviders } from "../../context/SubmenuContextProviders"; +import { useAppSelector } from "../../redux/hooks"; +import FileIcon from "../FileIcon"; export interface AddFileComboboxProps { onSelect: (filepaths: string[]) => void | Promise; diff --git a/gui/src/components/modelSelection/platform/AssistantSelect.tsx b/gui/src/components/modelSelection/platform/AssistantSelect.tsx index e64acb8f621..3bba921f80c 100644 --- a/gui/src/components/modelSelection/platform/AssistantSelect.tsx +++ b/gui/src/components/modelSelection/platform/AssistantSelect.tsx @@ -4,8 +4,8 @@ import { ProfileDescription } from "core/config/ConfigHandler"; import { useContext, useEffect, useRef } from "react"; import { useAuth } from "../../../context/Auth"; import { IdeMessengerContext } from "../../../context/IdeMessenger"; +import { cycleProfile } from "../../../redux"; import { useAppDispatch } from "../../../redux/hooks"; -import { cycleProfile } from "../../../redux/thunks/profileAndOrg"; import { getFontSize, isMetaEquivalentKeyPressed } from "../../../util"; import PopoverTransition from "../../mainInput/InputToolbar/PopoverTransition"; import AssistantIcon from "./AssistantIcon"; diff --git a/gui/src/components/modelSelection/platform/AssistantSelectOptions.tsx b/gui/src/components/modelSelection/platform/AssistantSelectOptions.tsx index cd8d5cd5cf1..c7b9caa8038 100644 --- a/gui/src/components/modelSelection/platform/AssistantSelectOptions.tsx +++ b/gui/src/components/modelSelection/platform/AssistantSelectOptions.tsx @@ -5,8 +5,8 @@ import { useNavigate } from "react-router-dom"; import { lightGray } from "../.."; import { useAuth } from "../../../context/Auth"; import { IdeMessengerContext } from "../../../context/IdeMessenger"; +import { selectProfileThunk } from "../../../redux"; import { useAppDispatch } from "../../../redux/hooks"; -import { selectProfileThunk } from "../../../redux/thunks/profileAndOrg"; import { getFontSize, getMetaKeyLabel, isLocalProfile } from "../../../util"; import { ROUTES } from "../../../util/navigation"; import AssistantIcon from "./AssistantIcon"; diff --git a/gui/src/context/Auth.tsx b/gui/src/context/Auth.tsx index 8ca1e5be01b..6baa3a3088b 100644 --- a/gui/src/context/Auth.tsx +++ b/gui/src/context/Auth.tsx @@ -12,14 +12,11 @@ import React, { } from "react"; import ConfirmationDialog from "../components/dialogs/ConfirmationDialog"; import { useWebviewListener } from "../hooks/useWebviewListener"; +import { updateOrgsThunk, updateProfilesThunk } from "../redux"; import { useAppDispatch, useAppSelector } from "../redux/hooks"; import { setLastControlServerBetaEnabledStatus } from "../redux/slices/miscSlice"; import { selectSelectedProfile } from "../redux/slices/sessionSlice"; import { setDialogMessage, setShowDialog } from "../redux/slices/uiSlice"; -import { - updateOrgsThunk, - updateProfilesThunk, -} from "../redux/thunks/profileAndOrg"; import { IdeMessengerContext } from "./IdeMessenger"; interface AuthContextType { diff --git a/gui/src/hooks/useSetup.ts b/gui/src/hooks/useSetup.ts index 9d7f607b544..22a3ec32464 100644 --- a/gui/src/hooks/useSetup.ts +++ b/gui/src/hooks/useSetup.ts @@ -4,6 +4,7 @@ import { IdeMessengerContext } from "../context/IdeMessenger"; import { ConfigResult } from "@continuedev/config-yaml"; import { BrowserSerializedContinueConfig } from "core"; +import { selectProfileThunk } from "../redux"; import { useAppDispatch, useAppSelector } from "../redux/hooks"; import { selectDefaultModel, @@ -16,7 +17,6 @@ import { setInactive, } from "../redux/slices/sessionSlice"; import { setTTSActive } from "../redux/slices/uiSlice"; -import { selectProfileThunk } from "../redux/thunks/profileAndOrg"; import { refreshSessionMetadata } from "../redux/thunks/session"; import { streamResponseThunk } from "../redux/thunks/streamResponse"; import { updateFileSymbolsFromHistory } from "../redux/thunks/updateFileSymbols"; diff --git a/gui/src/pages/config/AccountManagement.tsx b/gui/src/pages/config/AccountManagement.tsx index 1b9dd80afca..029718ed8ac 100644 --- a/gui/src/pages/config/AccountManagement.tsx +++ b/gui/src/pages/config/AccountManagement.tsx @@ -8,8 +8,8 @@ import { Fragment, useContext } from "react"; import AssistantIcon from "../../components/modelSelection/platform/AssistantIcon"; import { useAuth } from "../../context/Auth"; import { IdeMessengerContext } from "../../context/IdeMessenger"; +import { selectProfileThunk } from "../../redux"; import { useAppDispatch } from "../../redux/hooks"; -import { selectProfileThunk } from "../../redux/thunks/profileAndOrg"; import { ScopeSelect } from "./ScopeSelect"; export function AccountManagement({ hubEnabled }: { hubEnabled: boolean }) { diff --git a/gui/src/pages/config/ScopeSelect.tsx b/gui/src/pages/config/ScopeSelect.tsx index 2d42483a00f..1efd465e83c 100644 --- a/gui/src/pages/config/ScopeSelect.tsx +++ b/gui/src/pages/config/ScopeSelect.tsx @@ -6,8 +6,8 @@ import { } from "@heroicons/react/24/outline"; import { useAuth } from "../../context/Auth"; import { useWebviewListener } from "../../hooks/useWebviewListener"; +import { selectOrgThunk } from "../../redux"; import { useAppDispatch, useAppSelector } from "../../redux/hooks"; -import { selectOrgThunk } from "../../redux/thunks/profileAndOrg"; export function ScopeSelect() { const { organizations, selectedOrganization } = useAuth(); diff --git a/gui/src/redux/index.ts b/gui/src/redux/index.ts new file mode 100644 index 00000000000..0af19ed8d64 --- /dev/null +++ b/gui/src/redux/index.ts @@ -0,0 +1 @@ +export * from "./slices"; diff --git a/gui/src/redux/slices/index.ts b/gui/src/redux/slices/index.ts new file mode 100644 index 00000000000..09303f50822 --- /dev/null +++ b/gui/src/redux/slices/index.ts @@ -0,0 +1 @@ +export * from "./profiles"; diff --git a/gui/src/redux/slices/profiles/index.ts b/gui/src/redux/slices/profiles/index.ts new file mode 100644 index 00000000000..22be336b5f5 --- /dev/null +++ b/gui/src/redux/slices/profiles/index.ts @@ -0,0 +1,2 @@ +export * from "./slice"; +export * from "./thunks"; diff --git a/gui/src/redux/slices/profiles/slice.ts b/gui/src/redux/slices/profiles/slice.ts new file mode 100644 index 00000000000..1f01ab6b6e9 --- /dev/null +++ b/gui/src/redux/slices/profiles/slice.ts @@ -0,0 +1,65 @@ +import { createSlice, PayloadAction } from "@reduxjs/toolkit"; +import { ProfileDescription } from "core/config/ConfigHandler"; +import { OrganizationDescription } from "core/config/ProfileLifecycleManager"; + +interface ProfilesState { + availableProfiles: ProfileDescription[] | null; + selectedProfileId: string | null; + organizations: OrganizationDescription[]; + selectedOrganizationId: string | null; +} + +const initialState: ProfilesState = { + availableProfiles: null, + selectedProfileId: null, + organizations: [], + selectedOrganizationId: null, +}; + +export const profilesSlice = createSlice({ + name: "profiles", + initialState, + reducers: { + setSelectedProfile: (state, { payload }: PayloadAction) => { + state.selectedProfileId = payload; + }, + setAvailableProfiles: ( + state, + { payload }: PayloadAction, + ) => { + state.availableProfiles = payload; + }, + setOrganizations: ( + state, + { payload }: PayloadAction, + ) => { + state.organizations = payload; + }, + setSelectedOrganizationId: ( + state, + { payload }: PayloadAction, + ) => { + state.selectedOrganizationId = payload; + }, + }, + selectors: { + selectSelectedProfile: (state) => { + return ( + state.availableProfiles?.find( + (profile) => profile.id === state.selectedProfileId, + ) ?? null + ); + }, + }, +}); + +export const { + setAvailableProfiles, + setSelectedProfile, + setOrganizations, + setSelectedOrganizationId, +} = profilesSlice.actions; + +export const { selectSelectedProfile } = profilesSlice.selectors; + +export const { reducer: profilesReducer } = profilesSlice; diff --git a/gui/src/redux/thunks/profileAndOrg.ts b/gui/src/redux/slices/profiles/thunks.ts similarity index 98% rename from gui/src/redux/thunks/profileAndOrg.ts rename to gui/src/redux/slices/profiles/thunks.ts index 0b378db66dd..580770476f9 100644 --- a/gui/src/redux/thunks/profileAndOrg.ts +++ b/gui/src/redux/slices/profiles/thunks.ts @@ -1,13 +1,13 @@ import { createAsyncThunk } from "@reduxjs/toolkit"; import { ProfileDescription } from "core/config/ConfigHandler"; import { OrganizationDescription } from "core/config/ProfileLifecycleManager"; +import { ThunkApiType } from "../../store"; import { setAvailableProfiles, setOrganizations, setSelectedOrganizationId, setSelectedProfile, -} from "../slices/sessionSlice"; -import { ThunkApiType } from "../store"; +} from "./slice"; export const selectProfileThunk = createAsyncThunk< void, diff --git a/gui/src/redux/store.ts b/gui/src/redux/store.ts index 0e7e5f80509..601b41853b6 100644 --- a/gui/src/redux/store.ts +++ b/gui/src/redux/store.ts @@ -10,6 +10,7 @@ import { createFilter } from "redux-persist-transform-filter"; import autoMergeLevel2 from "redux-persist/lib/stateReconciler/autoMergeLevel2"; import storage from "redux-persist/lib/storage"; import { IdeMessenger, IIdeMessenger } from "../context/IdeMessenger"; +import { profilesReducer } from "./redux"; import configReducer from "./slices/configSlice"; import editModeStateReducer from "./slices/editModeState"; import indexingReducer from "./slices/indexingSlice"; @@ -31,6 +32,7 @@ const rootReducer = combineReducers({ config: configReducer, indexing: indexingReducer, tabs: tabsReducer, + profiles: profilesReducer, }); const saveSubsetFilters = [ From a49ac7b6aab1318d2d829b02de2744e6f785895c Mon Sep 17 00:00:00 2001 From: Nate Date: Fri, 21 Mar 2025 12:39:03 -0700 Subject: [PATCH 037/112] styling of lump icons --- gui/src/components/index.ts | 3 +- .../mainInput/Lump/TopInputToolbar.tsx | 33 ++++++++++++++++--- 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/gui/src/components/index.ts b/gui/src/components/index.ts index 04460f3b158..4b0d145b252 100644 --- a/gui/src/components/index.ts +++ b/gui/src/components/index.ts @@ -1,5 +1,5 @@ import styled from "styled-components"; -import { getFontSize, isJetBrains } from "../util"; +import { getFontSize } from "../util"; export const VSC_INPUT_BACKGROUND_VAR = "--vscode-input-background"; export const VSC_BACKGROUND_VAR = "--vscode-sideBar-background"; @@ -59,6 +59,7 @@ export const vscListActiveForeground = `var(${VSC_LIST_ACTIVE_FOREGROUND_VAR}, $ export const vscInputBorder = `var(${VSC_INPUT_BORDER_VAR}, ${lightGray})`; export const vscInputBorderFocus = `var(${VSC_FOCUS_BORDER_VAR}, ${lightGray})`; export const vscBadgeBackground = `var(${VSC_BADGE_BACKGROUND_VAR}, #1bbe84)`; +export const vscBadgeForeground = `var(${VSC_BADGE_FOREGROUND_VAR}, #ffffff)`; export const vscCommandCenterActiveBorder = `var(${VSC_COMMAND_CENTER_ACTIVE_BORDER_VAR}, #1bbe84)`; export const vscCommandCenterInactiveBorder = `var(${VSC_COMMAND_CENTER_INACTIVE_BORDER_VAR}, #1bbe84)`; export const vscFindMatchSelected = `var(${VSC_FIND_MATCH_SELECTED_VAR}, rgba(255, 223, 0))`; diff --git a/gui/src/components/mainInput/Lump/TopInputToolbar.tsx b/gui/src/components/mainInput/Lump/TopInputToolbar.tsx index ab51c8bfa21..bdf379f9a44 100644 --- a/gui/src/components/mainInput/Lump/TopInputToolbar.tsx +++ b/gui/src/components/mainInput/Lump/TopInputToolbar.tsx @@ -6,6 +6,8 @@ import { PencilIcon, WrenchScrewdriverIcon, } from "@heroicons/react/24/outline"; +import { vscBadgeBackground, vscBadgeForeground } from "../.."; +import { getFontSize } from "../../../util"; import AssistantSelect from "../../modelSelection/platform/AssistantSelect"; import HoverItem from "../InputToolbar/HoverItem"; @@ -20,12 +22,33 @@ interface TopToolbarIconProps { function TopToolbarIcon(props: TopToolbarIconProps) { return ( -
+
+
+ + {props.tooltip} + +
); @@ -40,7 +63,7 @@ export function TopInputToolbar(props: TopInputProps) { return (
-
+
Date: Fri, 21 Mar 2025 12:44:19 -0700 Subject: [PATCH 038/112] make tabs tabbable --- .../components/mainInput/Lump/TopInputToolbar.tsx | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/gui/src/components/mainInput/Lump/TopInputToolbar.tsx b/gui/src/components/mainInput/Lump/TopInputToolbar.tsx index bdf379f9a44..e77e62da409 100644 --- a/gui/src/components/mainInput/Lump/TopInputToolbar.tsx +++ b/gui/src/components/mainInput/Lump/TopInputToolbar.tsx @@ -23,18 +23,25 @@ function TopToolbarIcon(props: TopToolbarIconProps) { return (
{ + if (e.key === "Enter" || e.key === " ") { + e.preventDefault(); + props.onClick(); + } + }} style={{ backgroundColor: props.isSelected ? vscBadgeBackground : undefined, }} - className={`relative flex select-none items-center px-0.5 transition-all duration-200 ${ - props.isSelected ? "rounded-full" : "" - }`} + className={`relative flex select-none items-center rounded-full px-0.5 transition-all duration-200 focus:outline-none focus-visible:ring-2 focus-visible:ring-blue-500/50`} >