diff --git a/.github/workflows/jan-electron-build-beta.yml b/.github/workflows/jan-electron-build-beta.yml index 4f9886010..61ff717ac 100644 --- a/.github/workflows/jan-electron-build-beta.yml +++ b/.github/workflows/jan-electron-build-beta.yml @@ -18,6 +18,8 @@ jobs: public_provider: github new_version: ${{ needs.get-update-version.outputs.new_version }} beta: true + nightly: false + cortex_api_port: "39271" build-windows-x64: uses: ./.github/workflows/template-build-windows-x64.yml @@ -28,6 +30,8 @@ jobs: public_provider: github new_version: ${{ needs.get-update-version.outputs.new_version }} beta: true + nightly: false + cortex_api_port: "39271" build-linux-x64: uses: ./.github/workflows/template-build-linux-x64.yml @@ -38,6 +42,8 @@ jobs: public_provider: github new_version: ${{ needs.get-update-version.outputs.new_version }} beta: true + nightly: false + cortex_api_port: "39271" sync-temp-to-latest: needs: [build-macos, build-windows-x64, build-linux-x64] diff --git a/.github/workflows/jan-electron-build-nightly.yml b/.github/workflows/jan-electron-build-nightly.yml index e08a35169..af5bab195 100644 --- a/.github/workflows/jan-electron-build-nightly.yml +++ b/.github/workflows/jan-electron-build-nightly.yml @@ -55,6 +55,9 @@ jobs: ref: ${{ needs.set-public-provider.outputs.ref }} public_provider: ${{ needs.set-public-provider.outputs.public_provider }} new_version: ${{ needs.get-update-version.outputs.new_version }} + nightly: true + beta: false + cortex_api_port: "39261" build-windows-x64: uses: ./.github/workflows/template-build-windows-x64.yml @@ -64,8 +67,9 @@ jobs: ref: ${{ needs.set-public-provider.outputs.ref }} public_provider: ${{ needs.set-public-provider.outputs.public_provider }} new_version: ${{ needs.get-update-version.outputs.new_version }} - - + nightly: true + beta: false + cortex_api_port: "39261" build-linux-x64: uses: ./.github/workflows/template-build-linux-x64.yml secrets: inherit @@ -74,6 +78,9 @@ jobs: ref: ${{ needs.set-public-provider.outputs.ref }} public_provider: ${{ needs.set-public-provider.outputs.public_provider }} new_version: ${{ needs.get-update-version.outputs.new_version }} + nightly: true + beta: false + cortex_api_port: "39261" sync-temp-to-latest: needs: [set-public-provider, build-windows-x64, build-linux-x64, build-macos] @@ -141,4 +148,3 @@ jobs: RUN_ID=${{ github.run_id }} COMMENT="This is the build for this pull request. You can download it from the Artifacts section here: [Build URL](https://github.com/${{ github.repository }}/actions/runs/${RUN_ID})." gh pr comment $PR_URL --body "$COMMENT" - \ No newline at end of file diff --git a/.github/workflows/jan-electron-build.yml b/.github/workflows/jan-electron-build.yml index 3ca4a1fe2..7d69a5c12 100644 --- a/.github/workflows/jan-electron-build.yml +++ b/.github/workflows/jan-electron-build.yml @@ -40,6 +40,8 @@ jobs: with: ref: ${{ github.ref }} public_provider: github + beta: false + nightly: false new_version: ${{ needs.get-update-version.outputs.new_version }} build-windows-x64: @@ -49,6 +51,8 @@ jobs: with: ref: ${{ github.ref }} public_provider: github + beta: false + nightly: false new_version: ${{ needs.get-update-version.outputs.new_version }} build-linux-x64: @@ -58,6 +62,8 @@ jobs: with: ref: ${{ github.ref }} public_provider: github + beta: false + nightly: false new_version: ${{ needs.get-update-version.outputs.new_version }} update_release_draft: @@ -82,4 +88,4 @@ jobs: # config-name: my-config.yml # disable-autolabeler: true env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file diff --git a/.github/workflows/nightly-integrate-cortex-cpp.yml b/.github/workflows/nightly-integrate-cortex-cpp.yml index 8ddc40a11..2cd7345c8 100644 --- a/.github/workflows/nightly-integrate-cortex-cpp.yml +++ b/.github/workflows/nightly-integrate-cortex-cpp.yml @@ -36,7 +36,7 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.PAT_SERVICE_ACCOUNT }} run: | - curl -s https://api.github.com/repos/janhq/cortex/releases > /tmp/github_api_releases.json + curl -s https://api.github.com/repos/menloresearch/cortex/releases > /tmp/github_api_releases.json latest_prerelease_name=$(cat /tmp/github_api_releases.json | jq -r '.[] | select(.prerelease) | .name' | head -n 1) get_asset_count() { diff --git a/.github/workflows/template-build-linux-x64.yml b/.github/workflows/template-build-linux-x64.yml index 68079d0dc..58b566931 100644 --- a/.github/workflows/template-build-linux-x64.yml +++ b/.github/workflows/template-build-linux-x64.yml @@ -23,6 +23,14 @@ on: required: false type: boolean default: false + nightly: + required: false + type: boolean + default: false + cortex_api_port: + required: false + type: string + default: null secrets: DELTA_AWS_S3_BUCKET_NAME: required: false @@ -43,6 +51,31 @@ jobs: with: ref: ${{ inputs.ref }} + - name: Replace Icons for Beta Build + if: inputs.beta == true && inputs.nightly != true + shell: bash + run: | + rm -rf electron/icons/* + + cp electron/icons_dev/jan-beta-512x512.png electron/icons/512x512.png + cp electron/icons_dev/jan-beta.ico electron/icons/icon.ico + cp electron/icons_dev/jan-beta.png electron/icons/icon.png + cp electron/icons_dev/jan-beta-tray@2x.png electron/icons/icon-tray@2x.png + cp electron/icons_dev/jan-beta-tray.png electron/icons/icon-tray.png + + - name: Replace Icons for Nightly Build + if: inputs.nightly == true && inputs.beta != true + shell: bash + run: | + rm -rf electron/icons/* + + cp electron/icons_dev/jan-nightly-512x512.png electron/icons/512x512.png + cp electron/icons_dev/jan-nightly.ico electron/icons/icon.ico + cp electron/icons_dev/jan-nightly.png electron/icons/icon.png + cp electron/icons_dev/jan-nightly-tray@2x.png electron/icons/icon-tray@2x.png + cp electron/icons_dev/jan-nightly-tray.png electron/icons/icon-tray.png + + - name: Installing node uses: actions/setup-node@v1 with: @@ -115,6 +148,7 @@ jobs: AWS_MAX_ATTEMPTS: '5' POSTHOG_KEY: ${{ secrets.POSTHOG_KEY }} POSTHOG_HOST: ${{ secrets.POSTHOG_HOST }} + CORTEX_API_PORT: ${{ inputs.cortex_api_port }} - name: Build and publish app to github if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') && inputs.public_provider == 'github' && inputs.beta == false @@ -150,4 +184,4 @@ jobs: uses: actions/upload-artifact@v4 with: name: jan-linux-amd64-${{ inputs.new_version }}-AppImage - path: ./electron/dist/*.AppImage + path: ./electron/dist/*.AppImage \ No newline at end of file diff --git a/.github/workflows/template-build-macos.yml b/.github/workflows/template-build-macos.yml index 6bc38f786..a5e5cc724 100644 --- a/.github/workflows/template-build-macos.yml +++ b/.github/workflows/template-build-macos.yml @@ -23,6 +23,14 @@ on: required: false type: boolean default: false + nightly: + required: false + type: boolean + default: false + cortex_api_port: + required: false + type: string + default: null secrets: DELTA_AWS_S3_BUCKET_NAME: required: false @@ -52,6 +60,30 @@ jobs: uses: actions/checkout@v3 with: ref: ${{ inputs.ref }} + + - name: Replace Icons for Beta Build + if: inputs.beta == true && inputs.nightly != true + shell: bash + run: | + rm -rf electron/icons/* + + cp electron/icons_dev/jan-beta-512x512.png electron/icons/512x512.png + cp electron/icons_dev/jan-beta.ico electron/icons/icon.ico + cp electron/icons_dev/jan-beta.png electron/icons/icon.png + cp electron/icons_dev/jan-beta-tray@2x.png electron/icons/icon-tray@2x.png + cp electron/icons_dev/jan-beta-tray.png electron/icons/icon-tray.png + + - name: Replace Icons for Nightly Build + if: inputs.nightly == true && inputs.beta != true + shell: bash + run: | + rm -rf electron/icons/* + + cp electron/icons_dev/jan-nightly-512x512.png electron/icons/512x512.png + cp electron/icons_dev/jan-nightly.ico electron/icons/icon.ico + cp electron/icons_dev/jan-nightly.png electron/icons/icon.png + cp electron/icons_dev/jan-nightly-tray@2x.png electron/icons/icon-tray@2x.png + cp electron/icons_dev/jan-nightly-tray.png electron/icons/icon-tray.png - name: Installing node uses: actions/setup-node@v1 @@ -154,6 +186,7 @@ jobs: AWS_MAX_ATTEMPTS: '5' POSTHOG_KEY: ${{ secrets.POSTHOG_KEY }} POSTHOG_HOST: ${{ secrets.POSTHOG_HOST }} + CORTEX_API_PORT: ${{ inputs.cortex_api_port }} - name: Build and publish app to github if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') && inputs.public_provider == 'github' && inputs.beta == false @@ -197,4 +230,4 @@ jobs: uses: actions/upload-artifact@v4 with: name: jan-mac-universal-${{ inputs.new_version }} - path: ./electron/dist/*.dmg + path: ./electron/dist/*.dmg \ No newline at end of file diff --git a/.github/workflows/template-build-windows-x64.yml b/.github/workflows/template-build-windows-x64.yml index 9e3171e03..9be028e15 100644 --- a/.github/workflows/template-build-windows-x64.yml +++ b/.github/workflows/template-build-windows-x64.yml @@ -23,6 +23,14 @@ on: required: false type: boolean default: false + nightly: + required: false + type: boolean + default: false + cortex_api_port: + required: false + type: string + default: null secrets: DELTA_AWS_S3_BUCKET_NAME: required: false @@ -52,6 +60,30 @@ jobs: with: ref: ${{ inputs.ref }} + - name: Replace Icons for Beta Build + if: inputs.beta == true && inputs.nightly != true + shell: bash + run: | + rm -rf electron/icons/* + + cp electron/icons_dev/jan-beta-512x512.png electron/icons/512x512.png + cp electron/icons_dev/jan-beta.ico electron/icons/icon.ico + cp electron/icons_dev/jan-beta.png electron/icons/icon.png + cp electron/icons_dev/jan-beta-tray@2x.png electron/icons/icon-tray@2x.png + cp electron/icons_dev/jan-beta-tray.png electron/icons/icon-tray.png + + - name: Replace Icons for Nightly Build + if: inputs.nightly == true && inputs.beta != true + shell: bash + run: | + rm -rf electron/icons/* + + cp electron/icons_dev/jan-nightly-512x512.png electron/icons/512x512.png + cp electron/icons_dev/jan-nightly.ico electron/icons/icon.ico + cp electron/icons_dev/jan-nightly.png electron/icons/icon.png + cp electron/icons_dev/jan-nightly-tray@2x.png electron/icons/icon-tray@2x.png + cp electron/icons_dev/jan-nightly-tray.png electron/icons/icon-tray.png + - name: Installing node uses: actions/setup-node@v1 with: @@ -153,6 +185,7 @@ jobs: AWS_MAX_ATTEMPTS: '5' POSTHOG_KEY: ${{ secrets.POSTHOG_KEY }} POSTHOG_HOST: ${{ secrets.POSTHOG_HOST }} + CORTEX_API_PORT: ${{ inputs.cortex_api_port }} - name: Build app and publish app to github if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') && inputs.public_provider == 'github' && inputs.beta == false @@ -193,4 +226,4 @@ jobs: uses: actions/upload-artifact@v4 with: name: jan-win-x64-${{ inputs.new_version }} - path: ./electron/dist/*.exe + path: ./electron/dist/*.exe \ No newline at end of file diff --git a/.github/workflows/template-get-update-version.yml b/.github/workflows/template-get-update-version.yml index 24cfe4a03..a1604401e 100644 --- a/.github/workflows/template-get-update-version.yml +++ b/.github/workflows/template-get-update-version.yml @@ -30,7 +30,7 @@ jobs: local max_retries=3 local tag while [ $retries -lt $max_retries ]; do - tag=$(curl -s https://api.github.com/repos/janhq/jan/releases/latest | jq -r .tag_name) + tag=$(curl -s https://api.github.com/repos/menloresearch/jan/releases/latest | jq -r .tag_name) if [ -n "$tag" ] && [ "$tag" != "null" ]; then echo $tag return diff --git a/.husky/pre-commit b/.husky/pre-commit index 53c4e577e..94c03b512 100644 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1 +1 @@ -npx oxlint@latest --fix \ No newline at end of file +yarn lint --fix --quiet \ No newline at end of file diff --git a/core/rolldown.config.mjs b/core/rolldown.config.mjs index d95f8de8e..ea488df33 100644 --- a/core/rolldown.config.mjs +++ b/core/rolldown.config.mjs @@ -25,7 +25,6 @@ export default defineConfig([ '@types/pacote', '@npmcli/arborist', 'ulidx', - 'node-fetch', 'fs', 'request', 'crypto', diff --git a/core/src/browser/core.test.ts b/core/src/browser/core.test.ts index 720ea9dcf..117298eb6 100644 --- a/core/src/browser/core.test.ts +++ b/core/src/browser/core.test.ts @@ -2,7 +2,6 @@ import { openExternalUrl } from './core' import { joinPath } from './core' import { openFileExplorer } from './core' import { getJanDataFolderPath } from './core' -import { abortDownload } from './core' import { executeOnMain } from './core' describe('test core apis', () => { @@ -53,18 +52,6 @@ describe('test core apis', () => { expect(result).toBe('/path/to/jan/data') }) - it('should abort download', async () => { - const fileName = 'testFile' - globalThis.core = { - api: { - abortDownload: jest.fn().mockResolvedValue('aborted'), - }, - } - const result = await abortDownload(fileName) - expect(globalThis.core.api.abortDownload).toHaveBeenCalledWith(fileName) - expect(result).toBe('aborted') - }) - it('should execute function on main process', async () => { const extension = 'testExtension' const method = 'testMethod' diff --git a/core/src/browser/core.ts b/core/src/browser/core.ts index a0abbb43e..43b5f9d48 100644 --- a/core/src/browser/core.ts +++ b/core/src/browser/core.ts @@ -1,9 +1,4 @@ -import { - DownloadRequest, - FileStat, - NetworkConfig, - SystemInformation, -} from '../types' +import { SystemInformation } from '../types' /** * Execute a extension module function in main process @@ -14,42 +9,19 @@ import { * @returns Promise * */ -const executeOnMain: ( - extension: string, - method: string, - ...args: any[] -) => Promise = (extension, method, ...args) => - globalThis.core?.api?.invokeExtensionFunc(extension, method, ...args) +const executeOnMain: (extension: string, method: string, ...args: any[]) => Promise = ( + extension, + method, + ...args +) => globalThis.core?.api?.invokeExtensionFunc(extension, method, ...args) -/** - * Downloads a file from a URL and saves it to the local file system. - * - * @param {DownloadRequest} downloadRequest - The request to download the file. - * @param {NetworkConfig} network - Optional object to specify proxy/whether to ignore SSL certificates. - * - * @returns {Promise} A promise that resolves when the file is downloaded. - */ -const downloadFile: ( - downloadRequest: DownloadRequest, - network?: NetworkConfig -) => Promise = (downloadRequest, network) => - globalThis.core?.api?.downloadFile(downloadRequest, network) - -/** - * Aborts the download of a specific file. - * @param {string} fileName - The name of the file whose download is to be aborted. - * @returns {Promise} A promise that resolves when the download has been aborted. - */ -const abortDownload: (fileName: string) => Promise = (fileName) => - globalThis.core.api?.abortDownload(fileName) /** * Gets Jan's data folder path. * * @returns {Promise} A Promise that resolves with Jan's data folder path. */ -const getJanDataFolderPath = (): Promise => - globalThis.core.api?.getJanDataFolderPath() +const getJanDataFolderPath = (): Promise => globalThis.core.api?.getJanDataFolderPath() /** * Opens the file explorer at a specific path. @@ -72,16 +44,14 @@ const joinPath: (paths: string[]) => Promise = (paths) => * @param path - The file path to retrieve dirname. * @returns {Promise} A promise that resolves the dirname. */ -const dirName: (path: string) => Promise = (path) => - globalThis.core.api?.dirName(path) +const dirName: (path: string) => Promise = (path) => globalThis.core.api?.dirName(path) /** * Retrieve the basename from an url. * @param path - The path to retrieve. * @returns {Promise} A promise that resolves with the basename. */ -const baseName: (paths: string) => Promise = (path) => - globalThis.core.api?.baseName(path) +const baseName: (paths: string) => Promise = (path) => globalThis.core.api?.baseName(path) /** * Opens an external URL in the default web browser. @@ -97,15 +67,13 @@ const openExternalUrl: (url: string) => Promise = (url) => * * @returns {Promise} - A promise that resolves with the resource path. */ -const getResourcePath: () => Promise = () => - globalThis.core.api?.getResourcePath() +const getResourcePath: () => Promise = () => globalThis.core.api?.getResourcePath() /** * Gets the user's home path. * @returns return user's home path */ -const getUserHomePath = (): Promise => - globalThis.core.api?.getUserHomePath() +const getUserHomePath = (): Promise => globalThis.core.api?.getUserHomePath() /** * Log to file from browser processes. @@ -123,10 +91,8 @@ const log: (message: string, fileName?: string) => void = (message, fileName) => * * @returns {Promise} - A promise that resolves with a boolean indicating whether the path is a subdirectory. */ -const isSubdirectory: (from: string, to: string) => Promise = ( - from: string, - to: string -) => globalThis.core.api?.isSubdirectory(from, to) +const isSubdirectory: (from: string, to: string) => Promise = (from: string, to: string) => + globalThis.core.api?.isSubdirectory(from, to) /** * Get system information @@ -159,8 +125,6 @@ export type RegisterExtensionPoint = ( */ export { executeOnMain, - downloadFile, - abortDownload, getJanDataFolderPath, openFileExplorer, getResourcePath, diff --git a/core/src/browser/extension.test.ts b/core/src/browser/extension.test.ts index 2db14a24e..879258876 100644 --- a/core/src/browser/extension.test.ts +++ b/core/src/browser/extension.test.ts @@ -39,11 +39,6 @@ describe('BaseExtension', () => { expect(baseExtension.onUnload).toBeDefined() }) - it('should have installationState() return "NotRequired"', async () => { - const installationState = await baseExtension.installationState() - expect(installationState).toBe('NotRequired') - }) - it('should install the extension', async () => { await baseExtension.install() // Add your assertions here @@ -84,11 +79,6 @@ describe('BaseExtension', () => { expect(baseExtension.onUnload).toBeDefined() }) - it('should have installationState() return "NotRequired"', async () => { - const installationState = await baseExtension.installationState() - expect(installationState).toBe('NotRequired') - }) - it('should install the extension', async () => { await baseExtension.install() // Add your assertions here diff --git a/core/src/browser/extension.ts b/core/src/browser/extension.ts index d768473c9..a050b9d59 100644 --- a/core/src/browser/extension.ts +++ b/core/src/browser/extension.ts @@ -24,17 +24,6 @@ export interface Compatibility { version: string } -const ALL_INSTALLATION_STATE = [ - 'NotRequired', // not required. - 'Installed', // require and installed. Good to go. - 'NotInstalled', // require to be installed. - 'Corrupted', // require but corrupted. Need to redownload. - 'NotCompatible', // require but not compatible. -] as const - -export type InstallationStateTuple = typeof ALL_INSTALLATION_STATE -export type InstallationState = InstallationStateTuple[number] - /** * Represents a base extension. * This class should be extended by any class that represents an extension. @@ -175,15 +164,6 @@ export abstract class BaseExtension implements ExtensionType { return } - /** - * Determine if the prerequisites for the extension are installed. - * - * @returns {boolean} true if the prerequisites are installed, false otherwise. - */ - async installationState(): Promise { - return 'NotRequired' - } - /** * Install the prerequisites for the extension. * @@ -228,7 +208,7 @@ export abstract class BaseExtension implements ExtensionType { const settings = await this.getSettings() - const updatedSettings = settings.map((setting) => { + let updatedSettings = settings.map((setting) => { const updatedSetting = componentProps.find( (componentProp) => componentProp.key === setting.key ) @@ -238,13 +218,20 @@ export abstract class BaseExtension implements ExtensionType { return setting }) - const settingPath = await joinPath([ + if (!updatedSettings.length) updatedSettings = componentProps as SettingComponentProps[] + + const settingFolder = await joinPath([ await getJanDataFolderPath(), this.settingFolderName, this.name, - this.settingFileName, ]) + if (!(await fs.existsSync(settingFolder))) { + await fs.mkdir(settingFolder) + } + + const settingPath = await joinPath([settingFolder, this.settingFileName]) + await fs.writeFileSync(settingPath, JSON.stringify(updatedSettings, null, 2)) updatedSettings.forEach((setting) => { diff --git a/core/src/browser/extensions/conversational.test.ts b/core/src/browser/extensions/conversational.test.ts new file mode 100644 index 000000000..8046383c9 --- /dev/null +++ b/core/src/browser/extensions/conversational.test.ts @@ -0,0 +1,252 @@ +import { ConversationalExtension } from './conversational' +import { ExtensionTypeEnum } from '../extension' +import { Thread, ThreadAssistantInfo, ThreadMessage } from '../../types' + +// Mock implementation of ConversationalExtension +class MockConversationalExtension extends ConversationalExtension { + private threads: Thread[] = [] + private messages: { [threadId: string]: ThreadMessage[] } = {} + private assistants: { [threadId: string]: ThreadAssistantInfo } = {} + + constructor() { + super('http://mock-url.com', 'mock-extension', 'Mock Extension', true, 'A mock extension', '1.0.0') + } + + onLoad(): void { + // Mock implementation + } + + onUnload(): void { + // Mock implementation + } + + async listThreads(): Promise { + return this.threads + } + + async createThread(thread: Partial): Promise { + const newThread: Thread = { + id: thread.id || `thread-${Date.now()}`, + name: thread.name || 'New Thread', + createdAt: thread.createdAt || new Date().toISOString(), + updatedAt: thread.updatedAt || new Date().toISOString(), + } + this.threads.push(newThread) + this.messages[newThread.id] = [] + return newThread + } + + async modifyThread(thread: Thread): Promise { + const index = this.threads.findIndex(t => t.id === thread.id) + if (index !== -1) { + this.threads[index] = thread + } + } + + async deleteThread(threadId: string): Promise { + this.threads = this.threads.filter(t => t.id !== threadId) + delete this.messages[threadId] + delete this.assistants[threadId] + } + + async createMessage(message: Partial): Promise { + if (!message.threadId) throw new Error('Thread ID is required') + + const newMessage: ThreadMessage = { + id: message.id || `message-${Date.now()}`, + threadId: message.threadId, + content: message.content || '', + role: message.role || 'user', + createdAt: message.createdAt || new Date().toISOString(), + } + + if (!this.messages[message.threadId]) { + this.messages[message.threadId] = [] + } + + this.messages[message.threadId].push(newMessage) + return newMessage + } + + async deleteMessage(threadId: string, messageId: string): Promise { + if (this.messages[threadId]) { + this.messages[threadId] = this.messages[threadId].filter(m => m.id !== messageId) + } + } + + async listMessages(threadId: string): Promise { + return this.messages[threadId] || [] + } + + async getThreadAssistant(threadId: string): Promise { + return this.assistants[threadId] || { modelId: '', threadId } + } + + async createThreadAssistant( + threadId: string, + assistant: ThreadAssistantInfo + ): Promise { + this.assistants[threadId] = assistant + return assistant + } + + async modifyThreadAssistant( + threadId: string, + assistant: ThreadAssistantInfo + ): Promise { + this.assistants[threadId] = assistant + return assistant + } + + async modifyMessage(message: ThreadMessage): Promise { + if (!this.messages[message.threadId]) return message + + const index = this.messages[message.threadId].findIndex(m => m.id === message.id) + if (index !== -1) { + this.messages[message.threadId][index] = message + } + + return message + } +} + +describe('ConversationalExtension', () => { + let extension: MockConversationalExtension + + beforeEach(() => { + extension = new MockConversationalExtension() + }) + + test('should return the correct extension type', () => { + expect(extension.type()).toBe(ExtensionTypeEnum.Conversational) + }) + + test('should create and list threads', async () => { + const thread = await extension.createThread({ name: 'Test Thread' }) + expect(thread.name).toBe('Test Thread') + + const threads = await extension.listThreads() + expect(threads).toHaveLength(1) + expect(threads[0].id).toBe(thread.id) + }) + + test('should modify thread', async () => { + const thread = await extension.createThread({ name: 'Test Thread' }) + const modifiedThread = { ...thread, name: 'Modified Thread' } + + await extension.modifyThread(modifiedThread) + + const threads = await extension.listThreads() + expect(threads[0].name).toBe('Modified Thread') + }) + + test('should delete thread', async () => { + const thread = await extension.createThread({ name: 'Test Thread' }) + + await extension.deleteThread(thread.id) + + const threads = await extension.listThreads() + expect(threads).toHaveLength(0) + }) + + test('should create and list messages', async () => { + const thread = await extension.createThread({ name: 'Test Thread' }) + + const message = await extension.createMessage({ + threadId: thread.id, + content: 'Test message', + role: 'user' + }) + + expect(message.content).toBe('Test message') + + const messages = await extension.listMessages(thread.id) + expect(messages).toHaveLength(1) + expect(messages[0].id).toBe(message.id) + }) + + test('should modify message', async () => { + const thread = await extension.createThread({ name: 'Test Thread' }) + + const message = await extension.createMessage({ + threadId: thread.id, + content: 'Test message', + role: 'user' + }) + + const modifiedMessage = { ...message, content: 'Modified message' } + + await extension.modifyMessage(modifiedMessage) + + const messages = await extension.listMessages(thread.id) + expect(messages[0].content).toBe('Modified message') + }) + + test('should delete message', async () => { + const thread = await extension.createThread({ name: 'Test Thread' }) + + const message = await extension.createMessage({ + threadId: thread.id, + content: 'Test message', + role: 'user' + }) + + await extension.deleteMessage(thread.id, message.id) + + const messages = await extension.listMessages(thread.id) + expect(messages).toHaveLength(0) + }) + + test('should create and get thread assistant', async () => { + const thread = await extension.createThread({ name: 'Test Thread' }) + + const assistant: ThreadAssistantInfo = { + threadId: thread.id, + modelId: 'test-model' + } + + await extension.createThreadAssistant(thread.id, assistant) + + const retrievedAssistant = await extension.getThreadAssistant(thread.id) + expect(retrievedAssistant.modelId).toBe('test-model') + }) + + test('should modify thread assistant', async () => { + const thread = await extension.createThread({ name: 'Test Thread' }) + + const assistant: ThreadAssistantInfo = { + threadId: thread.id, + modelId: 'test-model' + } + + await extension.createThreadAssistant(thread.id, assistant) + + const modifiedAssistant: ThreadAssistantInfo = { + threadId: thread.id, + modelId: 'modified-model' + } + + await extension.modifyThreadAssistant(thread.id, modifiedAssistant) + + const retrievedAssistant = await extension.getThreadAssistant(thread.id) + expect(retrievedAssistant.modelId).toBe('modified-model') + }) + + test('should delete thread assistant when thread is deleted', async () => { + const thread = await extension.createThread({ name: 'Test Thread' }) + + const assistant: ThreadAssistantInfo = { + threadId: thread.id, + modelId: 'test-model' + } + + await extension.createThreadAssistant(thread.id, assistant) + await extension.deleteThread(thread.id) + + // Creating a new thread with the same ID to test if assistant was deleted + const newThread = await extension.createThread({ id: thread.id, name: 'New Thread' }) + const retrievedAssistant = await extension.getThreadAssistant(newThread.id) + + expect(retrievedAssistant.modelId).toBe('') + }) +}) \ No newline at end of file diff --git a/core/src/browser/extensions/engines/EngineManager.test.ts b/core/src/browser/extensions/engines/EngineManager.test.ts index c1f1fcb71..319dc792a 100644 --- a/core/src/browser/extensions/engines/EngineManager.test.ts +++ b/core/src/browser/extensions/engines/EngineManager.test.ts @@ -3,6 +3,7 @@ */ import { EngineManager } from './EngineManager' import { AIEngine } from './AIEngine' +import { InferenceEngine } from '../../../types' // @ts-ignore class MockAIEngine implements AIEngine { @@ -40,4 +41,69 @@ describe('EngineManager', () => { const retrievedEngine = engineManager.get('nonExistentProvider') expect(retrievedEngine).toBeUndefined() }) + + describe('cortex engine migration', () => { + test('should map nitro to cortex engine', () => { + const cortexEngine = new MockAIEngine(InferenceEngine.cortex) + // @ts-ignore + engineManager.register(cortexEngine) + + // @ts-ignore + const retrievedEngine = engineManager.get(InferenceEngine.nitro) + expect(retrievedEngine).toBe(cortexEngine) + }) + + test('should map cortex_llamacpp to cortex engine', () => { + const cortexEngine = new MockAIEngine(InferenceEngine.cortex) + // @ts-ignore + engineManager.register(cortexEngine) + + // @ts-ignore + const retrievedEngine = engineManager.get(InferenceEngine.cortex_llamacpp) + expect(retrievedEngine).toBe(cortexEngine) + }) + + test('should map cortex_onnx to cortex engine', () => { + const cortexEngine = new MockAIEngine(InferenceEngine.cortex) + // @ts-ignore + engineManager.register(cortexEngine) + + // @ts-ignore + const retrievedEngine = engineManager.get(InferenceEngine.cortex_onnx) + expect(retrievedEngine).toBe(cortexEngine) + }) + + test('should map cortex_tensorrtllm to cortex engine', () => { + const cortexEngine = new MockAIEngine(InferenceEngine.cortex) + // @ts-ignore + engineManager.register(cortexEngine) + + // @ts-ignore + const retrievedEngine = engineManager.get(InferenceEngine.cortex_tensorrtllm) + expect(retrievedEngine).toBe(cortexEngine) + }) + }) + + describe('singleton instance', () => { + test('should return the window.core.engineManager if available', () => { + const mockEngineManager = new EngineManager() + // @ts-ignore + window.core = { engineManager: mockEngineManager } + + const instance = EngineManager.instance() + expect(instance).toBe(mockEngineManager) + + // Clean up + // @ts-ignore + delete window.core + }) + + test('should create a new instance if window.core.engineManager is not available', () => { + // @ts-ignore + delete window.core + + const instance = EngineManager.instance() + expect(instance).toBeInstanceOf(EngineManager) + }) + }) }) diff --git a/core/src/browser/extensions/enginesManagement.test.ts b/core/src/browser/extensions/enginesManagement.test.ts new file mode 100644 index 000000000..2a7880992 --- /dev/null +++ b/core/src/browser/extensions/enginesManagement.test.ts @@ -0,0 +1,566 @@ +import { EngineManagementExtension } from './enginesManagement' +import { ExtensionTypeEnum } from '../extension' +import { + EngineConfig, + EngineReleased, + EngineVariant, + Engines, + InferenceEngine, + DefaultEngineVariant, + Model +} from '../../types' + +// Mock implementation of EngineManagementExtension +class MockEngineManagementExtension extends EngineManagementExtension { + private mockEngines: Engines = { + llama: { + name: 'llama', + variants: [ + { + variant: 'cpu', + version: '1.0.0', + path: '/engines/llama/cpu/1.0.0', + installed: true + }, + { + variant: 'cuda', + version: '1.0.0', + path: '/engines/llama/cuda/1.0.0', + installed: false + } + ], + default: { + variant: 'cpu', + version: '1.0.0' + } + }, + gpt4all: { + name: 'gpt4all', + variants: [ + { + variant: 'cpu', + version: '2.0.0', + path: '/engines/gpt4all/cpu/2.0.0', + installed: true + } + ], + default: { + variant: 'cpu', + version: '2.0.0' + } + } + } + + private mockReleases: { [key: string]: EngineReleased[] } = { + 'llama-1.0.0': [ + { + variant: 'cpu', + version: '1.0.0', + os: ['macos', 'linux', 'windows'], + url: 'https://example.com/llama/1.0.0/cpu' + }, + { + variant: 'cuda', + version: '1.0.0', + os: ['linux', 'windows'], + url: 'https://example.com/llama/1.0.0/cuda' + } + ], + 'llama-1.1.0': [ + { + variant: 'cpu', + version: '1.1.0', + os: ['macos', 'linux', 'windows'], + url: 'https://example.com/llama/1.1.0/cpu' + }, + { + variant: 'cuda', + version: '1.1.0', + os: ['linux', 'windows'], + url: 'https://example.com/llama/1.1.0/cuda' + } + ], + 'gpt4all-2.0.0': [ + { + variant: 'cpu', + version: '2.0.0', + os: ['macos', 'linux', 'windows'], + url: 'https://example.com/gpt4all/2.0.0/cpu' + } + ] + } + + private remoteModels: { [engine: string]: Model[] } = { + 'llama': [], + 'gpt4all': [] + } + + constructor() { + super('http://mock-url.com', 'mock-engine-extension', 'Mock Engine Extension', true, 'A mock engine extension', '1.0.0') + } + + onLoad(): void { + // Mock implementation + } + + onUnload(): void { + // Mock implementation + } + + async getEngines(): Promise { + return JSON.parse(JSON.stringify(this.mockEngines)) + } + + async getInstalledEngines(name: InferenceEngine): Promise { + if (!this.mockEngines[name]) { + return [] + } + + return this.mockEngines[name].variants.filter(variant => variant.installed) + } + + async getReleasedEnginesByVersion( + name: InferenceEngine, + version: string, + platform?: string + ): Promise { + const key = `${name}-${version}` + let releases = this.mockReleases[key] || [] + + if (platform) { + releases = releases.filter(release => release.os.includes(platform)) + } + + return releases + } + + async getLatestReleasedEngine( + name: InferenceEngine, + platform?: string + ): Promise { + // For mock, let's assume latest versions are 1.1.0 for llama and 2.0.0 for gpt4all + const latestVersions = { + 'llama': '1.1.0', + 'gpt4all': '2.0.0' + } + + if (!latestVersions[name]) { + return [] + } + + return this.getReleasedEnginesByVersion(name, latestVersions[name], platform) + } + + async installEngine( + name: string, + engineConfig: EngineConfig + ): Promise<{ messages: string }> { + if (!this.mockEngines[name]) { + this.mockEngines[name] = { + name, + variants: [], + default: { + variant: engineConfig.variant, + version: engineConfig.version + } + } + } + + // Check if variant already exists + const existingVariantIndex = this.mockEngines[name].variants.findIndex( + v => v.variant === engineConfig.variant && v.version === engineConfig.version + ) + + if (existingVariantIndex >= 0) { + this.mockEngines[name].variants[existingVariantIndex].installed = true + } else { + this.mockEngines[name].variants.push({ + variant: engineConfig.variant, + version: engineConfig.version, + path: `/engines/${name}/${engineConfig.variant}/${engineConfig.version}`, + installed: true + }) + } + + return { messages: `Successfully installed ${name} ${engineConfig.variant} ${engineConfig.version}` } + } + + async addRemoteEngine( + engineConfig: EngineConfig + ): Promise<{ messages: string }> { + const name = engineConfig.name || 'remote-engine' + + if (!this.mockEngines[name]) { + this.mockEngines[name] = { + name, + variants: [], + default: { + variant: engineConfig.variant, + version: engineConfig.version + } + } + } + + this.mockEngines[name].variants.push({ + variant: engineConfig.variant, + version: engineConfig.version, + path: engineConfig.path || `/engines/${name}/${engineConfig.variant}/${engineConfig.version}`, + installed: true, + url: engineConfig.url + }) + + return { messages: `Successfully added remote engine ${name}` } + } + + async uninstallEngine( + name: InferenceEngine, + engineConfig: EngineConfig + ): Promise<{ messages: string }> { + if (!this.mockEngines[name]) { + return { messages: `Engine ${name} not found` } + } + + const variantIndex = this.mockEngines[name].variants.findIndex( + v => v.variant === engineConfig.variant && v.version === engineConfig.version + ) + + if (variantIndex >= 0) { + this.mockEngines[name].variants[variantIndex].installed = false + + // If this was the default variant, reset default + if ( + this.mockEngines[name].default.variant === engineConfig.variant && + this.mockEngines[name].default.version === engineConfig.version + ) { + // Find another installed variant to set as default + const installedVariant = this.mockEngines[name].variants.find(v => v.installed) + if (installedVariant) { + this.mockEngines[name].default = { + variant: installedVariant.variant, + version: installedVariant.version + } + } else { + // No installed variants remain, clear default + this.mockEngines[name].default = { variant: '', version: '' } + } + } + + return { messages: `Successfully uninstalled ${name} ${engineConfig.variant} ${engineConfig.version}` } + } else { + return { messages: `Variant ${engineConfig.variant} ${engineConfig.version} not found for engine ${name}` } + } + } + + async getDefaultEngineVariant( + name: InferenceEngine + ): Promise { + if (!this.mockEngines[name]) { + return { variant: '', version: '' } + } + + return this.mockEngines[name].default + } + + async setDefaultEngineVariant( + name: InferenceEngine, + engineConfig: EngineConfig + ): Promise<{ messages: string }> { + if (!this.mockEngines[name]) { + return { messages: `Engine ${name} not found` } + } + + const variantExists = this.mockEngines[name].variants.some( + v => v.variant === engineConfig.variant && v.version === engineConfig.version && v.installed + ) + + if (!variantExists) { + return { messages: `Variant ${engineConfig.variant} ${engineConfig.version} not found or not installed` } + } + + this.mockEngines[name].default = { + variant: engineConfig.variant, + version: engineConfig.version + } + + return { messages: `Successfully set ${engineConfig.variant} ${engineConfig.version} as default for ${name}` } + } + + async updateEngine( + name: InferenceEngine, + engineConfig?: EngineConfig + ): Promise<{ messages: string }> { + if (!this.mockEngines[name]) { + return { messages: `Engine ${name} not found` } + } + + if (!engineConfig) { + // Assume we're updating to the latest version + return { messages: `Successfully updated ${name} to the latest version` } + } + + const variantIndex = this.mockEngines[name].variants.findIndex( + v => v.variant === engineConfig.variant && v.installed + ) + + if (variantIndex >= 0) { + // Update the version + this.mockEngines[name].variants[variantIndex].version = engineConfig.version + + // If this was the default variant, update default version too + if (this.mockEngines[name].default.variant === engineConfig.variant) { + this.mockEngines[name].default.version = engineConfig.version + } + + return { messages: `Successfully updated ${name} ${engineConfig.variant} to version ${engineConfig.version}` } + } else { + return { messages: `Installed variant ${engineConfig.variant} not found for engine ${name}` } + } + } + + async addRemoteModel(model: Model): Promise { + const engine = model.engine as string + + if (!this.remoteModels[engine]) { + this.remoteModels[engine] = [] + } + + this.remoteModels[engine].push(model) + } + + async getRemoteModels(name: InferenceEngine | string): Promise { + return this.remoteModels[name] || [] + } +} + +describe('EngineManagementExtension', () => { + let extension: MockEngineManagementExtension + + beforeEach(() => { + extension = new MockEngineManagementExtension() + }) + + test('should return the correct extension type', () => { + expect(extension.type()).toBe(ExtensionTypeEnum.Engine) + }) + + test('should get all engines', async () => { + const engines = await extension.getEngines() + + expect(engines).toBeDefined() + expect(engines.llama).toBeDefined() + expect(engines.gpt4all).toBeDefined() + expect(engines.llama.variants).toHaveLength(2) + expect(engines.gpt4all.variants).toHaveLength(1) + }) + + test('should get installed engines', async () => { + const llamaEngines = await extension.getInstalledEngines('llama') + + expect(llamaEngines).toHaveLength(1) + expect(llamaEngines[0].variant).toBe('cpu') + expect(llamaEngines[0].installed).toBe(true) + + const gpt4allEngines = await extension.getInstalledEngines('gpt4all') + + expect(gpt4allEngines).toHaveLength(1) + expect(gpt4allEngines[0].variant).toBe('cpu') + expect(gpt4allEngines[0].installed).toBe(true) + + // Test non-existent engine + const nonExistentEngines = await extension.getInstalledEngines('non-existent' as InferenceEngine) + expect(nonExistentEngines).toHaveLength(0) + }) + + test('should get released engines by version', async () => { + const llamaReleases = await extension.getReleasedEnginesByVersion('llama', '1.0.0') + + expect(llamaReleases).toHaveLength(2) + expect(llamaReleases[0].variant).toBe('cpu') + expect(llamaReleases[1].variant).toBe('cuda') + + // Test with platform filter + const llamaLinuxReleases = await extension.getReleasedEnginesByVersion('llama', '1.0.0', 'linux') + + expect(llamaLinuxReleases).toHaveLength(2) + + const llamaMacReleases = await extension.getReleasedEnginesByVersion('llama', '1.0.0', 'macos') + + expect(llamaMacReleases).toHaveLength(1) + expect(llamaMacReleases[0].variant).toBe('cpu') + + // Test non-existent version + const nonExistentReleases = await extension.getReleasedEnginesByVersion('llama', '9.9.9') + expect(nonExistentReleases).toHaveLength(0) + }) + + test('should get latest released engines', async () => { + const latestLlamaReleases = await extension.getLatestReleasedEngine('llama') + + expect(latestLlamaReleases).toHaveLength(2) + expect(latestLlamaReleases[0].version).toBe('1.1.0') + + // Test with platform filter + const latestLlamaMacReleases = await extension.getLatestReleasedEngine('llama', 'macos') + + expect(latestLlamaMacReleases).toHaveLength(1) + expect(latestLlamaMacReleases[0].variant).toBe('cpu') + expect(latestLlamaMacReleases[0].version).toBe('1.1.0') + + // Test non-existent engine + const nonExistentReleases = await extension.getLatestReleasedEngine('non-existent' as InferenceEngine) + expect(nonExistentReleases).toHaveLength(0) + }) + + test('should install engine', async () => { + // Install existing engine variant that is not installed + const result = await extension.installEngine('llama', { variant: 'cuda', version: '1.0.0' }) + + expect(result.messages).toContain('Successfully installed') + + const installedEngines = await extension.getInstalledEngines('llama') + expect(installedEngines).toHaveLength(2) + expect(installedEngines.some(e => e.variant === 'cuda')).toBe(true) + + // Install non-existent engine + const newEngineResult = await extension.installEngine('new-engine', { variant: 'cpu', version: '1.0.0' }) + + expect(newEngineResult.messages).toContain('Successfully installed') + + const engines = await extension.getEngines() + expect(engines['new-engine']).toBeDefined() + expect(engines['new-engine'].variants).toHaveLength(1) + expect(engines['new-engine'].variants[0].installed).toBe(true) + }) + + test('should add remote engine', async () => { + const result = await extension.addRemoteEngine({ + name: 'remote-llm', + variant: 'remote', + version: '1.0.0', + url: 'https://example.com/remote-llm-api' + }) + + expect(result.messages).toContain('Successfully added remote engine') + + const engines = await extension.getEngines() + expect(engines['remote-llm']).toBeDefined() + expect(engines['remote-llm'].variants).toHaveLength(1) + expect(engines['remote-llm'].variants[0].url).toBe('https://example.com/remote-llm-api') + }) + + test('should uninstall engine', async () => { + const result = await extension.uninstallEngine('llama', { variant: 'cpu', version: '1.0.0' }) + + expect(result.messages).toContain('Successfully uninstalled') + + const installedEngines = await extension.getInstalledEngines('llama') + expect(installedEngines).toHaveLength(0) + + // Test uninstalling non-existent variant + const nonExistentResult = await extension.uninstallEngine('llama', { variant: 'non-existent', version: '1.0.0' }) + + expect(nonExistentResult.messages).toContain('not found') + }) + + test('should handle default variant when uninstalling', async () => { + // First install cuda variant + await extension.installEngine('llama', { variant: 'cuda', version: '1.0.0' }) + + // Set cuda as default + await extension.setDefaultEngineVariant('llama', { variant: 'cuda', version: '1.0.0' }) + + // Check that cuda is now default + let defaultVariant = await extension.getDefaultEngineVariant('llama') + expect(defaultVariant.variant).toBe('cuda') + + // Uninstall cuda + await extension.uninstallEngine('llama', { variant: 'cuda', version: '1.0.0' }) + + // Check that default has changed to another installed variant + defaultVariant = await extension.getDefaultEngineVariant('llama') + expect(defaultVariant.variant).toBe('cpu') + + // Uninstall all variants + await extension.uninstallEngine('llama', { variant: 'cpu', version: '1.0.0' }) + + // Check that default is now empty + defaultVariant = await extension.getDefaultEngineVariant('llama') + expect(defaultVariant.variant).toBe('') + expect(defaultVariant.version).toBe('') + }) + + test('should get default engine variant', async () => { + const llamaDefault = await extension.getDefaultEngineVariant('llama') + + expect(llamaDefault.variant).toBe('cpu') + expect(llamaDefault.version).toBe('1.0.0') + + // Test non-existent engine + const nonExistentDefault = await extension.getDefaultEngineVariant('non-existent' as InferenceEngine) + expect(nonExistentDefault.variant).toBe('') + expect(nonExistentDefault.version).toBe('') + }) + + test('should set default engine variant', async () => { + // Install cuda variant + await extension.installEngine('llama', { variant: 'cuda', version: '1.0.0' }) + + const result = await extension.setDefaultEngineVariant('llama', { variant: 'cuda', version: '1.0.0' }) + + expect(result.messages).toContain('Successfully set') + + const defaultVariant = await extension.getDefaultEngineVariant('llama') + expect(defaultVariant.variant).toBe('cuda') + expect(defaultVariant.version).toBe('1.0.0') + + // Test setting non-existent variant as default + const nonExistentResult = await extension.setDefaultEngineVariant('llama', { variant: 'non-existent', version: '1.0.0' }) + + expect(nonExistentResult.messages).toContain('not found') + }) + + test('should update engine', async () => { + const result = await extension.updateEngine('llama', { variant: 'cpu', version: '1.1.0' }) + + expect(result.messages).toContain('Successfully updated') + + const engines = await extension.getEngines() + const cpuVariant = engines.llama.variants.find(v => v.variant === 'cpu') + expect(cpuVariant).toBeDefined() + expect(cpuVariant?.version).toBe('1.1.0') + + // Default should also be updated since cpu was default + expect(engines.llama.default.version).toBe('1.1.0') + + // Test updating non-existent variant + const nonExistentResult = await extension.updateEngine('llama', { variant: 'non-existent', version: '1.1.0' }) + + expect(nonExistentResult.messages).toContain('not found') + }) + + test('should add and get remote models', async () => { + const model: Model = { + id: 'remote-model-1', + name: 'Remote Model 1', + path: '/path/to/remote-model', + engine: 'llama', + format: 'gguf', + modelFormat: 'gguf', + source: 'remote', + status: 'ready', + contextLength: 4096, + sizeInGB: 4, + created: new Date().toISOString() + } + + await extension.addRemoteModel(model) + + const llamaModels = await extension.getRemoteModels('llama') + expect(llamaModels).toHaveLength(1) + expect(llamaModels[0].id).toBe('remote-model-1') + + // Test non-existent engine + const nonExistentModels = await extension.getRemoteModels('non-existent') + expect(nonExistentModels).toHaveLength(0) + }) +}) \ No newline at end of file diff --git a/core/src/browser/extensions/hardwareManagement.test.ts b/core/src/browser/extensions/hardwareManagement.test.ts new file mode 100644 index 000000000..6ada06862 --- /dev/null +++ b/core/src/browser/extensions/hardwareManagement.test.ts @@ -0,0 +1,146 @@ +import { HardwareManagementExtension } from './hardwareManagement' +import { ExtensionTypeEnum } from '../extension' +import { HardwareInformation } from '../../types' + +// Mock implementation of HardwareManagementExtension +class MockHardwareManagementExtension extends HardwareManagementExtension { + private activeGpus: number[] = [0] + private mockHardwareInfo: HardwareInformation = { + cpu: { + manufacturer: 'Mock CPU Manufacturer', + brand: 'Mock CPU', + cores: 8, + physicalCores: 4, + speed: 3.5, + }, + memory: { + total: 16 * 1024 * 1024 * 1024, // 16GB in bytes + free: 8 * 1024 * 1024 * 1024, // 8GB in bytes + }, + gpus: [ + { + id: 0, + vendor: 'Mock GPU Vendor', + model: 'Mock GPU Model 1', + memory: 8 * 1024 * 1024 * 1024, // 8GB in bytes + }, + { + id: 1, + vendor: 'Mock GPU Vendor', + model: 'Mock GPU Model 2', + memory: 4 * 1024 * 1024 * 1024, // 4GB in bytes + } + ], + active_gpus: [0], + } + + constructor() { + super('http://mock-url.com', 'mock-hardware-extension', 'Mock Hardware Extension', true, 'A mock hardware extension', '1.0.0') + } + + onLoad(): void { + // Mock implementation + } + + onUnload(): void { + // Mock implementation + } + + async getHardware(): Promise { + // Return a copy to prevent test side effects + return JSON.parse(JSON.stringify(this.mockHardwareInfo)) + } + + async setAvtiveGpu(data: { gpus: number[] }): Promise<{ + message: string + activated_gpus: number[] + }> { + // Validate GPUs exist + const validGpus = data.gpus.filter(gpuId => + this.mockHardwareInfo.gpus.some(gpu => gpu.id === gpuId) + ) + + if (validGpus.length === 0) { + throw new Error('No valid GPUs selected') + } + + // Update active GPUs + this.activeGpus = validGpus + this.mockHardwareInfo.active_gpus = validGpus + + return { + message: 'GPU activation successful', + activated_gpus: validGpus + } + } +} + +describe('HardwareManagementExtension', () => { + let extension: MockHardwareManagementExtension + + beforeEach(() => { + extension = new MockHardwareManagementExtension() + }) + + test('should return the correct extension type', () => { + expect(extension.type()).toBe(ExtensionTypeEnum.Hardware) + }) + + test('should get hardware information', async () => { + const hardwareInfo = await extension.getHardware() + + // Check CPU info + expect(hardwareInfo.cpu).toBeDefined() + expect(hardwareInfo.cpu.manufacturer).toBe('Mock CPU Manufacturer') + expect(hardwareInfo.cpu.cores).toBe(8) + + // Check memory info + expect(hardwareInfo.memory).toBeDefined() + expect(hardwareInfo.memory.total).toBe(16 * 1024 * 1024 * 1024) + + // Check GPU info + expect(hardwareInfo.gpus).toHaveLength(2) + expect(hardwareInfo.gpus[0].model).toBe('Mock GPU Model 1') + expect(hardwareInfo.gpus[1].model).toBe('Mock GPU Model 2') + + // Check active GPUs + expect(hardwareInfo.active_gpus).toEqual([0]) + }) + + test('should set active GPUs', async () => { + const result = await extension.setAvtiveGpu({ gpus: [1] }) + + expect(result.message).toBe('GPU activation successful') + expect(result.activated_gpus).toEqual([1]) + + // Verify the change in hardware info + const hardwareInfo = await extension.getHardware() + expect(hardwareInfo.active_gpus).toEqual([1]) + }) + + test('should set multiple active GPUs', async () => { + const result = await extension.setAvtiveGpu({ gpus: [0, 1] }) + + expect(result.message).toBe('GPU activation successful') + expect(result.activated_gpus).toEqual([0, 1]) + + // Verify the change in hardware info + const hardwareInfo = await extension.getHardware() + expect(hardwareInfo.active_gpus).toEqual([0, 1]) + }) + + test('should throw error for invalid GPU ids', async () => { + await expect(extension.setAvtiveGpu({ gpus: [999] })).rejects.toThrow('No valid GPUs selected') + }) + + test('should handle mix of valid and invalid GPU ids', async () => { + const result = await extension.setAvtiveGpu({ gpus: [0, 999] }) + + // Should only activate valid GPUs + expect(result.activated_gpus).toEqual([0]) + + // Verify the change in hardware info + const hardwareInfo = await extension.getHardware() + expect(hardwareInfo.active_gpus).toEqual([0]) + }) +}) \ No newline at end of file diff --git a/core/src/browser/extensions/model.test.ts b/core/src/browser/extensions/model.test.ts new file mode 100644 index 000000000..bc045419d --- /dev/null +++ b/core/src/browser/extensions/model.test.ts @@ -0,0 +1,286 @@ +import { ModelExtension } from './model' +import { ExtensionTypeEnum } from '../extension' +import { Model, OptionType, ModelSource } from '../../types' + +// Mock implementation of ModelExtension +class MockModelExtension extends ModelExtension { + private models: Model[] = [] + private sources: ModelSource[] = [] + private loadedModels: Set = new Set() + private modelsPulling: Set = new Set() + + constructor() { + super('http://mock-url.com', 'mock-model-extension', 'Mock Model Extension', true, 'A mock model extension', '1.0.0') + } + + onLoad(): void { + // Mock implementation + } + + onUnload(): void { + // Mock implementation + } + + async configurePullOptions(configs: { [key: string]: any }): Promise { + return configs + } + + async getModels(): Promise { + return this.models + } + + async pullModel(model: string, id?: string, name?: string): Promise { + const modelId = id || `model-${Date.now()}` + this.modelsPulling.add(modelId) + + // Simulate model pull by adding it to the model list + const newModel: Model = { + id: modelId, + path: `/models/${model}`, + name: name || model, + source: 'mock-source', + modelFormat: 'mock-format', + engine: 'mock-engine', + format: 'mock-format', + status: 'ready', + contextLength: 2048, + sizeInGB: 2, + created: new Date().toISOString(), + pullProgress: { + percent: 100, + transferred: 0, + total: 0 + } + } + + this.models.push(newModel) + this.loadedModels.add(modelId) + this.modelsPulling.delete(modelId) + } + + async cancelModelPull(modelId: string): Promise { + this.modelsPulling.delete(modelId) + // Remove the model if it's in the pulling state + this.models = this.models.filter(m => m.id !== modelId) + } + + async importModel( + model: string, + modelPath: string, + name?: string, + optionType?: OptionType + ): Promise { + const newModel: Model = { + id: `model-${Date.now()}`, + path: modelPath, + name: name || model, + source: 'local', + modelFormat: optionType?.format || 'mock-format', + engine: optionType?.engine || 'mock-engine', + format: optionType?.format || 'mock-format', + status: 'ready', + contextLength: optionType?.contextLength || 2048, + sizeInGB: 2, + created: new Date().toISOString(), + } + + this.models.push(newModel) + this.loadedModels.add(newModel.id) + } + + async updateModel(modelInfo: Partial): Promise { + if (!modelInfo.id) throw new Error('Model ID is required') + + const index = this.models.findIndex(m => m.id === modelInfo.id) + if (index === -1) throw new Error('Model not found') + + this.models[index] = { ...this.models[index], ...modelInfo } + return this.models[index] + } + + async deleteModel(modelId: string): Promise { + this.models = this.models.filter(m => m.id !== modelId) + this.loadedModels.delete(modelId) + } + + async isModelLoaded(modelId: string): Promise { + return this.loadedModels.has(modelId) + } + + async getSources(): Promise { + return this.sources + } + + async addSource(source: string): Promise { + const newSource: ModelSource = { + id: `source-${Date.now()}`, + url: source, + name: `Source ${this.sources.length + 1}`, + type: 'mock-type' + } + + this.sources.push(newSource) + } + + async deleteSource(sourceId: string): Promise { + this.sources = this.sources.filter(s => s.id !== sourceId) + } +} + +describe('ModelExtension', () => { + let extension: MockModelExtension + + beforeEach(() => { + extension = new MockModelExtension() + }) + + test('should return the correct extension type', () => { + expect(extension.type()).toBe(ExtensionTypeEnum.Model) + }) + + test('should configure pull options', async () => { + const configs = { apiKey: 'test-key', baseUrl: 'https://test-url.com' } + const result = await extension.configurePullOptions(configs) + expect(result).toEqual(configs) + }) + + test('should add and get models', async () => { + await extension.pullModel('test-model', 'test-id', 'Test Model') + + const models = await extension.getModels() + expect(models).toHaveLength(1) + expect(models[0].id).toBe('test-id') + expect(models[0].name).toBe('Test Model') + }) + + test('should pull model with default id and name', async () => { + await extension.pullModel('test-model') + + const models = await extension.getModels() + expect(models).toHaveLength(1) + expect(models[0].name).toBe('test-model') + }) + + test('should cancel model pull', async () => { + await extension.pullModel('test-model', 'test-id') + + // Verify model exists + let models = await extension.getModels() + expect(models).toHaveLength(1) + + // Cancel the pull + await extension.cancelModelPull('test-id') + + // Verify model was removed + models = await extension.getModels() + expect(models).toHaveLength(0) + }) + + test('should import model', async () => { + const optionType: OptionType = { + engine: 'test-engine', + format: 'test-format', + contextLength: 4096 + } + + await extension.importModel('test-model', '/path/to/model', 'Imported Model', optionType) + + const models = await extension.getModels() + expect(models).toHaveLength(1) + expect(models[0].name).toBe('Imported Model') + expect(models[0].engine).toBe('test-engine') + expect(models[0].format).toBe('test-format') + expect(models[0].contextLength).toBe(4096) + }) + + test('should import model with default values', async () => { + await extension.importModel('test-model', '/path/to/model') + + const models = await extension.getModels() + expect(models).toHaveLength(1) + expect(models[0].name).toBe('test-model') + expect(models[0].engine).toBe('mock-engine') + expect(models[0].format).toBe('mock-format') + }) + + test('should update model', async () => { + await extension.pullModel('test-model', 'test-id', 'Test Model') + + const updatedModel = await extension.updateModel({ + id: 'test-id', + name: 'Updated Model', + contextLength: 8192 + }) + + expect(updatedModel.name).toBe('Updated Model') + expect(updatedModel.contextLength).toBe(8192) + + // Verify changes persisted + const models = await extension.getModels() + expect(models[0].name).toBe('Updated Model') + expect(models[0].contextLength).toBe(8192) + }) + + test('should throw error when updating non-existent model', async () => { + await expect(extension.updateModel({ + id: 'non-existent', + name: 'Updated Model' + })).rejects.toThrow('Model not found') + }) + + test('should throw error when updating model without ID', async () => { + await expect(extension.updateModel({ + name: 'Updated Model' + })).rejects.toThrow('Model ID is required') + }) + + test('should delete model', async () => { + await extension.pullModel('test-model', 'test-id') + + // Verify model exists + let models = await extension.getModels() + expect(models).toHaveLength(1) + + // Delete the model + await extension.deleteModel('test-id') + + // Verify model was removed + models = await extension.getModels() + expect(models).toHaveLength(0) + }) + + test('should check if model is loaded', async () => { + await extension.pullModel('test-model', 'test-id') + + // Check if model is loaded + const isLoaded = await extension.isModelLoaded('test-id') + expect(isLoaded).toBe(true) + + // Check if non-existent model is loaded + const nonExistentLoaded = await extension.isModelLoaded('non-existent') + expect(nonExistentLoaded).toBe(false) + }) + + test('should add and get sources', async () => { + await extension.addSource('https://test-source.com') + + const sources = await extension.getSources() + expect(sources).toHaveLength(1) + expect(sources[0].url).toBe('https://test-source.com') + }) + + test('should delete source', async () => { + await extension.addSource('https://test-source.com') + + // Get the source ID + const sources = await extension.getSources() + const sourceId = sources[0].id + + // Delete the source + await extension.deleteSource(sourceId) + + // Verify source was removed + const updatedSources = await extension.getSources() + expect(updatedSources).toHaveLength(0) + }) +}) \ No newline at end of file diff --git a/core/src/browser/extensions/model.ts b/core/src/browser/extensions/model.ts index 9a3428988..da5ecd62e 100644 --- a/core/src/browser/extensions/model.ts +++ b/core/src/browser/extensions/model.ts @@ -1,10 +1,13 @@ import { BaseExtension, ExtensionTypeEnum } from '../extension' -import { Model, ModelInterface, OptionType } from '../../types' +import { Model, ModelInterface, ModelSource, OptionType } from '../../types' /** * Model extension for managing models. */ -export abstract class ModelExtension extends BaseExtension implements ModelInterface { +export abstract class ModelExtension + extends BaseExtension + implements ModelInterface +{ /** * Model extension type. */ @@ -25,4 +28,16 @@ export abstract class ModelExtension extends BaseExtension implements ModelInter abstract updateModel(modelInfo: Partial): Promise abstract deleteModel(model: string): Promise abstract isModelLoaded(model: string): Promise + /** + * Get model sources + */ + abstract getSources(): Promise + /** + * Add a model source + */ + abstract addSource(source: string): Promise + /** + * Delete a model source + */ + abstract deleteSource(source: string): Promise } diff --git a/core/src/browser/fs.ts b/core/src/browser/fs.ts index 9240b3876..7aa5f4d92 100644 --- a/core/src/browser/fs.ts +++ b/core/src/browser/fs.ts @@ -55,17 +55,23 @@ const unlinkSync = (...args: any[]) => globalThis.core.api?.unlinkSync(...args) */ const appendFileSync = (...args: any[]) => globalThis.core.api?.appendFileSync(...args) +/** + * Copies a file from the source path to the destination path. + * @param src + * @param dest + * @returns + */ const copyFile: (src: string, dest: string) => Promise = (src, dest) => globalThis.core.api?.copyFile(src, dest) /** * Gets the list of gguf files in a directory - * + * * @param path - The paths to the file. * @returns {Promise<{any}>} - A promise that resolves with the list of gguf and non-gguf files */ -const getGgufFiles: (paths: string[]) => Promise = ( - paths) => globalThis.core.api?.getGgufFiles(paths) +const getGgufFiles: (paths: string[]) => Promise = (paths) => + globalThis.core.api?.getGgufFiles(paths) /** * Gets the file's stats. diff --git a/core/src/node/api/common/adapter.ts b/core/src/node/api/common/adapter.ts index 2beacf325..b0c8173a9 100644 --- a/core/src/node/api/common/adapter.ts +++ b/core/src/node/api/common/adapter.ts @@ -1,25 +1,21 @@ import { AppRoute, - DownloadRoute, ExtensionRoute, FileManagerRoute, FileSystemRoute, } from '../../../types/api' -import { Downloader } from '../processors/download' import { FileSystem } from '../processors/fs' import { Extension } from '../processors/extension' import { FSExt } from '../processors/fsExt' import { App } from '../processors/app' export class RequestAdapter { - downloader: Downloader fileSystem: FileSystem extension: Extension fsExt: FSExt app: App constructor(observer?: Function) { - this.downloader = new Downloader(observer) this.fileSystem = new FileSystem() this.extension = new Extension() this.fsExt = new FSExt() @@ -28,9 +24,7 @@ export class RequestAdapter { // TODO: Clearer Factory pattern here process(route: string, ...args: any) { - if (route in DownloadRoute) { - return this.downloader.process(route, ...args) - } else if (route in FileSystemRoute) { + if (route in FileSystemRoute) { return this.fileSystem.process(route, ...args) } else if (route in ExtensionRoute) { return this.extension.process(route, ...args) diff --git a/core/src/node/api/processors/download.test.ts b/core/src/node/api/processors/download.test.ts deleted file mode 100644 index c4b171a7d..000000000 --- a/core/src/node/api/processors/download.test.ts +++ /dev/null @@ -1,125 +0,0 @@ -import { Downloader } from './download' -import { DownloadEvent } from '../../../types/api' -import { DownloadManager } from '../../helper/download' - -jest.mock('../../helper', () => ({ - getJanDataFolderPath: jest.fn().mockReturnValue('path/to/folder'), -})) - -jest.mock('../../helper/path', () => ({ - validatePath: jest.fn().mockReturnValue('path/to/folder'), - normalizeFilePath: () => - process.platform === 'win32' ? 'C:\\Users\\path\\to\\file.gguf' : '/Users/path/to/file.gguf', -})) - -jest.mock( - 'request', - jest.fn().mockReturnValue(() => ({ - on: jest.fn(), - })) -) - -jest.mock('fs', () => ({ - createWriteStream: jest.fn(), -})) - -const requestMock = jest.fn((options, callback) => { - callback(new Error('Test error'), null) -}) -jest.mock('request', () => requestMock) - -jest.mock('request-progress', () => { - return jest.fn().mockImplementation(() => { - return { - on: jest.fn().mockImplementation((event, callback) => { - if (event === 'error') { - callback(new Error('Download failed')) - } - return { - on: jest.fn().mockImplementation((event, callback) => { - if (event === 'error') { - callback(new Error('Download failed')) - } - return { - on: jest.fn().mockImplementation((event, callback) => { - if (event === 'error') { - callback(new Error('Download failed')) - } - return { pipe: jest.fn() } - }), - } - }), - } - }), - } - }) -}) - -describe('Downloader', () => { - beforeEach(() => { - jest.resetAllMocks() - }) - - it('should pause download correctly', () => { - const observer = jest.fn() - const fileName = process.platform === 'win32' ? 'C:\\path\\to\\file' : 'path/to/file' - - const downloader = new Downloader(observer) - const pauseMock = jest.fn() - DownloadManager.instance.networkRequests[fileName] = { pause: pauseMock } - - downloader.pauseDownload(observer, fileName) - - expect(pauseMock).toHaveBeenCalled() - }) - - it('should resume download correctly', () => { - const observer = jest.fn() - const fileName = process.platform === 'win32' ? 'C:\\path\\to\\file' : 'path/to/file' - - const downloader = new Downloader(observer) - const resumeMock = jest.fn() - DownloadManager.instance.networkRequests[fileName] = { resume: resumeMock } - - downloader.resumeDownload(observer, fileName) - - expect(resumeMock).toHaveBeenCalled() - }) - - it('should handle aborting a download correctly', () => { - const observer = jest.fn() - const fileName = process.platform === 'win32' ? 'C:\\path\\to\\file' : 'path/to/file' - - const downloader = new Downloader(observer) - const abortMock = jest.fn() - DownloadManager.instance.networkRequests[fileName] = { abort: abortMock } - - downloader.abortDownload(observer, fileName) - - expect(abortMock).toHaveBeenCalled() - expect(observer).toHaveBeenCalledWith( - DownloadEvent.onFileDownloadError, - expect.objectContaining({ - error: 'aborted', - }) - ) - }) - - it('should handle download fail correctly', () => { - const observer = jest.fn() - const fileName = process.platform === 'win32' ? 'C:\\path\\to\\file' : 'path/to/file.gguf' - - const downloader = new Downloader(observer) - - downloader.downloadFile(observer, { - localPath: fileName, - url: 'http://127.0.0.1', - }) - expect(observer).toHaveBeenCalledWith( - DownloadEvent.onFileDownloadError, - expect.objectContaining({ - error: expect.anything(), - }) - ) - }) -}) diff --git a/core/src/node/api/processors/download.ts b/core/src/node/api/processors/download.ts deleted file mode 100644 index 709ad9687..000000000 --- a/core/src/node/api/processors/download.ts +++ /dev/null @@ -1,138 +0,0 @@ -import { resolve, sep } from 'path' -import { DownloadEvent } from '../../../types/api' -import { normalizeFilePath } from '../../helper/path' -import { getJanDataFolderPath } from '../../helper' -import { DownloadManager } from '../../helper/download' -import { createWriteStream, renameSync } from 'fs' -import { Processor } from './Processor' -import { DownloadRequest, DownloadState, NetworkConfig } from '../../../types' - -export class Downloader implements Processor { - observer?: Function - - constructor(observer?: Function) { - this.observer = observer - } - - process(key: string, ...args: any[]): any { - const instance = this as any - const func = instance[key] - return func(this.observer, ...args) - } - - downloadFile(observer: any, downloadRequest: DownloadRequest, network?: NetworkConfig) { - const request = require('request') - const progress = require('request-progress') - - const strictSSL = !network?.ignoreSSL - const proxy = network?.proxy?.startsWith('http') ? network.proxy : undefined - - const { localPath, url } = downloadRequest - let normalizedPath = localPath - if (typeof localPath === 'string') { - normalizedPath = normalizeFilePath(localPath) - } - const array = normalizedPath.split(sep) - const fileName = array.pop() ?? '' - const modelId = downloadRequest.modelId ?? array.pop() ?? '' - - const destination = resolve(getJanDataFolderPath(), normalizedPath) - const rq = request({ url, strictSSL, proxy }) - - // Put request to download manager instance - DownloadManager.instance.setRequest(normalizedPath, rq) - - // Downloading file to a temp file first - const downloadingTempFile = `${destination}.download` - - // adding initial download state - const initialDownloadState: DownloadState = { - modelId, - fileName, - percent: 0, - size: { - total: 0, - transferred: 0, - }, - children: [], - downloadState: 'downloading', - extensionId: downloadRequest.extensionId, - downloadType: downloadRequest.downloadType, - localPath: normalizedPath, - } - DownloadManager.instance.downloadProgressMap[modelId] = initialDownloadState - DownloadManager.instance.downloadInfo[normalizedPath] = initialDownloadState - - if (downloadRequest.downloadType === 'extension') { - observer?.(DownloadEvent.onFileDownloadUpdate, initialDownloadState) - } - - progress(rq, {}) - .on('progress', (state: any) => { - const currentDownloadState = DownloadManager.instance.downloadProgressMap[modelId] - const downloadState: DownloadState = { - ...currentDownloadState, - ...state, - fileName: fileName, - downloadState: 'downloading', - } - console.debug('progress: ', downloadState) - observer?.(DownloadEvent.onFileDownloadUpdate, downloadState) - DownloadManager.instance.downloadProgressMap[modelId] = downloadState - }) - .on('error', (error: Error) => { - const currentDownloadState = DownloadManager.instance.downloadProgressMap[modelId] - const downloadState: DownloadState = { - ...currentDownloadState, - fileName: fileName, - error: error.message, - downloadState: 'error', - } - - observer?.(DownloadEvent.onFileDownloadError, downloadState) - DownloadManager.instance.downloadProgressMap[modelId] = downloadState - }) - .on('end', () => { - const currentDownloadState = DownloadManager.instance.downloadProgressMap[modelId] - if ( - currentDownloadState && - DownloadManager.instance.networkRequests[normalizedPath] && - DownloadManager.instance.downloadProgressMap[modelId]?.downloadState !== 'error' - ) { - // Finished downloading, rename temp file to actual file - renameSync(downloadingTempFile, destination) - const downloadState: DownloadState = { - ...currentDownloadState, - fileName: fileName, - downloadState: 'end', - } - observer?.(DownloadEvent.onFileDownloadSuccess, downloadState) - DownloadManager.instance.downloadProgressMap[modelId] = downloadState - } - }) - .pipe(createWriteStream(downloadingTempFile)) - } - - abortDownload(observer: any, fileName: string) { - const rq = DownloadManager.instance.networkRequests[fileName] - if (rq) { - DownloadManager.instance.networkRequests[fileName] = undefined - rq?.abort() - } - - const downloadInfo = DownloadManager.instance.downloadInfo[fileName] - observer?.(DownloadEvent.onFileDownloadError, { - ...downloadInfo, - fileName, - error: 'aborted', - }) - } - - resumeDownload(_observer: any, fileName: any) { - DownloadManager.instance.networkRequests[fileName]?.resume() - } - - pauseDownload(_observer: any, fileName: any) { - DownloadManager.instance.networkRequests[fileName]?.pause() - } -} diff --git a/core/src/node/helper/download.test.ts b/core/src/node/helper/download.test.ts deleted file mode 100644 index 95cc553b5..000000000 --- a/core/src/node/helper/download.test.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { DownloadManager } from './download'; - -it('should set a network request for a specific file', () => { - const downloadManager = new DownloadManager(); - const fileName = 'testFile'; - const request = { url: 'http://example.com' }; - - downloadManager.setRequest(fileName, request); - - expect(downloadManager.networkRequests[fileName]).toEqual(request); -}); diff --git a/core/src/node/helper/download.ts b/core/src/node/helper/download.ts deleted file mode 100644 index 51a0b0a8f..000000000 --- a/core/src/node/helper/download.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { DownloadState } from '../../types' - -/** - * Manages file downloads and network requests. - */ -export class DownloadManager { - public networkRequests: Record = {} - - public static instance: DownloadManager = new DownloadManager() - - // store the download information with key is model id - public downloadProgressMap: Record = {} - - // store the download information with key is normalized file path - public downloadInfo: Record = {} - - constructor() { - if (DownloadManager.instance) { - return DownloadManager.instance - } - } - /** - * Sets a network request for a specific file. - * @param {string} fileName - The name of the file. - * @param {Request | undefined} request - The network request to set, or undefined to clear the request. - */ - setRequest(fileName: string, request: any | undefined) { - this.networkRequests[fileName] = request - } -} diff --git a/core/src/node/helper/index.ts b/core/src/node/helper/index.ts index 51030023f..6464fbce2 100644 --- a/core/src/node/helper/index.ts +++ b/core/src/node/helper/index.ts @@ -1,5 +1,4 @@ export * from './config' -export * from './download' export * from './logger' export * from './module' export * from './path' diff --git a/core/src/types/api/index.ts b/core/src/types/api/index.ts index 63b0eb10e..2f33b72e4 100644 --- a/core/src/types/api/index.ts +++ b/core/src/types/api/index.ts @@ -31,6 +31,10 @@ export enum NativeRoute { startServer = 'startServer', stopServer = 'stopServer', + + appUpdateDownload = 'appUpdateDownload', + + appToken = 'appToken', } /** @@ -50,6 +54,8 @@ export enum AppRoute { } export enum AppEvent { + onAppUpdateNotAvailable = 'onAppUpdateNotAvailable', + onAppUpdateAvailable = 'onAppUpdateAvailable', onAppUpdateDownloadUpdate = 'onAppUpdateDownloadUpdate', onAppUpdateDownloadError = 'onAppUpdateDownloadError', onAppUpdateDownloadSuccess = 'onAppUpdateDownloadSuccess', @@ -61,30 +67,13 @@ export enum AppEvent { onMainViewStateChange = 'onMainViewStateChange', } -export enum DownloadRoute { - abortDownload = 'abortDownload', - downloadFile = 'downloadFile', - pauseDownload = 'pauseDownload', - resumeDownload = 'resumeDownload', - getDownloadProgress = 'getDownloadProgress', -} - export enum DownloadEvent { onFileDownloadUpdate = 'onFileDownloadUpdate', onFileDownloadError = 'onFileDownloadError', onFileDownloadSuccess = 'onFileDownloadSuccess', onFileDownloadStopped = 'onFileDownloadStopped', onFileDownloadStarted = 'onFileDownloadStarted', - onFileUnzipSuccess = 'onFileUnzipSuccess', } - -export enum LocalImportModelEvent { - onLocalImportModelUpdate = 'onLocalImportModelUpdate', - onLocalImportModelFailed = 'onLocalImportModelFailed', - onLocalImportModelSuccess = 'onLocalImportModelSuccess', - onLocalImportModelFinished = 'onLocalImportModelFinished', -} - export enum ExtensionRoute { baseExtensions = 'baseExtensions', getActiveExtensions = 'getActiveExtensions', @@ -127,10 +116,6 @@ export type AppEventFunctions = { [K in AppEvent]: ApiFunction } -export type DownloadRouteFunctions = { - [K in DownloadRoute]: ApiFunction -} - export type DownloadEventFunctions = { [K in DownloadEvent]: ApiFunction } @@ -150,7 +135,6 @@ export type FileManagerRouteFunctions = { export type APIFunctions = NativeRouteFunctions & AppRouteFunctions & AppEventFunctions & - DownloadRouteFunctions & DownloadEventFunctions & ExtensionRouteFunctions & FileSystemRouteFunctions & @@ -158,7 +142,6 @@ export type APIFunctions = NativeRouteFunctions & export const CoreRoutes = [ ...Object.values(AppRoute), - ...Object.values(DownloadRoute), ...Object.values(ExtensionRoute), ...Object.values(FileSystemRoute), ...Object.values(FileManagerRoute), @@ -168,7 +151,6 @@ export const APIRoutes = [...CoreRoutes, ...Object.values(NativeRoute)] export const APIEvents = [ ...Object.values(AppEvent), ...Object.values(DownloadEvent), - ...Object.values(LocalImportModelEvent), ] export type PayloadType = { messages: ChatCompletionMessage[] diff --git a/core/src/types/file/index.ts b/core/src/types/file/index.ts index 87d83c51d..3535dc6da 100644 --- a/core/src/types/file/index.ts +++ b/core/src/types/file/index.ts @@ -16,41 +16,9 @@ export type DownloadState = { error?: string extensionId?: string - downloadType?: DownloadType | string localPath?: string } -export type DownloadType = 'model' | 'extension' - -export type DownloadRequest = { - /** - * The URL to download the file from. - */ - url: string - - /** - * The local path to save the file to. - */ - localPath: string - - /** - * The extension ID of the extension that initiated the download. - * - * Can be extension name. - */ - extensionId?: string - - /** - * The model ID of the model that initiated the download. - */ - modelId?: string - - /** - * The download type. - */ - downloadType?: DownloadType | string -} - type DownloadTime = { elapsed: number remaining: number @@ -60,7 +28,6 @@ type DownloadSize = { total: number transferred: number } - /** * The file metadata */ diff --git a/core/src/types/miscellaneous/fileDownloadRequest.ts b/core/src/types/miscellaneous/fileDownloadRequest.ts deleted file mode 100644 index 83131aa71..000000000 --- a/core/src/types/miscellaneous/fileDownloadRequest.ts +++ /dev/null @@ -1,8 +0,0 @@ -export type FileDownloadRequest = { - downloadId: string - url: string - localPath: string - fileName: string - displayName: string - metadata: Record -} diff --git a/core/src/types/miscellaneous/index.ts b/core/src/types/miscellaneous/index.ts index 2693ffd8b..6e533259d 100644 --- a/core/src/types/miscellaneous/index.ts +++ b/core/src/types/miscellaneous/index.ts @@ -1,6 +1,4 @@ export * from './systemResourceInfo' export * from './promptTemplate' export * from './appUpdate' -export * from './fileDownloadRequest' -export * from './networkConfig' export * from './selectFiles' diff --git a/core/src/types/miscellaneous/networkConfig.ts b/core/src/types/miscellaneous/networkConfig.ts deleted file mode 100644 index 2d27f4223..000000000 --- a/core/src/types/miscellaneous/networkConfig.ts +++ /dev/null @@ -1,4 +0,0 @@ -export type NetworkConfig = { - proxy?: string - ignoreSSL?: boolean -} diff --git a/core/src/types/model/index.ts b/core/src/types/model/index.ts index fdbf01863..16140a1c6 100644 --- a/core/src/types/model/index.ts +++ b/core/src/types/model/index.ts @@ -2,3 +2,4 @@ export * from './modelEntity' export * from './modelInterface' export * from './modelEvent' export * from './modelImport' +export * from './modelSource' diff --git a/core/src/types/model/modelInterface.ts b/core/src/types/model/modelInterface.ts index 7ad1b136c..a03de97a2 100644 --- a/core/src/types/model/modelInterface.ts +++ b/core/src/types/model/modelInterface.ts @@ -1,5 +1,6 @@ import { Model } from './modelEntity' import { OptionType } from './modelImport' +import { ModelSource } from './modelSource' /** * Model extension for managing models. @@ -50,4 +51,17 @@ export interface ModelInterface { name?: string, optionType?: OptionType ): Promise + + /** + * Get model sources + */ + getSources(): Promise + /** + * Add a model source + */ + addSource(source: string): Promise + /** + * Delete a model source + */ + deleteSource(source: string): Promise } diff --git a/core/src/types/model/modelSource.ts b/core/src/types/model/modelSource.ts new file mode 100644 index 000000000..ecf3e8aee --- /dev/null +++ b/core/src/types/model/modelSource.ts @@ -0,0 +1,68 @@ +/** + * GGUF Metadata of the model source + */ +export interface GGUF { + architecture: string + bos_token: string + chat_template: string + context_length: number + eos_token: string + total: number +} + +/** + * Card Metadata of the model source + */ +export interface CardData { + license: string + pipeline_tag: string +} + +/** + * Model Metadata of the model source + */ +export interface Metadata { + author: string + cardData: CardData + createdAt: string + description: string + disabled: boolean + downloads: number + gated: boolean + gguf: GGUF + id: string + inference: string + lastModified: string + likes: number + modelId: string + pipeline_tag: string + private: boolean + sha: string + siblings: Array<{ + rfilename: string + size: number + }> + spaces: string[] + tags: string[] + usedStorage: number + apiKey?: string +} + +/** + * Model source sibling information + */ +export interface ModelSibling { + id: string + size: number +} + +/** + * Model source object + */ +export interface ModelSource { + id: string + author?: string + metadata: Metadata + models: ModelSibling[] + type?: string +} diff --git a/core/src/types/thread/index.ts b/core/src/types/thread/index.ts index 32155e1cd..c6ff6204a 100644 --- a/core/src/types/thread/index.ts +++ b/core/src/types/thread/index.ts @@ -1,3 +1,2 @@ export * from './threadEntity' export * from './threadInterface' -export * from './threadEvent' diff --git a/core/src/types/thread/threadEvent.test.ts b/core/src/types/thread/threadEvent.test.ts deleted file mode 100644 index f892f1050..000000000 --- a/core/src/types/thread/threadEvent.test.ts +++ /dev/null @@ -1,6 +0,0 @@ - -import { ThreadEvent } from './threadEvent'; - -it('should have the correct values', () => { - expect(ThreadEvent.OnThreadStarted).toBe('OnThreadStarted'); -}); diff --git a/core/src/types/thread/threadEvent.ts b/core/src/types/thread/threadEvent.ts deleted file mode 100644 index 4b19b09c1..000000000 --- a/core/src/types/thread/threadEvent.ts +++ /dev/null @@ -1,4 +0,0 @@ -export enum ThreadEvent { - /** The `OnThreadStarted` event is emitted when a thread is started. */ - OnThreadStarted = 'OnThreadStarted', -} diff --git a/docs/.env.example b/docs/.env.example index 4048b604c..eff7b6923 100644 --- a/docs/.env.example +++ b/docs/.env.example @@ -1 +1,3 @@ -GTM_ID=xxxx \ No newline at end of file +GTM_ID=xxxx +POSTHOG_KEY=xxxx +POSTHOG_HOST=xxxx \ No newline at end of file diff --git a/docs/next.config.mjs b/docs/next.config.mjs index 92b8fb461..660410c06 100644 --- a/docs/next.config.mjs +++ b/docs/next.config.mjs @@ -27,6 +27,8 @@ const nextConfig = { output: 'export', env: { GTM_ID: process.env.GTM_ID, + POSTHOG_KEY: process.env.POSTHOG_KEY, + POSTHOG_HOST: process.env.POSTHOG_HOST, }, transpilePackages: ['@scalar', 'react-tweet'], images: { diff --git a/docs/package.json b/docs/package.json index ac2fab87b..fd691a09a 100644 --- a/docs/package.json +++ b/docs/package.json @@ -36,6 +36,7 @@ "path": "^0.12.7", "plop": "^4.0.1", "plop-helper-date": "^1.0.0", + "posthog-js": "^1.194.6", "react": "^18", "react-dom": "^18", "react-hook-form": "^7.51.1", diff --git a/docs/public/assets/images/changelog/jan-v0-5-13.gif b/docs/public/assets/images/changelog/jan-v0-5-13.gif new file mode 100644 index 000000000..5466692e8 Binary files /dev/null and b/docs/public/assets/images/changelog/jan-v0-5-13.gif differ diff --git a/docs/public/assets/images/changelog/jan-v0-5-14-deepseek-r1.gif b/docs/public/assets/images/changelog/jan-v0-5-14-deepseek-r1.gif new file mode 100644 index 000000000..c1732ec60 Binary files /dev/null and b/docs/public/assets/images/changelog/jan-v0-5-14-deepseek-r1.gif differ diff --git a/docs/public/sitemap-0.xml b/docs/public/sitemap-0.xml index 2b4a04975..517d84329 100644 --- a/docs/public/sitemap-0.xml +++ b/docs/public/sitemap-0.xml @@ -1,129 +1,148 @@ -https://jan.ai2024-09-09T08:19:45.721Zdaily1 -https://jan.ai/about2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/about/handbook2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/about/handbook/analytics2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/about/handbook/engineering2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/about/handbook/engineering/ci-cd2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/about/handbook/engineering/qa2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/about/handbook/product-design2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/about/handbook/project-management2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/about/handbook/strategy2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/about/handbook/website-docs2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/about/investors2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/about/team2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/about/vision2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/about/wall-of-love2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/blog2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/changelog2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/changelog/2023-12-21-faster-inference-across-platform2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/changelog/2024-01-16-settings-options-right-panel2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/changelog/2024-01-29-local-api-server2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/changelog/2024-02-05-jan-data-folder2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/changelog/2024-02-26-home-servers-with-helm2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/changelog/2024-03-06-ui-revamp-settings2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/changelog/2024-03-11-import-models2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/changelog/2024-03-19-nitro-tensorrt-llm-extension2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/changelog/2024-04-02-groq-api-integration2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/changelog/2024-04-15-new-mistral-extension2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/changelog/2024-04-25-llama3-command-r-hugginface2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/changelog/2024-05-20-llamacpp-upgrade-new-remote-models2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/changelog/2024-05-28-cohere-aya-23-8b-35b-phi-3-medium2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/changelog/2024-06-21-nvidia-nim-support2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/changelog/2024-07-15-claude-3-5-support2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/changelog/2024-09-01-llama3-1-gemma2-support2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/cortex2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/cortex/architecture2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/cortex/assistants2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/cortex/build-extension2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/cortex/cli2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/cortex/cli/chat2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/cortex/cli/init2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/cortex/cli/kill2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/cortex/cli/models2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/cortex/cli/models/download2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/cortex/cli/models/get2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/cortex/cli/models/list2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/cortex/cli/models/remove2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/cortex/cli/models/start2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/cortex/cli/models/stop2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/cortex/cli/models/update2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/cortex/cli/ps2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/cortex/cli/pull2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/cortex/cli/run2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/cortex/cli/serve2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/cortex/command-line2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/cortex/cortex-cpp2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/cortex/cortex-llamacpp2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/cortex/cortex-openvino2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/cortex/cortex-python2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/cortex/cortex-tensorrt-llm2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/cortex/embeddings2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/cortex/embeddings/overview2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/cortex/error-codes2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/cortex/ext-architecture2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/cortex/fine-tuning2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/cortex/fine-tuning/overview2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/cortex/function-calling2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/cortex/hardware2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/cortex/installation2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/cortex/installation/linux2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/cortex/installation/mac2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/cortex/installation/windows2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/cortex/model-operations2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/cortex/model-operations/overview2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/cortex/py-library2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/cortex/quickstart2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/cortex/rag2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/cortex/rag/overview2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/cortex/server2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/cortex/text-generation2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/cortex/ts-library2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/cortex/vision2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/cortex/vision/overview2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/docs2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/docs/assistants2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/docs/built-in/llama-cpp2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/docs/built-in/tensorrt-llm2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/docs/data-folder2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/docs/desktop2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/docs/desktop/linux2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/docs/desktop/mac2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/docs/desktop/windows2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/docs/error-codes2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/docs/extensions2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/docs/install-extensions2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/docs/models2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/docs/models/manage-models2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/docs/models/model-parameters2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/docs/quickstart2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/docs/remote-models/anthropic2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/docs/remote-models/azure2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/docs/remote-models/cohere2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/docs/remote-models/generic-openai2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/docs/remote-models/groq2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/docs/remote-models/martian2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/docs/remote-models/mistralai2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/docs/remote-models/nvidia-nim2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/docs/remote-models/openai2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/docs/remote-models/openrouter2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/docs/remote-models/triton2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/docs/settings2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/docs/shortcuts2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/docs/threads2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/docs/tools/retrieval2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/docs/troubleshooting2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/download2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/integrations2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/integrations/coding/continue-dev2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/integrations/function-calling/interpreter2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/integrations/messaging/llmcord2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/integrations/workflow-automation/raycast2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/post/benchmarking-nvidia-tensorrt-llm2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/post/bitdefender2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/post/data-is-moat2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/post/rag-is-not-enough2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/privacy2024-09-09T08:19:45.722Zdaily1 -https://jan.ai/support2024-09-09T08:19:45.722Zdaily1 +https://jan.ai2025-03-10T05:06:47.876Zdaily1 +https://jan.ai/about2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/about/handbook2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/about/handbook/analytics2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/about/handbook/engineering2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/about/handbook/engineering/ci-cd2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/about/handbook/engineering/qa2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/about/handbook/product-design2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/about/handbook/project-management2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/about/handbook/strategy2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/about/handbook/website-docs2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/about/investors2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/about/team2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/about/vision2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/about/wall-of-love2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/blog2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/changelog2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/changelog/2023-12-21-faster-inference-across-platform2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/changelog/2024-01-16-settings-options-right-panel2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/changelog/2024-01-29-local-api-server2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/changelog/2024-02-05-jan-data-folder2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/changelog/2024-02-10-jan-is-more-stable2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/changelog/2024-02-26-home-servers-with-helm2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/changelog/2024-03-06-ui-revamp-settings2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/changelog/2024-03-11-import-models2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/changelog/2024-03-19-nitro-tensorrt-llm-extension2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/changelog/2024-04-02-groq-api-integration2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/changelog/2024-04-15-new-mistral-extension2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/changelog/2024-04-25-llama3-command-r-hugginface2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/changelog/2024-05-20-llamacpp-upgrade-new-remote-models2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/changelog/2024-05-28-cohere-aya-23-8b-35b-phi-3-medium2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/changelog/2024-06-21-nvidia-nim-support2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/changelog/2024-07-15-claude-3-5-support2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/changelog/2024-09-01-llama3-1-gemma2-support2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/changelog/2024-09-17-improved-cpu-performance2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/changelog/2024-10-24-jan-stable2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/changelog/2024-11-22-jan-bugs2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/changelog/2024-11.14-jan-supports-qwen-coder2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/changelog/2024-12-03-jan-is-faster2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/changelog/2024-12-05-jan-hot-fix-mac2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/changelog/2024-12-30-jan-new-privacy2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/changelog/2025-01-06-key-issues-resolved2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/changelog/2025-01-23-deepseek-r1-jan2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/cortex2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/cortex/architecture2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/cortex/assistants2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/cortex/build-extension2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/cortex/cli2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/cortex/cli/chat2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/cortex/cli/init2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/cortex/cli/kill2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/cortex/cli/models2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/cortex/cli/models/download2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/cortex/cli/models/get2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/cortex/cli/models/list2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/cortex/cli/models/remove2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/cortex/cli/models/start2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/cortex/cli/models/stop2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/cortex/cli/models/update2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/cortex/cli/ps2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/cortex/cli/pull2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/cortex/cli/run2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/cortex/cli/serve2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/cortex/command-line2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/cortex/cortex-cpp2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/cortex/cortex-llamacpp2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/cortex/cortex-openvino2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/cortex/cortex-python2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/cortex/cortex-tensorrt-llm2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/cortex/embeddings2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/cortex/embeddings/overview2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/cortex/error-codes2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/cortex/ext-architecture2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/cortex/fine-tuning2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/cortex/fine-tuning/overview2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/cortex/function-calling2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/cortex/hardware2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/cortex/installation2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/cortex/installation/linux2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/cortex/installation/mac2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/cortex/installation/windows2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/cortex/model-operations2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/cortex/model-operations/overview2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/cortex/py-library2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/cortex/quickstart2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/cortex/rag2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/cortex/rag/overview2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/cortex/server2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/cortex/text-generation2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/cortex/ts-library2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/cortex/vision2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/cortex/vision/overview2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/docs2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/docs/api-server2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/docs/assistants2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/docs/configure-extensions2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/docs/data-folder2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/docs/desktop2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/docs/desktop/linux2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/docs/desktop/mac2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/docs/desktop/windows2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/docs/error-codes2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/docs/extensions2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/docs/extensions-settings/model-management2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/docs/extensions-settings/system-monitoring2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/docs/install-engines2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/docs/install-extensions2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/docs/local-engines/llama-cpp2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/docs/models2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/docs/models/manage-models2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/docs/models/model-parameters2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/docs/privacy2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/docs/privacy-policy2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/docs/quickstart2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/docs/remote-models/anthropic2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/docs/remote-models/cohere2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/docs/remote-models/deepseek2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/docs/remote-models/google2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/docs/remote-models/groq2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/docs/remote-models/martian2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/docs/remote-models/mistralai2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/docs/remote-models/nvidia-nim2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/docs/remote-models/openai2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/docs/remote-models/openrouter2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/docs/remote-models/triton2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/docs/settings2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/docs/threads2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/docs/tools/retrieval2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/docs/troubleshooting2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/download2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/integrations2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/integrations/coding/continue-dev2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/integrations/coding/tabby2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/integrations/function-calling/interpreter2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/integrations/messaging/llmcord2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/integrations/workflow-automation/n8n2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/post/benchmarking-nvidia-tensorrt-llm2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/post/bitdefender2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/post/data-is-moat2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/post/deepseek-r1-locally2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/post/offline-chatgpt-alternative2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/post/rag-is-not-enough2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/post/run-ai-models-locally2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/privacy2025-03-10T05:06:47.877Zdaily1 +https://jan.ai/support2025-03-10T05:06:47.877Zdaily1 \ No newline at end of file diff --git a/docs/src/components/FooterMenu/index.tsx b/docs/src/components/FooterMenu/index.tsx index 7b144a956..eb24f40d7 100644 --- a/docs/src/components/FooterMenu/index.tsx +++ b/docs/src/components/FooterMenu/index.tsx @@ -1,4 +1,4 @@ -import React, { useState } from 'react' +import React, { useEffect, useState } from 'react' import ThemeImage from '@/components/ThemeImage' import { AiOutlineGithub } from 'react-icons/ai' import { RiTwitterXFill } from 'react-icons/ri' @@ -7,6 +7,7 @@ import { BiLogoDiscordAlt } from 'react-icons/bi' import { useForm } from 'react-hook-form' import LogoMark from '@/components/LogoMark' import { FaLinkedin } from 'react-icons/fa' +import posthog from 'posthog-js' const socials = [ { @@ -94,7 +95,7 @@ const menus = [ }, { menu: 'Careers', - path: 'https://homebrew.bamboohr.com/careers', + path: 'https://menlo.bamboohr.com/careers', external: true, }, ], @@ -104,6 +105,19 @@ const menus = [ const getCurrentYear = new Date().getFullYear() export default function Footer() { + useEffect(() => { + if (typeof window !== 'undefined') { + posthog.init(process.env.POSTHOG_KEY as string, { + api_host: process.env.POSTHOG_HOST, + disable_session_recording: true, + person_profiles: 'always', + persistence: 'localStorage', + }) + + posthog.capture('web_page_view', { timestamp: new Date() }) + } + }, []) + const { register, handleSubmit, reset } = useForm({ defaultValues: { email: '', diff --git a/docs/src/pages/_app.mdx b/docs/src/pages/_app.mdx index 8fa4b4875..08c72e32b 100644 --- a/docs/src/pages/_app.mdx +++ b/docs/src/pages/_app.mdx @@ -3,7 +3,6 @@ import '@code-hike/mdx/styles.css' import { Fragment } from "react" import Script from "next/script" - export default function App({ Component, pageProps }) { return ( diff --git a/docs/src/pages/about/index.mdx b/docs/src/pages/about/index.mdx index c50093e53..af88de01e 100644 --- a/docs/src/pages/about/index.mdx +++ b/docs/src/pages/about/index.mdx @@ -93,7 +93,7 @@ We are inspired by and actively try to emulate the paths of companies we admire - [Obsidian](https://obsidian.md/) - [Discourse](https://www.discourse.org/about) - [Gitlab](https://handbook.gitlab.com/handbook/company/history/#2017-gitlab-storytime) -- [Redhat](https://www.redhat.com/en/about/development-model) +- [Red Hat](https://www.redhat.com/en/about/development-model) - [Ghost](https://ghost.org/docs/contributing/) - [Lago](https://www.getlago.com/blog/open-source-licensing-and-why-lago-chose-agplv3) - [Twenty](https://twenty.com/story) diff --git a/docs/src/pages/about/team.mdx b/docs/src/pages/about/team.mdx index 205ac106e..d9c8e6b27 100644 --- a/docs/src/pages/about/team.mdx +++ b/docs/src/pages/about/team.mdx @@ -20,7 +20,7 @@ import { Cards, Card } from 'nextra/components' We're a small, fully-remote team, mostly based in Southeast Asia. -We are committed to become a global company. You can check our [Careers page](https://homebrew.bamboohr.com/careers) if you'd like to join us on our adventure. +We are committed to become a global company. You can check our [Careers page](https://menlo.bamboohr.com/careers) if you'd like to join us on our adventure. Ping us in [Discord](https://discord.gg/AAGQNpJQtH) if you're keen to talk to us! diff --git a/docs/src/pages/changelog/2025-01-06-key-issues-resolved.mdx b/docs/src/pages/changelog/2025-01-06-key-issues-resolved.mdx new file mode 100644 index 000000000..108ce4b8d --- /dev/null +++ b/docs/src/pages/changelog/2025-01-06-key-issues-resolved.mdx @@ -0,0 +1,23 @@ +--- +title: "A few key issues have been solved!" +version: 0.5.13 +description: "Jan v0.5.13 is here: A few key issues have been solved." +date: 2025-01-06 +ogImage: "/assets/images/changelog/jan-v0-5-13.gif" +--- + +import ChangelogHeader from "@/components/Changelog/ChangelogHeader" + + + +👋 Jan v0.5.13 is here: A few key issues have been solved! + +### Highlights 🎉 + +- Resolved model loading issues on MacOS Intel +- Fixed app resetting max_tokens to 8192 on new threads - now uses model settings +- Fixed Vulkan settings visibility for some users + +Update your product or download the latest: https://jan.ai + +For more details, see the [GitHub release notes](https://github.com/janhq/jan/releases/tag/v0.5.13). \ No newline at end of file diff --git a/docs/src/pages/changelog/2025-01-23-deepseek-r1-jan.mdx b/docs/src/pages/changelog/2025-01-23-deepseek-r1-jan.mdx new file mode 100644 index 000000000..ebea46acf --- /dev/null +++ b/docs/src/pages/changelog/2025-01-23-deepseek-r1-jan.mdx @@ -0,0 +1,36 @@ +--- +title: "Run DeepSeek R1 Distills error-free!" +version: 0.5.14 +description: "Jan v0.5.14 is out: Run DeepSeek R1 Distills error-free!" +date: 2025-01-23 +ogImage: "/assets/images/changelog/jan-v0-5-14-deepseek-r1.gif" +--- + +import ChangelogHeader from "@/components/Changelog/ChangelogHeader" + + + +👋 Jan v0.5.14 is out: Run DeepSeek R1 Distills error-free! + +You can run DeepSeek R1 distills in Jan error-free. Follow our [step-by-step guide to run DeepSeek R1 locally](/post/deepseek-r1-locally) and get this AI model running on your device in minutes. + +llama.cpp version updated via Cortex—thanks to GG & llama.cpp community! + +- Paste GGUF links into Jan Hub to download +- Already downloaded the model but facing issues? Update Jan. + +Models: + +Qwen +- DeepSeek-R1-Distill-Qwen-1.5B-GGUF: https://huggingface.co/bartowski/DeepSeek-R1-Distill-Qwen-1.5B-GGUF +- DeepSeek-R1-Distill-Qwen-7B-GGUF: https://huggingface.co/bartowski/DeepSeek-R1-Distill-Qwen-7B-GGUF +- DeepSeek-R1-Distill-Qwen-14B-GGUF: https://huggingface.co/bartowski/DeepSeek-R1-Distill-Qwen-14B-GGUF +- DeepSeek-R1-Distill-Qwen-32B-GGUF: https://huggingface.co/bartowski/DeepSeek-R1-Distill-Qwen-32B-GGUF + +Llama +- DeepSeek-R1-Distill-Llama-8B-GGUF: https://huggingface.co/bartowski/DeepSeek-R1-Distill-Llama-8B-GGUF +- DeepSeek-R1-Distill-Llama-70B-GGUF: https://huggingface.co/bartowski/DeepSeek-R1-Distill-Llama-70B-GGUF + +Update your Jan or [download the latest](https://jan.ai/). + +For more details, see the [GitHub release notes](https://github.com/janhq/jan/releases/tag/v0.5.14). \ No newline at end of file diff --git a/docs/src/pages/docs/_assets/anthropic.png b/docs/src/pages/docs/_assets/anthropic.png index 108576903..d82ba291d 100644 Binary files a/docs/src/pages/docs/_assets/anthropic.png and b/docs/src/pages/docs/_assets/anthropic.png differ diff --git a/docs/src/pages/docs/_assets/api-server.png b/docs/src/pages/docs/_assets/api-server.png index 65469a3b0..2d62edbe5 100644 Binary files a/docs/src/pages/docs/_assets/api-server.png and b/docs/src/pages/docs/_assets/api-server.png differ diff --git a/docs/src/pages/docs/_assets/assistant-01.png b/docs/src/pages/docs/_assets/assistant-01.png index eabf2bba2..ebbb134ed 100644 Binary files a/docs/src/pages/docs/_assets/assistant-01.png and b/docs/src/pages/docs/_assets/assistant-01.png differ diff --git a/docs/src/pages/docs/_assets/cohere.png b/docs/src/pages/docs/_assets/cohere.png index 87d3d0fa4..0d8f7f010 100644 Binary files a/docs/src/pages/docs/_assets/cohere.png and b/docs/src/pages/docs/_assets/cohere.png differ diff --git a/docs/src/pages/docs/_assets/deepseek.png b/docs/src/pages/docs/_assets/deepseek.png new file mode 100644 index 000000000..9e1084aee Binary files /dev/null and b/docs/src/pages/docs/_assets/deepseek.png differ diff --git a/docs/src/pages/docs/_assets/extensions-01.png b/docs/src/pages/docs/_assets/extensions-01.png index 9ac2d9a98..98fe85480 100644 Binary files a/docs/src/pages/docs/_assets/extensions-01.png and b/docs/src/pages/docs/_assets/extensions-01.png differ diff --git a/docs/src/pages/docs/_assets/extensions-02.png b/docs/src/pages/docs/_assets/extensions-02.png index e2e582b37..5761b6b7f 100644 Binary files a/docs/src/pages/docs/_assets/extensions-02.png and b/docs/src/pages/docs/_assets/extensions-02.png differ diff --git a/docs/src/pages/docs/_assets/extensions-03.png b/docs/src/pages/docs/_assets/extensions-03.png index bbdd2c371..a74230a0a 100644 Binary files a/docs/src/pages/docs/_assets/extensions-03.png and b/docs/src/pages/docs/_assets/extensions-03.png differ diff --git a/docs/src/pages/docs/_assets/extensions-04.png b/docs/src/pages/docs/_assets/extensions-04.png index e643f435b..20b48bcf5 100644 Binary files a/docs/src/pages/docs/_assets/extensions-04.png and b/docs/src/pages/docs/_assets/extensions-04.png differ diff --git a/docs/src/pages/docs/_assets/extensions-05.png b/docs/src/pages/docs/_assets/extensions-05.png new file mode 100644 index 000000000..3967d90a8 Binary files /dev/null and b/docs/src/pages/docs/_assets/extensions-05.png differ diff --git a/docs/src/pages/docs/_assets/extensions-06.png b/docs/src/pages/docs/_assets/extensions-06.png new file mode 100644 index 000000000..b169e3926 Binary files /dev/null and b/docs/src/pages/docs/_assets/extensions-06.png differ diff --git a/docs/src/pages/docs/_assets/extensions-07.png b/docs/src/pages/docs/_assets/extensions-07.png new file mode 100644 index 000000000..3d39f56d9 Binary files /dev/null and b/docs/src/pages/docs/_assets/extensions-07.png differ diff --git a/docs/src/pages/docs/_assets/extensions-08.png b/docs/src/pages/docs/_assets/extensions-08.png new file mode 100644 index 000000000..3d124e367 Binary files /dev/null and b/docs/src/pages/docs/_assets/extensions-08.png differ diff --git a/docs/src/pages/docs/_assets/extensions-09.png b/docs/src/pages/docs/_assets/extensions-09.png new file mode 100644 index 000000000..7d7cd6193 Binary files /dev/null and b/docs/src/pages/docs/_assets/extensions-09.png differ diff --git a/docs/src/pages/docs/_assets/extensions-10.png b/docs/src/pages/docs/_assets/extensions-10.png new file mode 100644 index 000000000..ecadd8475 Binary files /dev/null and b/docs/src/pages/docs/_assets/extensions-10.png differ diff --git a/docs/src/pages/docs/_assets/google.png b/docs/src/pages/docs/_assets/google.png new file mode 100644 index 000000000..8a99146b7 Binary files /dev/null and b/docs/src/pages/docs/_assets/google.png differ diff --git a/docs/src/pages/docs/_assets/groq.png b/docs/src/pages/docs/_assets/groq.png index d9927fe7a..cef77e7de 100644 Binary files a/docs/src/pages/docs/_assets/groq.png and b/docs/src/pages/docs/_assets/groq.png differ diff --git a/docs/src/pages/docs/_assets/install-engines-01.png b/docs/src/pages/docs/_assets/install-engines-01.png index 85db02b98..95e824a7f 100644 Binary files a/docs/src/pages/docs/_assets/install-engines-01.png and b/docs/src/pages/docs/_assets/install-engines-01.png differ diff --git a/docs/src/pages/docs/_assets/install-engines-02.png b/docs/src/pages/docs/_assets/install-engines-02.png index dcdd7e4df..b6b6a6a58 100644 Binary files a/docs/src/pages/docs/_assets/install-engines-02.png and b/docs/src/pages/docs/_assets/install-engines-02.png differ diff --git a/docs/src/pages/docs/_assets/install-engines-03.png b/docs/src/pages/docs/_assets/install-engines-03.png index cb2ecde56..a65145a4c 100644 Binary files a/docs/src/pages/docs/_assets/install-engines-03.png and b/docs/src/pages/docs/_assets/install-engines-03.png differ diff --git a/docs/src/pages/docs/_assets/jan-app.png b/docs/src/pages/docs/_assets/jan-app.png index 2490d925a..8b3acf3b3 100644 Binary files a/docs/src/pages/docs/_assets/jan-app.png and b/docs/src/pages/docs/_assets/jan-app.png differ diff --git a/docs/src/pages/docs/_assets/llama.cpp-01.png b/docs/src/pages/docs/_assets/llama.cpp-01.png index b794fe1df..0e04856d9 100644 Binary files a/docs/src/pages/docs/_assets/llama.cpp-01.png and b/docs/src/pages/docs/_assets/llama.cpp-01.png differ diff --git a/docs/src/pages/docs/_assets/martian.png b/docs/src/pages/docs/_assets/martian.png index e00349b01..840fd083d 100644 Binary files a/docs/src/pages/docs/_assets/martian.png and b/docs/src/pages/docs/_assets/martian.png differ diff --git a/docs/src/pages/docs/_assets/mistralai.png b/docs/src/pages/docs/_assets/mistralai.png index 70139c6ae..98c550680 100644 Binary files a/docs/src/pages/docs/_assets/mistralai.png and b/docs/src/pages/docs/_assets/mistralai.png differ diff --git a/docs/src/pages/docs/_assets/model-management-01.png b/docs/src/pages/docs/_assets/model-management-01.png index 9020c66b2..a00b40535 100644 Binary files a/docs/src/pages/docs/_assets/model-management-01.png and b/docs/src/pages/docs/_assets/model-management-01.png differ diff --git a/docs/src/pages/docs/_assets/model-management-02.png b/docs/src/pages/docs/_assets/model-management-02.png index bb446d056..6940dccf0 100644 Binary files a/docs/src/pages/docs/_assets/model-management-02.png and b/docs/src/pages/docs/_assets/model-management-02.png differ diff --git a/docs/src/pages/docs/_assets/model-management-04.png b/docs/src/pages/docs/_assets/model-management-04.png index 71d72dff2..696217cb7 100644 Binary files a/docs/src/pages/docs/_assets/model-management-04.png and b/docs/src/pages/docs/_assets/model-management-04.png differ diff --git a/docs/src/pages/docs/_assets/model-management-05.png b/docs/src/pages/docs/_assets/model-management-05.png index 891fa943a..85676ccd2 100644 Binary files a/docs/src/pages/docs/_assets/model-management-05.png and b/docs/src/pages/docs/_assets/model-management-05.png differ diff --git a/docs/src/pages/docs/_assets/model-management-06.png b/docs/src/pages/docs/_assets/model-management-06.png index ebd2de3d1..eced32503 100644 Binary files a/docs/src/pages/docs/_assets/model-management-06.png and b/docs/src/pages/docs/_assets/model-management-06.png differ diff --git a/docs/src/pages/docs/_assets/model-management-07.png b/docs/src/pages/docs/_assets/model-management-07.png index 612904ac7..ca9880ac0 100644 Binary files a/docs/src/pages/docs/_assets/model-management-07.png and b/docs/src/pages/docs/_assets/model-management-07.png differ diff --git a/docs/src/pages/docs/_assets/model-management-08.png b/docs/src/pages/docs/_assets/model-management-08.png new file mode 100644 index 000000000..98c02a19d Binary files /dev/null and b/docs/src/pages/docs/_assets/model-management-08.png differ diff --git a/docs/src/pages/docs/_assets/model-management-09.png b/docs/src/pages/docs/_assets/model-management-09.png new file mode 100644 index 000000000..990b53710 Binary files /dev/null and b/docs/src/pages/docs/_assets/model-management-09.png differ diff --git a/docs/src/pages/docs/_assets/model-parameters.png b/docs/src/pages/docs/_assets/model-parameters.png index a99deb75e..2d4c12ec2 100644 Binary files a/docs/src/pages/docs/_assets/model-parameters.png and b/docs/src/pages/docs/_assets/model-parameters.png differ diff --git a/docs/src/pages/docs/_assets/nvidia-nim.png b/docs/src/pages/docs/_assets/nvidia-nim.png index 8eb637c12..e748756f7 100644 Binary files a/docs/src/pages/docs/_assets/nvidia-nim.png and b/docs/src/pages/docs/_assets/nvidia-nim.png differ diff --git a/docs/src/pages/docs/_assets/openai.png b/docs/src/pages/docs/_assets/openai.png index e6407d9ed..6c489c4dd 100644 Binary files a/docs/src/pages/docs/_assets/openai.png and b/docs/src/pages/docs/_assets/openai.png differ diff --git a/docs/src/pages/docs/_assets/openrouter.png b/docs/src/pages/docs/_assets/openrouter.png index d9e032700..3e4c6b472 100644 Binary files a/docs/src/pages/docs/_assets/openrouter.png and b/docs/src/pages/docs/_assets/openrouter.png differ diff --git a/docs/src/pages/docs/_assets/quick-start-01.png b/docs/src/pages/docs/_assets/quick-start-01.png index 430b01fb0..03b101aa2 100644 Binary files a/docs/src/pages/docs/_assets/quick-start-01.png and b/docs/src/pages/docs/_assets/quick-start-01.png differ diff --git a/docs/src/pages/docs/_assets/quick-start-02.png b/docs/src/pages/docs/_assets/quick-start-02.png index 998e04dc8..977d8ebdb 100644 Binary files a/docs/src/pages/docs/_assets/quick-start-02.png and b/docs/src/pages/docs/_assets/quick-start-02.png differ diff --git a/docs/src/pages/docs/_assets/quick-start-03.png b/docs/src/pages/docs/_assets/quick-start-03.png index 51d6de0d2..49cf3064d 100644 Binary files a/docs/src/pages/docs/_assets/quick-start-03.png and b/docs/src/pages/docs/_assets/quick-start-03.png differ diff --git a/docs/src/pages/docs/_assets/retrieval-01.png b/docs/src/pages/docs/_assets/retrieval-01.png index b29b964b5..1d120e745 100644 Binary files a/docs/src/pages/docs/_assets/retrieval-01.png and b/docs/src/pages/docs/_assets/retrieval-01.png differ diff --git a/docs/src/pages/docs/_assets/retrieval-02.png b/docs/src/pages/docs/_assets/retrieval-02.png index 37fc8bf99..2ec4ba029 100644 Binary files a/docs/src/pages/docs/_assets/retrieval-02.png and b/docs/src/pages/docs/_assets/retrieval-02.png differ diff --git a/docs/src/pages/docs/_assets/settings-01.png b/docs/src/pages/docs/_assets/settings-01.png index 7a8539d65..e2e5aead5 100644 Binary files a/docs/src/pages/docs/_assets/settings-01.png and b/docs/src/pages/docs/_assets/settings-01.png differ diff --git a/docs/src/pages/docs/_assets/settings-02.png b/docs/src/pages/docs/_assets/settings-02.png index b00924d5a..6c1699a1c 100644 Binary files a/docs/src/pages/docs/_assets/settings-02.png and b/docs/src/pages/docs/_assets/settings-02.png differ diff --git a/docs/src/pages/docs/_assets/settings-03.png b/docs/src/pages/docs/_assets/settings-03.png index aced464be..4e32c390b 100644 Binary files a/docs/src/pages/docs/_assets/settings-03.png and b/docs/src/pages/docs/_assets/settings-03.png differ diff --git a/docs/src/pages/docs/_assets/settings-04.png b/docs/src/pages/docs/_assets/settings-04.png index 36dc64fce..72198ced5 100644 Binary files a/docs/src/pages/docs/_assets/settings-04.png and b/docs/src/pages/docs/_assets/settings-04.png differ diff --git a/docs/src/pages/docs/_assets/settings-05.png b/docs/src/pages/docs/_assets/settings-05.png index 8fb76e0fc..489d6cd50 100644 Binary files a/docs/src/pages/docs/_assets/settings-05.png and b/docs/src/pages/docs/_assets/settings-05.png differ diff --git a/docs/src/pages/docs/_assets/settings-06.png b/docs/src/pages/docs/_assets/settings-06.png index 3a582b42a..a90a10ad2 100644 Binary files a/docs/src/pages/docs/_assets/settings-06.png and b/docs/src/pages/docs/_assets/settings-06.png differ diff --git a/docs/src/pages/docs/_assets/settings-07.png b/docs/src/pages/docs/_assets/settings-07.png index 878c4ea66..4ecadd0dc 100644 Binary files a/docs/src/pages/docs/_assets/settings-07.png and b/docs/src/pages/docs/_assets/settings-07.png differ diff --git a/docs/src/pages/docs/_assets/settings-08.png b/docs/src/pages/docs/_assets/settings-08.png index a1c7d7dd1..dc289c558 100644 Binary files a/docs/src/pages/docs/_assets/settings-08.png and b/docs/src/pages/docs/_assets/settings-08.png differ diff --git a/docs/src/pages/docs/_assets/settings-09.png b/docs/src/pages/docs/_assets/settings-09.png index 8d5e577e1..db79947f2 100644 Binary files a/docs/src/pages/docs/_assets/settings-09.png and b/docs/src/pages/docs/_assets/settings-09.png differ diff --git a/docs/src/pages/docs/_assets/settings-10.png b/docs/src/pages/docs/_assets/settings-10.png index b89c9dace..30c4dd4d4 100644 Binary files a/docs/src/pages/docs/_assets/settings-10.png and b/docs/src/pages/docs/_assets/settings-10.png differ diff --git a/docs/src/pages/docs/_assets/settings-11.png b/docs/src/pages/docs/_assets/settings-11.png index b304f9f3b..8f44e83ec 100644 Binary files a/docs/src/pages/docs/_assets/settings-11.png and b/docs/src/pages/docs/_assets/settings-11.png differ diff --git a/docs/src/pages/docs/_assets/settings-12.png b/docs/src/pages/docs/_assets/settings-12.png index a4d45dedd..15bbc6c96 100644 Binary files a/docs/src/pages/docs/_assets/settings-12.png and b/docs/src/pages/docs/_assets/settings-12.png differ diff --git a/docs/src/pages/docs/_assets/settings-13.png b/docs/src/pages/docs/_assets/settings-13.png index f2b41ba3f..851976d4e 100644 Binary files a/docs/src/pages/docs/_assets/settings-13.png and b/docs/src/pages/docs/_assets/settings-13.png differ diff --git a/docs/src/pages/docs/_assets/settings-14.png b/docs/src/pages/docs/_assets/settings-14.png index b253cb0dc..7845fb593 100644 Binary files a/docs/src/pages/docs/_assets/settings-14.png and b/docs/src/pages/docs/_assets/settings-14.png differ diff --git a/docs/src/pages/docs/_assets/settings-15.png b/docs/src/pages/docs/_assets/settings-15.png index f739f8513..ccc52f497 100644 Binary files a/docs/src/pages/docs/_assets/settings-15.png and b/docs/src/pages/docs/_assets/settings-15.png differ diff --git a/docs/src/pages/docs/_assets/settings-17.png b/docs/src/pages/docs/_assets/settings-17.png index 83c10fa95..d48996f9b 100644 Binary files a/docs/src/pages/docs/_assets/settings-17.png and b/docs/src/pages/docs/_assets/settings-17.png differ diff --git a/docs/src/pages/docs/_assets/settings-18.png b/docs/src/pages/docs/_assets/settings-18.png index 63718d0ef..629d546fb 100644 Binary files a/docs/src/pages/docs/_assets/settings-18.png and b/docs/src/pages/docs/_assets/settings-18.png differ diff --git a/docs/src/pages/docs/_assets/tensorrt-llm-01.png b/docs/src/pages/docs/_assets/tensorrt-llm-01.png new file mode 100644 index 000000000..2f839f7a5 Binary files /dev/null and b/docs/src/pages/docs/_assets/tensorrt-llm-01.png differ diff --git a/docs/src/pages/docs/_assets/tensorrt-llm-02.png b/docs/src/pages/docs/_assets/tensorrt-llm-02.png new file mode 100644 index 000000000..de9841874 Binary files /dev/null and b/docs/src/pages/docs/_assets/tensorrt-llm-02.png differ diff --git a/docs/src/pages/docs/_assets/threads-01.png b/docs/src/pages/docs/_assets/threads-01.png index 564c753c2..55d45d7ce 100644 Binary files a/docs/src/pages/docs/_assets/threads-01.png and b/docs/src/pages/docs/_assets/threads-01.png differ diff --git a/docs/src/pages/docs/_assets/threads-02.png b/docs/src/pages/docs/_assets/threads-02.png index f51916571..67005c575 100644 Binary files a/docs/src/pages/docs/_assets/threads-02.png and b/docs/src/pages/docs/_assets/threads-02.png differ diff --git a/docs/src/pages/docs/_assets/threads-03.png b/docs/src/pages/docs/_assets/threads-03.png index 5a5fd3238..2b975dbd6 100644 Binary files a/docs/src/pages/docs/_assets/threads-03.png and b/docs/src/pages/docs/_assets/threads-03.png differ diff --git a/docs/src/pages/docs/_assets/threads-04.png b/docs/src/pages/docs/_assets/threads-04.png index 748282868..b0ea7a31e 100644 Binary files a/docs/src/pages/docs/_assets/threads-04.png and b/docs/src/pages/docs/_assets/threads-04.png differ diff --git a/docs/src/pages/docs/_assets/threads-05.png b/docs/src/pages/docs/_assets/threads-05.png index 4c11667d8..1ea34caa9 100644 Binary files a/docs/src/pages/docs/_assets/threads-05.png and b/docs/src/pages/docs/_assets/threads-05.png differ diff --git a/docs/src/pages/docs/_assets/trouble-shooting-01.png b/docs/src/pages/docs/_assets/trouble-shooting-01.png index a12ea97b0..82c9a20b5 100644 Binary files a/docs/src/pages/docs/_assets/trouble-shooting-01.png and b/docs/src/pages/docs/_assets/trouble-shooting-01.png differ diff --git a/docs/src/pages/docs/_assets/trouble-shooting-02.png b/docs/src/pages/docs/_assets/trouble-shooting-02.png index 290c4a8ce..7c1a2d296 100644 Binary files a/docs/src/pages/docs/_assets/trouble-shooting-02.png and b/docs/src/pages/docs/_assets/trouble-shooting-02.png differ diff --git a/docs/src/pages/docs/index.mdx b/docs/src/pages/docs/index.mdx index 23c5e3ae9..c3f0ad2ef 100644 --- a/docs/src/pages/docs/index.mdx +++ b/docs/src/pages/docs/index.mdx @@ -25,7 +25,7 @@ import FAQBox from '@/components/FaqBox' ![Jan's Cover Image](./_assets/jan-app.png) -Jan is a ChatGPT-alternative that runs 100% offline on your desktop & mobile (*comming soon*). Our goal is to make it easy for a layperson[^1] to download and run LLMs and use AI with full control and [privacy](https://www.reuters.com/legal/legalindustry/privacy-paradox-with-ai-2023-10-31/). +Jan is a ChatGPT-alternative that runs 100% offline on your desktop & mobile (*coming soon*). Our goal is to make it easy for a layperson[^1] to download and run LLMs and use AI with full control and [privacy](https://www.reuters.com/legal/legalindustry/privacy-paradox-with-ai-2023-10-31/). Jan is powered by [Cortex](https://cortex.so/), our embeddable local AI engine. @@ -158,10 +158,10 @@ Jan has an extensible architecture like VSCode and Obsidian - you can build cust - Yes! We love hiring from our community. Check out our open positions at [Careers](https://homebrew.bamboohr.com/careers). + Yes! We love hiring from our community. Check out our open positions at [Careers](https://menlo.bamboohr.com/careers). ## Footnotes -[^1]: Our definition of "Non-technical" == don't need to know how to use Command Line \ No newline at end of file +[^1]: Our definition of "Non-technical" == don't need to know how to use Command Line diff --git a/docs/src/pages/docs/models/manage-models.mdx b/docs/src/pages/docs/models/manage-models.mdx index 01f0fc06f..797d08853 100644 --- a/docs/src/pages/docs/models/manage-models.mdx +++ b/docs/src/pages/docs/models/manage-models.mdx @@ -18,7 +18,7 @@ keywords: ] --- import { Callout, Steps } from 'nextra/components' -import { Settings, EllipsisVertical, Plus, FolderOpen, Pencil } from 'lucide-react' +import { Settings, Trash2, EllipsisVertical, Plus, FolderOpen, Pencil } from 'lucide-react' # Model Management @@ -201,12 +201,12 @@ Modify model parameters under the settings array. Key fields to configure: ## Cloud model -When using cloud models, be aware of any associated costs and rate limits from the providers. +When using cloud models, be aware of any associated costs and rate limits from the providers. See detailed guide for each cloud model provider [here](/docs/remote-models/anthropic). Jan supports connecting to various AI cloud providers that are OpenAI API-compatible, including: OpenAI (GPT-4, o1,...), Anthropic (Claude), Groq, Mistral, and more. 1. Navigate to **Settings** () -2. Under **Remote Engines** section in the left sidebar, choose your preferred engines (OpenAI, Anthropic, etc.) +2. Under **Remote Engine** section in the left sidebar, choose your preferred engines (OpenAI, Anthropic, etc.) 3. Enter your API key 4. The activated cloud models will be available in your model selector in **Threads** @@ -214,7 +214,25 @@ Jan supports connecting to various AI cloud providers that are OpenAI API-compat ![Download Model](../_assets/model-management-06.png)
-Cloud models cannot be deleted, but you can hide them by disabling their respective provider engines in **Settings** > **Engines**. +You can manage & hide respective provider engines in **Settings** > **Engines**:
![Download Model](../_assets/model-management-07.png) +
+ +### Add Models +1. In your respective provider's settings page, click **Add Model** +2. Enter the **model ID**. Check detailed model IDs in the provider's model list, for example, `claude-3-opus-latest`. +3. A success message will appear when the model is added + +
+![Add Model](../_assets/model-management-08.png) +
+ +### Delete Models +1. In your respective provider's settings page, choose the model you want to delete +2. Click **Trash Bin** () icon +3. The model will be removed from your available models list + +
+![Delete Model](../_assets/model-management-09.png)
\ No newline at end of file diff --git a/docs/src/pages/docs/remote-models/_meta.json b/docs/src/pages/docs/remote-models/_meta.json index 529047774..62709526e 100644 --- a/docs/src/pages/docs/remote-models/_meta.json +++ b/docs/src/pages/docs/remote-models/_meta.json @@ -7,6 +7,14 @@ "title": "Cohere", "href": "/docs/remote-models/cohere" }, + "deepseek": { + "title": "DeepSeek", + "href": "/docs/remote-models/deepseek" + }, + "google": { + "title": "Google", + "href": "/docs/remote-models/google" + }, "groq": { "title": "Groq", "href": "/docs/remote-models/groq" @@ -20,7 +28,7 @@ "href": "/docs/remote-models/mistralai" }, "nvidia-nim": { - "title": "Nvidia NIM", + "title": "Nvidia", "href": "/docs/remote-models/nvidia-nim" }, "openai": { diff --git a/docs/src/pages/docs/remote-models/anthropic.mdx b/docs/src/pages/docs/remote-models/anthropic.mdx index 8b7fdbccd..cf83782b9 100644 --- a/docs/src/pages/docs/remote-models/anthropic.mdx +++ b/docs/src/pages/docs/remote-models/anthropic.mdx @@ -60,7 +60,7 @@ There are two ways to add your Anthropic API keys in Jan: ## Available Anthropic Models -Jan automatically includes Anthropic's available models. In case you want to use a specific Anthropic model that you cannot find in **Jan**, follow instructions in [Manual Setup](/docs/models/manage-models#4-manual-setup) to add custom models: +Jan automatically includes Anthropic's available models. In case you want to use a specific Anthropic model that you cannot find in **Jan**, follow instructions in [Add Cloud Models](/docs/models/manage-models#add-models-1): - See list of available models in [Anthropic Models](https://docs.anthropic.com/claude/docs/models-overview). - The `id` property must match the model name in the list. For example, `claude-3-opus-20240229`, `claude-3-sonnet-20240229`, or `claude-2.1`. diff --git a/docs/src/pages/docs/remote-models/cohere.mdx b/docs/src/pages/docs/remote-models/cohere.mdx index 41e60431d..c53e7e84b 100644 --- a/docs/src/pages/docs/remote-models/cohere.mdx +++ b/docs/src/pages/docs/remote-models/cohere.mdx @@ -60,7 +60,7 @@ There are two ways to add your Cohere API keys in Jan: ## Available Cohere Models -Jan automatically includes Cohere's available models. In case you want to use a specific Cohere model that you cannot find in **Jan**, follow instructions in [Manual Setup](/docs/models/manage-models#4-manual-setup) to add custom models: +Jan automatically includes Cohere's available models. In case you want to use a specific Cohere model that you cannot find in **Jan**, follow instructions in [Add Cloud Models](/docs/models/manage-models#add-models-1): - See list of available models in [Cohere Documentation](https://docs.cohere.com/v2/docs/models). - The `id` property must match the model name in the list. For example, `command-nightly` or `command-light`. diff --git a/docs/src/pages/docs/remote-models/deepseek.mdx b/docs/src/pages/docs/remote-models/deepseek.mdx new file mode 100644 index 000000000..67b596846 --- /dev/null +++ b/docs/src/pages/docs/remote-models/deepseek.mdx @@ -0,0 +1,86 @@ +--- +title: DeepSeek +description: Learn how to integrate DeepSeek with Jan for enhanced functionality. +keywords: + [ + Anthropic API, + Jan, + Jan AI, + ChatGPT alternative, + conversational AI, + large language model, + integration, + Anthropic integration, + API integration + ] +--- + +import { Callout, Steps } from 'nextra/components' +import { Settings, Plus } from 'lucide-react' + +# DeepSeek + +Jan supports [DeepSeek](https://www.deepseek.com/) API integration, allowing you to use DeepSeek models through Jan's interface. + +## Integrate DeepSeek API with Jan + + +### Step 1: Get Your API Key +1. Visit [DeepSeek Console](https://platform.deepseek.com/) and sign in +2. Create & copy a new API key or copy your existing one + + +Ensure your API key has sufficient credits + + +### Step 2: Configure Jan +There are two ways to add your DeepSeek API keys in Jan: + +**Through Threads:** +1. In Threads, click **Model** tab in the **right sidebar** or **model selector** in input field +2. Once the selector is poped up, choose the **Cloud** tab +3. Click **Add** () icon next to **DeepSeek** +4. Once you are directed to DeepSeek settings, insert your **API Key** + +**Through Settings:** +1. Navigate to **Settings** () +2. Under **Remote Engines**, select **DeepSeek** +3. Insert your **API Key** + +
+![DeepSeek](../_assets/deepseek.png) +
+ +### Step 3: Start Using DeepSeek's Models + +1. In any existing **Threads** or create a new one +2. Select an DeepSeek model from **model selector** +3. Start chatting +
+ +## Available DeepSeek Models + +Jan automatically includes DeepSeek's available models. In case you want to use a specific DeepSeek model that you cannot find in **Jan**, follow instructions in [Add Cloud Models](/docs/models/manage-models#add-models-1): + - See list of available models in [DeepSeek Models](https://api-docs.deepseek.com/quick_start/pricing). + - The `id` property must match the model name in the list. For example, `deepseek-chat` or `deepseek-reasoner`. + +## Troubleshooting + +Common issues and solutions: + +**1. API Key Issues** +- Verify your API key is correct and not expired +- Check if you have billing set up on your DeepSeek account +- Ensure you have access to the model you're trying to use + +**2. Connection Problems** +- Check your internet connection +- Verify [DeepSeek's system status](https://status.deepseek.com/) +- Look for error messages in [Jan's logs](/docs/troubleshooting#how-to-get-error-logs) + +**3. Model Unavailable** +- Confirm your API key has access to the model +- Check if you're using the correct model ID +- Verify your DeepSeek account has the necessary permissions + +Need more help? Join our [Discord community](https://discord.gg/FTk2MvZwJH). \ No newline at end of file diff --git a/docs/src/pages/docs/remote-models/google.mdx b/docs/src/pages/docs/remote-models/google.mdx new file mode 100644 index 000000000..e9dd6e716 --- /dev/null +++ b/docs/src/pages/docs/remote-models/google.mdx @@ -0,0 +1,86 @@ +--- +title: Google +description: Learn how to integrate Google with Jan for enhanced functionality. +keywords: + [ + Anthropic API, + Jan, + Jan AI, + ChatGPT alternative, + conversational AI, + large language model, + integration, + Anthropic integration, + API integration + ] +--- + +import { Callout, Steps } from 'nextra/components' +import { Settings, Plus } from 'lucide-react' + +# Google + +Jan supports [Google](https://ai.google/get-started/our-models/) API integration, allowing you to use Google models (like Gemini series) through Jan's interface. + +## Integrate Google API with Jan + + +### Step 1: Get Your API Key +1. Visit [Google AI Studio](https://aistudio.google.com/app/apikey) and sign in +2. Create & copy a new API key or copy your existing one + + +Ensure your API key has sufficient credits + + +### Step 2: Configure Jan +There are two ways to add your Google API keys in Jan: + +**Through Threads:** +1. In Threads, click **Model** tab in the **right sidebar** or **model selector** in input field +2. Once the selector is poped up, choose the **Cloud** tab +3. Click **Add** () icon next to **Google** +4. Once you are directed to Google settings, insert your **API Key** + +**Through Settings:** +1. Navigate to **Settings** () +2. Under **Remote Engines**, select **Google** +3. Insert your **API Key** + +
+![Google](../_assets/google.png) +
+ +### Step 3: Start Using Google's Models + +1. In any existing **Threads** or create a new one +2. Select an Google model from **model selector** +3. Start chatting +
+ +## Available Google Models + +Jan automatically includes Google's available models like Gemini series. In case you want to use a specific Google model that you cannot find in **Jan**, follow instructions in [Add Cloud Models](/docs/models/manage-models#add-models-1): + - See list of available models in [Google Models](https://ai.google.dev/gemini-api/docs/models/gemini). + - The `id` property must match the model name in the list. For example, `gemini-1.5-pro` or `gemini-2.0-flash-lite-preview`. + +## Troubleshooting + +Common issues and solutions: + +**1. API Key Issues** +- Verify your API key is correct and not expired +- Check if you have billing set up on your Google account +- Ensure you have access to the model you're trying to use + +**2. Connection Problems** +- Check your internet connection +- Verify [Gemini's system status](https://www.google.com/appsstatus/dashboard/) +- Look for error messages in [Jan's logs](/docs/troubleshooting#how-to-get-error-logs) + +**3. Model Unavailable** +- Confirm your API key has access to the model +- Check if you're using the correct model ID +- Verify your Google account has the necessary permissions + +Need more help? Join our [Discord community](https://discord.gg/FTk2MvZwJH). \ No newline at end of file diff --git a/docs/src/pages/docs/remote-models/groq.mdx b/docs/src/pages/docs/remote-models/groq.mdx index c0ccaf627..327e4a6b7 100644 --- a/docs/src/pages/docs/remote-models/groq.mdx +++ b/docs/src/pages/docs/remote-models/groq.mdx @@ -61,7 +61,7 @@ There are two ways to add your Groq API keys in Jan: ## Available Models Through Groq -Jan automatically includes Groq's available models. In case you want to use a specific Groq model that you cannot find in **Jan**, follow instructions in [Manual Setup](/docs/models/manage-models#4-manual-setup) to add custom models: +Jan automatically includes Groq's available models. In case you want to use a specific Groq model that you cannot find in **Jan**, follow instructions in [Add Cloud Models](/docs/models/manage-models#add-models-1): - See list of available models in [Groq Documentation](https://console.groq.com/docs/models). - The `id` property must match the model name in the list. For example, if you want to use Llama3.3 70B, you must set the `id` property to `llama-3.3-70b-versatile`. diff --git a/docs/src/pages/docs/remote-models/mistralai.mdx b/docs/src/pages/docs/remote-models/mistralai.mdx index c1051a703..68efe5073 100644 --- a/docs/src/pages/docs/remote-models/mistralai.mdx +++ b/docs/src/pages/docs/remote-models/mistralai.mdx @@ -61,7 +61,7 @@ There are two ways to add your Mistral AI keys in Jan: ## Available Mistral Models -Jan automatically includes Mistral's available models. In case you want to use a specific Mistral model that you cannot find in **Jan**, follow instructions in [Manual Setup](/docs/models/manage-models#4-manual-setup) to add custom models: +Jan automatically includes Mistral's available models. In case you want to use a specific Mistral model that you cannot find in **Jan**, follow instructions in [Add Cloud Models](/docs/models/manage-models#add-models-1): - See list of available models in [Mistral AI Documentation](https://docs.mistral.ai/platform/endpoints). - The `id` property must match the model name in the list. For example, if you want to use Mistral Large, you must set the `id` property to `mistral-large-latest` diff --git a/docs/src/pages/docs/remote-models/nvidia-nim.mdx b/docs/src/pages/docs/remote-models/nvidia-nim.mdx index f2e3b0d06..fc4e26549 100644 --- a/docs/src/pages/docs/remote-models/nvidia-nim.mdx +++ b/docs/src/pages/docs/remote-models/nvidia-nim.mdx @@ -1,5 +1,5 @@ --- -title: NVIDIA NIM +title: NVIDIA description: Learn how to integrate NVIDIA NIM with Jan for enhanced functionality. keywords: [ @@ -20,17 +20,17 @@ import { Settings, Plus } from 'lucide-react' # NVIDIA NIM -Jan supports [NVIDIA NIM](https://www.nvidia.com/en-us/ai/) API integration, allowing you to use NVIDIA's Large Language Models through Jan's interface. +Jan supports [Nvidia](https://www.nvidia.com/en-us/ai/) API integration, allowing you to use Nvidia's Large Language Models through Jan's interface. -NVIDIA NIM extension is only supported on Jan version 0.5.1 or later. +Nvidia engine is only supported on Jan version 0.5.1 or later. ## Integrate Nvidia NIM API with Jan ### Step 1: Get Your API Key -1. Visit [NVIDIA Docs](https://docs.nvidia.com/nim/nemo-retriever/text-reranking/latest/getting-started.html#generate-an-api-key) and generate an API key +1. Visit [Nvidia](https://docs.nvidia.com/nim/nemo-retriever/text-reranking/latest/getting-started.html#generate-an-api-key) and generate an API key 2. Copy your API key @@ -38,17 +38,17 @@ Ensure your API key has sufficient credits ### Step 2: Configure Jan -There are two ways to add your Nvidia NIM API keys in Jan: +There are two ways to add your Nvidia API keys in Jan: **Through Threads:** 1. In Threads, click **Model** tab in the **right sidebar** or **model selector** in input field 2. Once the selector is poped up, choose the **Cloud** tab -3. Click **Add** () icon next to **Nvidia NIM** -4. Once you are directed to Nvidia NIM settings, insert your **API Key** +3. Click **Add** () icon next to **Nvidia** +4. Once you are directed to Nvidia settings, insert your **API Key** **Through Settings:** 1. Navigate to **Settings** () -2. Under **Remote Engines**, select **Nvidia NIM** +2. Under **Remote Engines**, select **Nvidia** 3. Insert your **API Key**
@@ -58,14 +58,14 @@ There are two ways to add your Nvidia NIM API keys in Jan: ### Step 3: Start Using Nvidia NIM Models 1. In any existing **Threads** or create a new one -2. Select a NVIDIA NIM model from **model selector** +2. Select a Nvidia model from **model selector** 3. Start chatting
## Available Nvidia NIM Models -Jan automatically includes NVIDIA NIM's available models. In case you want to use a specific model that you cannot find in **Jan**, follow instructions in [Manual Setup](/docs/models/manage-models#4-manual-setup) to add custom models: - - See list of available models in [Nvidia NIM Documentation](https://build.nvidia.com/models). +Jan automatically includes Nvidia's available models. In case you want to use a specific model that you cannot find in **Jan**, follow instructions in [Add Cloud Models](/docs/models/manage-models#add-models-1): + - See list of available models in [Nvidia Documentation](https://build.nvidia.com/models). - The `id` property must match the model name in the list. ## Troubleshooting @@ -74,18 +74,18 @@ Common issues and solutions: **1. API Key Issues** - Verify your API key is correct and not expired -- Check if you have billing set up on your NVIDIA account +- Check if you have billing set up on your Nvidia account - Ensure you have access to the model you're trying to use **2. Connection Problems** - Check your internet connection -- Verify NVIDIA's system status +- Verify Nvidia's system status - Look for error messages in [Jan's logs](/docs/troubleshooting#how-to-get-error-logs) **3. Model Unavailable** - Confirm your API key has access to the model - Check if you're using the correct model ID -- Verify your NVIDIA account has the necessary permissions +- Verify your Nvidia account has the necessary permissions - Make sure you're using Jan version 0.5.1 or later Need more help? Join our [Discord community](https://discord.gg/FTk2MvZwJH) or check the [Nvidia documentation](https://docs.nvidia.com/nim/large-language-models/latest/getting-started.html). \ No newline at end of file diff --git a/docs/src/pages/docs/remote-models/openai.mdx b/docs/src/pages/docs/remote-models/openai.mdx index 502891f3d..f3cb63ef6 100644 --- a/docs/src/pages/docs/remote-models/openai.mdx +++ b/docs/src/pages/docs/remote-models/openai.mdx @@ -62,7 +62,7 @@ Start chatting ## Available OpenAI Models -Jan automatically includes popular OpenAI models. In case you want to use a specific OpenAI model that you cannot find in Jan, follow instructions in [Manual Setup](/docs/models/manage-models#4-manual-setup) to add custom models: +Jan automatically includes popular OpenAI models. In case you want to use a specific OpenAI model that you cannot find in Jan, follow instructions in [Add Cloud Models](/docs/models/manage-models#add-models-1): - See list of available models in [OpenAI Platform](https://platform.openai.com/docs/models/overview). - The id property must match the model name in the list. For example, if you want to use the [GPT-4 Turbo](https://platform.openai.com/docs/models/gpt-4-and-gpt-4-turbo), you must set the id property to gpt-4-1106-preview. diff --git a/docs/src/pages/docs/troubleshooting.mdx b/docs/src/pages/docs/troubleshooting.mdx index f2fdf3ea8..900bd5918 100644 --- a/docs/src/pages/docs/troubleshooting.mdx +++ b/docs/src/pages/docs/troubleshooting.mdx @@ -393,7 +393,7 @@ The "Unexpected token" error usually relates to OpenAI API authentication or reg ## Need Further Support? If you can't find what you need in our troubleshooting guide, feel free reach out to us for extra help: - **Copy** your [app logs](/docs/troubleshooting#how-to-get-error-logs) -- Go to our [Discord](https://discord.com/invite/FTk2MvZwJH) & send it to **#🆘|get-help** channel for further support. +- Go to our [Discord](https://discord.com/invite/FTk2MvZwJH) & send it to **#🆘|jan-help** channel for further support. diff --git a/docs/src/pages/post/_assets/ai-locally-llama.cpp.jpg b/docs/src/pages/post/_assets/ai-locally-llama.cpp.jpg new file mode 100644 index 000000000..967b63bf7 Binary files /dev/null and b/docs/src/pages/post/_assets/ai-locally-llama.cpp.jpg differ diff --git a/docs/src/pages/post/_assets/chat-with-docs-prompt.jpg b/docs/src/pages/post/_assets/chat-with-docs-prompt.jpg new file mode 100644 index 000000000..df47dd4ef Binary files /dev/null and b/docs/src/pages/post/_assets/chat-with-docs-prompt.jpg differ diff --git a/docs/src/pages/post/_assets/chat-with-your-docs-offline-ai.jpg b/docs/src/pages/post/_assets/chat-with-your-docs-offline-ai.jpg new file mode 100644 index 000000000..efcda0f07 Binary files /dev/null and b/docs/src/pages/post/_assets/chat-with-your-docs-offline-ai.jpg differ diff --git a/docs/src/pages/post/_assets/deepseek-r1-locally-jan.jpg b/docs/src/pages/post/_assets/deepseek-r1-locally-jan.jpg new file mode 100644 index 000000000..2168b8986 Binary files /dev/null and b/docs/src/pages/post/_assets/deepseek-r1-locally-jan.jpg differ diff --git a/docs/src/pages/post/_assets/download-jan.jpg b/docs/src/pages/post/_assets/download-jan.jpg new file mode 100644 index 000000000..f799260c7 Binary files /dev/null and b/docs/src/pages/post/_assets/download-jan.jpg differ diff --git a/docs/src/pages/post/_assets/hugging-face-jan-model-download.jpg b/docs/src/pages/post/_assets/hugging-face-jan-model-download.jpg new file mode 100644 index 000000000..c6cfa8ea5 Binary files /dev/null and b/docs/src/pages/post/_assets/hugging-face-jan-model-download.jpg differ diff --git a/docs/src/pages/post/_assets/jan-hf-model-download.jpg b/docs/src/pages/post/_assets/jan-hf-model-download.jpg new file mode 100644 index 000000000..929acf2ff Binary files /dev/null and b/docs/src/pages/post/_assets/jan-hf-model-download.jpg differ diff --git a/docs/src/pages/post/_assets/jan-hub-deepseek-r1.jpg b/docs/src/pages/post/_assets/jan-hub-deepseek-r1.jpg new file mode 100644 index 000000000..12c0c6640 Binary files /dev/null and b/docs/src/pages/post/_assets/jan-hub-deepseek-r1.jpg differ diff --git a/docs/src/pages/post/_assets/jan-hub-download-deepseek-r1-2.jpg b/docs/src/pages/post/_assets/jan-hub-download-deepseek-r1-2.jpg new file mode 100644 index 000000000..24be4bd25 Binary files /dev/null and b/docs/src/pages/post/_assets/jan-hub-download-deepseek-r1-2.jpg differ diff --git a/docs/src/pages/post/_assets/jan-hub-download-deepseek-r1.jpg b/docs/src/pages/post/_assets/jan-hub-download-deepseek-r1.jpg new file mode 100644 index 000000000..83d9ab370 Binary files /dev/null and b/docs/src/pages/post/_assets/jan-hub-download-deepseek-r1.jpg differ diff --git a/docs/src/pages/post/_assets/jan-hub-for-ai-models.jpg b/docs/src/pages/post/_assets/jan-hub-for-ai-models.jpg new file mode 100644 index 000000000..a158499b4 Binary files /dev/null and b/docs/src/pages/post/_assets/jan-hub-for-ai-models.jpg differ diff --git a/docs/src/pages/post/_assets/jan-library-deepseek-r1.jpg b/docs/src/pages/post/_assets/jan-library-deepseek-r1.jpg new file mode 100644 index 000000000..6a54082dc Binary files /dev/null and b/docs/src/pages/post/_assets/jan-library-deepseek-r1.jpg differ diff --git a/docs/src/pages/post/_assets/jan-local-ai.jpg b/docs/src/pages/post/_assets/jan-local-ai.jpg new file mode 100644 index 000000000..2c8c145ff Binary files /dev/null and b/docs/src/pages/post/_assets/jan-local-ai.jpg differ diff --git a/docs/src/pages/post/_assets/jan-model-download.jpg b/docs/src/pages/post/_assets/jan-model-download.jpg new file mode 100644 index 000000000..7e949403d Binary files /dev/null and b/docs/src/pages/post/_assets/jan-model-download.jpg differ diff --git a/docs/src/pages/post/_assets/jan-model-selection.jpg b/docs/src/pages/post/_assets/jan-model-selection.jpg new file mode 100644 index 000000000..b630c800e Binary files /dev/null and b/docs/src/pages/post/_assets/jan-model-selection.jpg differ diff --git a/docs/src/pages/post/_assets/jan-runs-deepseek-r1-distills.jpg b/docs/src/pages/post/_assets/jan-runs-deepseek-r1-distills.jpg new file mode 100644 index 000000000..02ce847f4 Binary files /dev/null and b/docs/src/pages/post/_assets/jan-runs-deepseek-r1-distills.jpg differ diff --git a/docs/src/pages/post/_assets/jan-system-prompt-deepseek-r1.jpg b/docs/src/pages/post/_assets/jan-system-prompt-deepseek-r1.jpg new file mode 100644 index 000000000..f79e71af0 Binary files /dev/null and b/docs/src/pages/post/_assets/jan-system-prompt-deepseek-r1.jpg differ diff --git a/docs/src/pages/post/_assets/jan.ai.jpg b/docs/src/pages/post/_assets/jan.ai.jpg new file mode 100644 index 000000000..d635d1ab9 Binary files /dev/null and b/docs/src/pages/post/_assets/jan.ai.jpg differ diff --git a/docs/src/pages/post/_assets/local-ai-model-parameters.jpg b/docs/src/pages/post/_assets/local-ai-model-parameters.jpg new file mode 100644 index 000000000..1d26fc4a5 Binary files /dev/null and b/docs/src/pages/post/_assets/local-ai-model-parameters.jpg differ diff --git a/docs/src/pages/post/_assets/offline-chatgpt-alternative-ai-without-internet.jpg b/docs/src/pages/post/_assets/offline-chatgpt-alternative-ai-without-internet.jpg new file mode 100644 index 000000000..6dffb1e95 Binary files /dev/null and b/docs/src/pages/post/_assets/offline-chatgpt-alternative-ai-without-internet.jpg differ diff --git a/docs/src/pages/post/_assets/offline-chatgpt-alternatives-jan.jpg b/docs/src/pages/post/_assets/offline-chatgpt-alternatives-jan.jpg new file mode 100644 index 000000000..065b33636 Binary files /dev/null and b/docs/src/pages/post/_assets/offline-chatgpt-alternatives-jan.jpg differ diff --git a/docs/src/pages/post/_assets/open-source-ai-quantization.jpg b/docs/src/pages/post/_assets/open-source-ai-quantization.jpg new file mode 100644 index 000000000..fe605c3cd Binary files /dev/null and b/docs/src/pages/post/_assets/open-source-ai-quantization.jpg differ diff --git a/docs/src/pages/post/_assets/run-ai-locally-with-jan.jpg b/docs/src/pages/post/_assets/run-ai-locally-with-jan.jpg new file mode 100644 index 000000000..942ab38ba Binary files /dev/null and b/docs/src/pages/post/_assets/run-ai-locally-with-jan.jpg differ diff --git a/docs/src/pages/post/_assets/run-deepseek-r1-locally-in-jan.jpg b/docs/src/pages/post/_assets/run-deepseek-r1-locally-in-jan.jpg new file mode 100644 index 000000000..aa6980585 Binary files /dev/null and b/docs/src/pages/post/_assets/run-deepseek-r1-locally-in-jan.jpg differ diff --git a/docs/src/pages/post/deepseek-r1-locally.mdx b/docs/src/pages/post/deepseek-r1-locally.mdx new file mode 100644 index 000000000..c9fb229b5 --- /dev/null +++ b/docs/src/pages/post/deepseek-r1-locally.mdx @@ -0,0 +1,130 @@ +--- +title: "Run DeepSeek R1 locally on your device (Beginner-Friendly Guide)" +description: "A straightforward guide to running DeepSeek R1 locally regardless of your background." +tags: DeepSeek, R1, local AI, Jan, GGUF, Qwen, Llama +categories: guides +date: 2025-01-31 +ogImage: assets/deepseek-r1-locally-jan.jpg +twitter: + card: summary_large_image + site: "@jandotai" + title: "Run DeepSeek R1 locally on your device (Beginner-Friendly Guide)" + description: "A straightforward guide to running DeepSeek R1 locally regardless of your background." + image: assets/deepseek-r1-locally-jan.jpg +--- +import { Callout } from 'nextra/components' +import CTABlog from '@/components/Blog/CTA' + +# Run DeepSeek R1 locally on your device (Beginner-Friendly Guide) + +![DeepSeek R1 running locally in Jan AI interface, showing the chat interface and model settings](./_assets/deepseek-r1-locally-jan.jpg) + +DeepSeek R1 is one of the best open-source models in the market right now, and you can run DeepSeek R1 on your own computer! + + +New to running AI models locally? Check out the [guide on running AI models locally](/post/run-ai-models-locally) first. It covers essential concepts that will help you better understand this DeepSeek R1 guide. + + +DeepSeek R1 requires data-center level computers to run at its full potential, and we'll use a smaller version that works great on regular computers. + +Why use an optimized version? +- Efficient performance on standard hardware +- Faster download and initialization +- Optimized storage requirements +- Maintains most of the original model's capabilities + +## Quick Steps at a Glance +1. Download [Jan](https://jan.ai/) +2. Select a model version +3. Choose settings +4. Set up the prompt template & start using DeepSeek R1 + +Let's walk through each step with detailed instructions. + +## Step 1: Download Jan +[Jan](https://jan.ai/) is an open-source application that enables you to run AI models locally. It's available for Windows, Mac, and Linux. For beginners, Jan is the best choice to get started. + +![Jan AI interface, showing the download button](./_assets/download-jan.jpg) + +1. Visit [jan.ai](https://jan.ai) +2. Download the appropriate version for your operating system +3. Install the app + +## Step 2: Choose Your DeepSeek R1 Version + +To run AI models like DeepSeek R1 on your computer, you'll need something called VRAM (Video Memory). Think of VRAM as your computer's special memory for handling complex tasks like gaming or, in our case, running AI models. It's different from regular RAM - VRAM is part of your graphics card (GPU). + + +Running AI models locally is like running a very sophisticated video game - it needs dedicated memory to process all the AI's "thinking." The more VRAM you have, the larger and more capable AI models you can run. + + +Let's first check how much VRAM your computer has. Don't worry if it's not much - DeepSeek R1 has versions for all kinds of computers! + +Finding your VRAM is simple: +- On Windows: Press `Windows + R`, type `dxdiag`, hit Enter, and look under the "Display" tab +- On Mac: Click the Apple menu, select "About This Mac", then "More Info", and check under "Graphics/Displays" +- On Linux: Open Terminal and type `nvidia-smi` for NVIDIA GPUs, or `lspci -v | grep -i vga` for other graphics cards + + +**No dedicated graphics card?** That's okay! You can still run the smaller versions of DeepSeek R1. They're specially optimized to work on computers with basic graphics capabilities. + + +Once you know your VRAM, here's what version of DeepSeek R1 will work best for you. If you have: +- 6GB VRAM: Go for the 1.5B version - it's fast and efficient +- 8GB VRAM: You can run the 7B or 8B versions, which offer great capabilities +- 16GB or more VRAM: You have access to the larger models with enhanced features + +Available versions and basic requirements for DeepSeek R1 distills: + +| Version | Model Link | Required VRAM | +|---------|------------|---------------| +| Qwen 1.5B | [DeepSeek-R1-Distill-Qwen-1.5B-GGUF](https://huggingface.co/bartowski/DeepSeek-R1-Distill-Qwen-1.5B-GGUF) | 6GB+ | +| Qwen 7B | [DeepSeek-R1-Distill-Qwen-7B-GGUF](https://huggingface.co/bartowski/DeepSeek-R1-Distill-Qwen-7B-GGUF) | 8GB+ | +| Llama 8B | [DeepSeek-R1-Distill-Llama-8B-GGUF](https://huggingface.co/unsloth/DeepSeek-R1-Distill-Llama-8B-GGUF) | 8GB+ | +| Qwen 14B | [DeepSeek-R1-Distill-Qwen-14B-GGUF](https://huggingface.co/bartowski/DeepSeek-R1-Distill-Qwen-14B-GGUF) | 16GB+ | +| Qwen 32B | [DeepSeek-R1-Distill-Qwen-32B-GGUF](https://huggingface.co/bartowski/DeepSeek-R1-Distill-Qwen-32B-GGUF) | 16GB+ | +| Llama 70B | [DeepSeek-R1-Distill-Llama-70B-GGUF](https://huggingface.co/unsloth/DeepSeek-R1-Distill-Llama-70B-GGUF) | 48GB+ | + +To download your chosen model: + +Launch Jan and navigate to Jan Hub using the sidebar + +![Jan AI interface, showing the model library](./_assets/jan-library-deepseek-r1.jpg) + +3. Input the model link in this field: + +![Jan AI interface, showing the model link input field](./_assets/jan-hub-deepseek-r1.jpg) + +## Step 3: Configure Model Settings +When configuring your model, you'll encounter quantization options: + + +Quantization balances performance and resource usage: +- **Q4:** Recommended for most users - optimal balance of efficiency and quality +- **Q8:** Higher precision but requires more computational resources + + +## Step 4: Configure Prompt Template +Final configuration step: + +1. Access Model Settings via the sidebar +2. Locate the Prompt Template configuration +3. Use this specific format: + + +``` +<|User|>{prompt}<|Assistant|> +``` + + +This template is for proper communication between you and the model. + +You're now ready to interact with DeepSeek R1: + +![Jan interface, showing DeepSeek R1 running locally](./_assets/jan-runs-deepseek-r1-distills.jpg) + +## Need Assistance? + + +Join our [Discord community](https://discord.gg/Exe46xPMbK) for support and discussions about running AI models locally. + diff --git a/docs/src/pages/post/offline-chatgpt-alternative.mdx b/docs/src/pages/post/offline-chatgpt-alternative.mdx new file mode 100644 index 000000000..d73bec712 --- /dev/null +++ b/docs/src/pages/post/offline-chatgpt-alternative.mdx @@ -0,0 +1,118 @@ +--- +title: "Offline ChatGPT: You can't run ChatGPT offline, do this instead" +description: "Learn how to use AI offline with Jan - a free, open-source alternative to ChatGPT that works 100% offline on your computer." +tags: AI, ChatGPT alternative, offline AI, Jan, local AI, privacy +categories: guides +date: 2025-02-08 +ogImage: _assets/offline-chatgpt-alternatives-jan.jpg +twitter: + card: summary_large_image + site: "@jandotai" + title: "Offline ChatGPT: You can't run ChatGPT offline, do this instead" + description: "Want to use ChatGPT offline? Learn how to run AI models locally with Jan - free, open-source, and works without internet." + image: _assets/offline-chatgpt-alternatives-jan.jpg +--- +import { Callout } from 'nextra/components' +import CTABlog from '@/components/Blog/CTA' + +# Offline ChatGPT: You can't run ChatGPT offline, do this instead + +ChatGPT is a cloud-based service that requires internet access. However, it's not the only way to use AI. You can run AI models offline on your device with [Jan](https://jan.ai/). It's completely free, open-source, and gives you 100% offline capability. You can even use AI on a plane! + + +**Quick Summary:** +- ChatGPT always needs internet - it can't run offline +- Jan lets you run AI models 100% offline on your computer +- It's free and open-source +- Works on Mac, Windows, and Linux + + +## Jan as an offline ChatGPT alternative + +![Use Jan to chat with AI models without internet access](./_assets/offline-chatgpt-alternative-ai-without-internet.jpg) +*Jan lets you use AI offline - no internet connection needed* + +Here's how to get started with offline AI in 3 simple steps: + +### 1. Download Jan + +Go to [jan.ai](https://jan.ai) and download the version for your computer (Mac, Windows, or Linux). It's completely free. + +![Download Jan for offline AI use](./_assets/jan.ai.jpg "Get Jan for free and start using AI offline") + +### 2. Download an AI model + +You'll need an AI model to use AI offline, so download a model from Jan. Once it's on your computer, you don't need internet anymore. + +![Choose an AI model that works offline](./_assets/jan-model-selection.jpg "Find the perfect AI model for offline use") +*Select an AI model that matches your needs and computer capabilities* + + +**Which model should you choose?** +- For most computers: Try Mistral 7B or DeepSeek - they're similar to ChatGPT 3.5 +- For older computers: Use smaller 3B models +- For gaming PCs: You can try larger 13B models + +Don't worry about choosing - Jan will automatically recommend models that work well on your computer. + + +### 3. Start using AI offline + +![Chat with AI offline using Jan's interface](./_assets/run-ai-locally-with-jan.jpg "Experience ChatGPT-like interactions without internet") +*Use Jan's clean interface to chat with AI - no internet required* + +Once downloaded, you can use AI anywhere, anytime: + +- Chat like you do with ChatGPT +- Work on documents offline +- Get coding help without internet +- Keep your conversations private +- Use AI even when servers are down + +## How to chat with your docs in Jan? + +To chat with your docs in Jan, you need to activate experimental mode. + +![Activate experimental mode in Jan's settings](./_assets/chat-with-your-docs-offline-ai.jpg "Enable experimental features to chat with your documents") +*Turn on experimental mode in settings to chat with your docs* + +After activating experimental mode, simply add your files and ask questions about them. + +![Chat with your documents using Jan](./_assets/chat-with-docs-prompt.jpg "Ask questions about your documents offline") +*Chat with your documents privately - no internet needed* + +I did this for you and got a reply from a 7B parameter model. If you'd like to learn what "7B" means and understand other local AI terms, check our [guide on running AI models locally](/post/run-ai-models-locally). + +A response from AI, Qwen2.5 7B Instruct Q4: + +`This document appears to be about the benefits and advantages of running artificial intelligence (AI) models locally on your device rather than using cloud-based or remote AI services. The key points it highlights include data privacy, offline functionality, freedom from paywalls and restrictions, and giving users full control over their AI models. Additionally, the text mentions that local AI is becoming a new trend and provides a link to a guide for beginners who want to learn more about this topic.` + +Local AI makes possible offline AI use, so Jan is going to be your first step to get started. + +## Why choose Jan over ChatGPT? + +1. **True Offline Use:** Unlike ChatGPT, Jan works without internet +2. **100% Private:** Your data never leaves your computer +3. **Free Forever:** No subscriptions or API costs +4. **No Server Issues:** No more "ChatGPT is at capacity" +5. **Your Choice of Models:** Use newer models as they come out + +**"Is it really free? What's the catch?"** +Yes, it's completely free and open source. Jan is built by developers who believe in making AI accessible to everyone. + +**"How does it compare to ChatGPT?"** +Modern open-source models like DeepSeek and Mistral are very capable. While they might not match GPT-4, they're perfect for most tasks and getting better every month. + +**"Do I need a powerful computer?"** +If your computer is from the last 5 years, it will likely work fine. You need about 8GB of RAM and 10GB of free space for comfortable usage. + +**"What about my privacy?"** +Everything stays on your computer. Your conversations, documents, and data never leave your device unless you choose to share them. + +Want to learn more about the technical side? Check our detailed [guide on running AI models locally](/post/run-ai-models-locally). It's not required to [use AI offline](https://jan.ai/) but helps understand how it all works. + +## Need help? + + +[Join our Discord community](https://discord.gg/Exe46xPMbK) for support and tips on using Jan as your offline ChatGPT alternative. + diff --git a/docs/src/pages/post/run-ai-models-locally.mdx b/docs/src/pages/post/run-ai-models-locally.mdx new file mode 100644 index 000000000..efe8bc594 --- /dev/null +++ b/docs/src/pages/post/run-ai-models-locally.mdx @@ -0,0 +1,225 @@ +--- +title: "How to run AI models locally as a beginner?" +description: "A straightforward guide to running AI models locally on your computer, regardless of your background." +tags: AI, local models, Jan, GGUF, privacy, local AI +categories: guides +date: 2025-01-31 +ogImage: assets/run-ai-locally-with-jan.jpg +twitter: + card: summary_large_image + site: "@jandotai" + title: "How to run AI models locally as a beginner?" + description: "Learn how to run AI models locally on your computer for enhanced privacy and control. Perfect for beginners!" + image: assets/run-ai-locally-with-jan.jpg +--- + +import { Callout } from 'nextra/components' +import CTABlog from '@/components/Blog/CTA' + +# How to run AI models locally as a beginner? + +Most people think running AI models locally is complicated. It's not. Anyone can run powerful AI models like DeepSeek, Llama, and Mistral on their own computer. This guide will show you how, even if you've never written a line of code. + +## Quick steps: +### 1. Download [Jan](https://jan.ai) + +![Jan AI's official website showing the download options](./_assets/jan.ai.jpg "Download Jan from the official website - it's free and open source") +*Download Jan from [jan.ai](https://jan.ai) - it's free and open source.* + +### 2. Choose a model that fits your hardware + +![Jan's model selection interface showing various AI models](./_assets/jan-model-selection.jpg "Jan helps you pick the right AI model for your computer") +*Jan helps you pick the right AI model for your computer.* + +### 3. Start using AI locally + +That's all to run your first AI model locally! + +![Jan's simple and clean chat interface for local AI](./_assets/run-ai-locally-with-jan.jpg "Jan's easy-to-use chat interface after installation") +*Jan's easy-to-use chat interface after installation.* + +Keep reading to learn key terms of local AI and the things you should know before running AI models locally. + +## How Local AI Works + +Before diving into the details, let's understand how AI runs on your computer: + + +**Why do we need special tools for local AI?** +Think of AI models like compressed files - they need to be "unpacked" to work on your computer. Tools like llama.cpp do this job: +- They make AI models run efficiently on regular computers +- Convert complex AI math into something your computer understands +- Help run large AI models even with limited resources + + +![llama.cpp GitHub repository showing its popularity and wide adoption](./_assets/ai-locally-llama.cpp.jpg "llama.cpp is widely used and trusted in the AI community") +*llama.cpp helps millions of people run AI locally on their computers.* + + +**What is GGUF and why do we need it?** + +Original AI models are huge and complex - like trying to read a book in a language your computer doesn't understand. Here's where GGUF comes in: + +1. **Problem it solves:** + - Original AI models are too big (100s of GB) + - They're designed for specialized AI computers + - They use too much memory + +2. **How GGUF helps:** + - Converts models to a smaller size + - Makes them work on regular computers + - Keeps the AI smart while using less memory + +When browsing models, you'll see "GGUF" in the name (like "DeepSeek-R1-GGUF"). Don't worry about finding them - Jan automatically shows you the right GGUF versions for your computer. + + +## Understanding AI Models + +Think of AI models like apps on your computer - some are light and quick to use, while others are bigger but can do more things. When you're choosing an AI model to run on your computer, you'll see names like "Llama-3-8B" or "Mistral-7B". Let's break down what this means in simple terms. + + +The "B" in model names (like 7B) stands for "billion" - it's just telling you the size of the AI model. Just like how some apps take up more space on your computer, bigger AI models need more space on your computer. + +- Smaller models (1-7B): Work great on most computers +- Bigger models (13B+): Need more powerful computers but can do more complex tasks + + +![Jan Hub interface showing model sizes and types](./_assets/jan-hub-for-ai-models.jpg "Jan Hub makes it easy to understand different model sizes and versions") +*Jan Hub makes it easy to understand different model sizes and versions* + +**Good news:** Jan helps you pick the right model size for your computer automatically! You don't need to worry about the technical details - just choose a model that matches what Jan recommends for your computer. + +## What You Can Do with Local AI + + +Running AI locally gives you: +- Complete privacy - your data stays on your computer +- No internet needed - works offline +- Full control - you decide what models to use +- Free to use - no subscription fees + + +## Hardware Requirements + +Before downloading an AI model, consider checking if your computer can run it. Here's a basic guide: + +**The basics your computer needs:** +- A decent processor (CPU) - most computers from the last 5 years will work fine +- At least 8GB of RAM - 16GB or more is better +- Some free storage space - at least 5GB recommended + +### What Models Can Your Computer Run? + +| | | | +|---|---|---| +| Regular Laptop | 3B-7B models | Good for chatting and writing. Like having a helpful assistant | +| Gaming Laptop | 7B-13B models | More capable. Better at complex tasks like coding and analysis | +| Powerful Desktop | 13B+ models | Better performance. Great for professional work and advanced tasks | + + +**Not Sure About Your Computer?** +Start with a smaller model (3B-7B) - Jan will help you choose one that works well on your system. + + +## Getting Started with Models + +### Model Versions + +When browsing models in Jan, you'll see terms like "Q4", "Q6", or "Q8". Here's what that means in simple terms: + + +These are different versions of the same AI model, just packaged differently to work better on different computers: + +- **Q4 versions**: Like a "lite" version of an app - runs fast and works on most computers +- **Q6 versions**: The "standard" version - good balance of speed and quality +- **Q8 versions**: The "premium" version - highest quality but needs a more powerful computer + + +**Pro tip**: Start with Q4 versions - they work great for most people and run smoothly on regular computers! + +### Getting Models from Hugging Face + +You'll often see links to "Hugging Face" when downloading AI models. Think of Hugging Face as the "GitHub for AI" - it's where the AI community shares their models. Jan makes it super easy to use: + +1. Jan has a built-in connection to Hugging Face +2. You can download models right from Jan's interface +3. No need to visit the Hugging Face website unless you want to explore more options + +## Setting up your local AI + +### Getting Models from Hugging Face + +You'll often see links to "Hugging Face" when downloading AI models. Think of Hugging Face as the "GitHub for AI" - it's where the AI community shares their models. This sounds technical, but Jan makes it super easy to use: + +1. Jan has a built-in connection to Hugging Face +2. You can download models right from Jan's interface +3. No need to visit the Hugging Face website unless you want to explore more options + + +**What powers local AI?** +Jan uses [llama.cpp](https://github.com/ggerganov/llama.cpp), an inference that makes AI models run efficiently on regular computers. It's like a translator that helps AI models speak your computer's language, making them run faster and use less memory. + + +### 1. Get Started +Download Jan from [jan.ai](https://jan.ai) - it sets everything up for you. + +### 2. Get an AI Model + +You can get models two ways: + +#### 1. Use Jan Hub (Recommended): + - Click "Download Model" in Jan + - Pick a recommended model + - Choose one that fits your computer + +![AI model parameters explained](./_assets/jan-model-download.jpg "Jan Hub makes it easy to download AI models") +*Use Jan Hub to download AI models* + +#### 2. Use Hugging Face: + + +Important: Only GGUF models will work with Jan. Make sure to use models that have "GGUF" in their name. + + +##### Step 1: Get the model link +Find and copy a GGUF model link from [Hugging Face](https://huggingface.co) + +![Finding a GGUF model on Hugging Face](./_assets/hugging-face-jan-model-download.jpg "Find GGUF models on Hugging Face") +*Look for models with "GGUF" in their name* + +##### Step 2: Open Jan +Launch Jan and go to the Models tab + +![Opening Jan's model section](./_assets/jan-library-deepseek-r1.jpg "Navigate to the Models section in Jan") +*Navigate to the Models section in Jan* + +##### Step 3: Add the model +Paste your Hugging Face link into Jan + +![Adding a model from Hugging Face](./_assets/jan-hub-deepseek-r1.jpg "Paste your GGUF model link here") +*Paste your GGUF model link here* + +##### Step 4: Download +Select your quantization and start the download + +![Downloading the model](./_assets/jan-hf-model-download.jpg "Choose your preferred model size and download") +*Choose your preferred model size and download* + +### Common Questions + +**"My computer doesn't have a graphics card - can I still use AI?"** + +Yes! It will run slower but still work. Start with 7B models. + +**"Which model should I start with?"** + +Try a 7B model first - it's the best balance of smart and fast. + +**"Will it slow down my computer?"** + +Only while you're using the AI. Close other big programs for better speed. + +## Need help? + +[Join our Discord community](https://discord.gg/Exe46xPMbK) for support. + \ No newline at end of file diff --git a/docs/src/utils/format.ts b/docs/src/utils/format.ts index 2e8aa428c..1ce858d59 100644 --- a/docs/src/utils/format.ts +++ b/docs/src/utils/format.ts @@ -1,20 +1,25 @@ export function formatCompactNumber(count: number) { - const formatter = Intl.NumberFormat('en', { notation: 'compact' }) + const formatter = Intl.NumberFormat('en', { notation: 'compact', maximumFractionDigits: 1 }) return formatter.format(count) } export const totalDownload = (release: []) => { if (release instanceof Array) { const count = release - .map((version: { assets: any[] }) => - version.assets.map((os) => os.download_count) - ) + .map((version: { assets: any[]; name: string }) => { + // it will be correct since 0.5.15 + const tag = version.name >= '0.5.15' && version.name.includes('0.5.15') + + return version.assets + .filter((os) => !(tag && os.name.endsWith('.yml'))) + .map((os) => os.download_count) + }) .map((x: any[]) => x.reduce((a: any, b: any) => a + b, 0)) .reduce((a: any, b: any) => a + b, 0) return formatCompactNumber(count) } else { - // return dummy avoid reate limit API when dev mode + // return dummy to avoid rate limit API when in dev mode return formatCompactNumber(9000000) } } diff --git a/docs/yarn.lock b/docs/yarn.lock index da90d4b6d..939bad483 100644 --- a/docs/yarn.lock +++ b/docs/yarn.lock @@ -4,48 +4,68 @@ "@adobe/css-tools@^4.4.0": version "4.4.1" - resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.4.1.tgz#2447a230bfe072c1659e6815129c03cf170710e3" + resolved "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.1.tgz" integrity sha512-12WGKBQzjUAI4ayyF4IAtfw2QR/IDoqk6jTddXDhtYTJF9ASmoE1zst7cVtP0aL/F1jUJL5r+JxKXKEgHNbEUQ== "@alloc/quick-lru@^5.2.0": version "5.2.0" - resolved "https://registry.yarnpkg.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz#7bf68b20c0a350f936915fcae06f58e32007ce30" + resolved "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz" integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw== "@babel/code-frame@^7.10.4": version "7.26.2" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.26.2.tgz#4b5fab97d33338eff916235055f0ebc21e573a85" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz" integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ== dependencies: "@babel/helper-validator-identifier" "^7.25.9" js-tokens "^4.0.0" picocolors "^1.0.0" +"@babel/helper-string-parser@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz" + integrity sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA== + "@babel/helper-validator-identifier@^7.25.9": version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz#24b64e2c3ec7cd3b3c547729b8d16871f22cbdc7" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz" integrity sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ== +"@babel/parser@^7.25.3": + version "7.26.9" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.26.9.tgz" + integrity sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A== + dependencies: + "@babel/types" "^7.26.9" + "@babel/runtime@^7.12.5", "@babel/runtime@^7.21.0", "@babel/runtime@^7.23.8": version "7.26.0" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.26.0.tgz#8600c2f595f277c60815256418b85356a65173c1" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz" integrity sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw== dependencies: regenerator-runtime "^0.14.0" +"@babel/types@^7.26.9": + version "7.26.9" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.26.9.tgz" + integrity sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw== + dependencies: + "@babel/helper-string-parser" "^7.25.9" + "@babel/helper-validator-identifier" "^7.25.9" + "@braintree/sanitize-url@^6.0.1": version "6.0.4" - resolved "https://registry.yarnpkg.com/@braintree/sanitize-url/-/sanitize-url-6.0.4.tgz#923ca57e173c6b232bbbb07347b1be982f03e783" + resolved "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-6.0.4.tgz" integrity sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A== "@code-hike/lighter@0.7.0": version "0.7.0" - resolved "https://registry.yarnpkg.com/@code-hike/lighter/-/lighter-0.7.0.tgz#7bb7d59631237d7d2e82434c3ea6fe1875813cb0" + resolved "https://registry.npmjs.org/@code-hike/lighter/-/lighter-0.7.0.tgz" integrity sha512-64O07rIORKQLB+5T/GKAmKcD9sC0N9yHFJXa0Hs+0Aee1G+I4bSXxTccuDFP6c/G/3h5Pk7yv7PoX9/SpzaeiQ== "@code-hike/mdx@^0.9.0": version "0.9.0" - resolved "https://registry.yarnpkg.com/@code-hike/mdx/-/mdx-0.9.0.tgz#fe592887dc91b46374d9f7c176eb07e65fd9e2e3" + resolved "https://registry.npmjs.org/@code-hike/mdx/-/mdx-0.9.0.tgz" integrity sha512-0wg68ZCjVWAkWT4gBUZJ8Mwktjen/XeWyqBQCrhA2IZSbZZnMYsEI6JJEFb/nZoNI3comB3JdxPLykZRq3qT2A== dependencies: "@code-hike/lighter" "0.7.0" @@ -53,7 +73,7 @@ "@codemirror/autocomplete@^6.0.0", "@codemirror/autocomplete@^6.12.0": version "6.18.4" - resolved "https://registry.yarnpkg.com/@codemirror/autocomplete/-/autocomplete-6.18.4.tgz#4394f55d6771727179f2e28a871ef46bbbeb11b1" + resolved "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.18.4.tgz" integrity sha512-sFAphGQIqyQZfP2ZBsSHV7xQvo9Py0rV0dW7W3IMRdS+zDuNb2l3no78CvUaWKGfzFjI4FTrLdUSj86IGb2hRA== dependencies: "@codemirror/language" "^6.0.0" @@ -63,7 +83,7 @@ "@codemirror/commands@^6.0.0", "@codemirror/commands@^6.3.3": version "6.7.1" - resolved "https://registry.yarnpkg.com/@codemirror/commands/-/commands-6.7.1.tgz#04561e95bc0779eaa49efd63e916c4efb3bbf6d6" + resolved "https://registry.npmjs.org/@codemirror/commands/-/commands-6.7.1.tgz" integrity sha512-llTrboQYw5H4THfhN4U3qCnSZ1SOJ60ohhz+SzU0ADGtwlc533DtklQP0vSFaQuCPDn3BPpOd1GbbnUtwNjsrw== dependencies: "@codemirror/language" "^6.0.0" @@ -73,7 +93,7 @@ "@codemirror/lang-css@^6.0.0", "@codemirror/lang-css@^6.2.1": version "6.3.1" - resolved "https://registry.yarnpkg.com/@codemirror/lang-css/-/lang-css-6.3.1.tgz#763ca41aee81bb2431be55e3cfcc7cc8e91421a3" + resolved "https://registry.npmjs.org/@codemirror/lang-css/-/lang-css-6.3.1.tgz" integrity sha512-kr5fwBGiGtmz6l0LSJIbno9QrifNMUusivHbnA1H6Dmqy4HZFte3UAICix1VuKo0lMPKQr2rqB+0BkKi/S3Ejg== dependencies: "@codemirror/autocomplete" "^6.0.0" @@ -84,7 +104,7 @@ "@codemirror/lang-html@^6.4.8": version "6.4.9" - resolved "https://registry.yarnpkg.com/@codemirror/lang-html/-/lang-html-6.4.9.tgz#d586f2cc9c341391ae07d1d7c545990dfa069727" + resolved "https://registry.npmjs.org/@codemirror/lang-html/-/lang-html-6.4.9.tgz" integrity sha512-aQv37pIMSlueybId/2PVSP6NPnmurFDVmZwzc7jszd2KAF8qd4VBbvNYPXWQq90WIARjsdVkPbw29pszmHws3Q== dependencies: "@codemirror/autocomplete" "^6.0.0" @@ -99,7 +119,7 @@ "@codemirror/lang-javascript@^6.0.0": version "6.2.2" - resolved "https://registry.yarnpkg.com/@codemirror/lang-javascript/-/lang-javascript-6.2.2.tgz#7141090b22994bef85bcc5608a3bc1257f2db2ad" + resolved "https://registry.npmjs.org/@codemirror/lang-javascript/-/lang-javascript-6.2.2.tgz" integrity sha512-VGQfY+FCc285AhWuwjYxQyUQcYurWlxdKYT4bqwr3Twnd5wP5WSeu52t4tvvuWmljT4EmgEgZCqSieokhtY8hg== dependencies: "@codemirror/autocomplete" "^6.0.0" @@ -112,7 +132,7 @@ "@codemirror/lang-json@^6.0.0": version "6.0.1" - resolved "https://registry.yarnpkg.com/@codemirror/lang-json/-/lang-json-6.0.1.tgz#0a0be701a5619c4b0f8991f9b5e95fe33f462330" + resolved "https://registry.npmjs.org/@codemirror/lang-json/-/lang-json-6.0.1.tgz" integrity sha512-+T1flHdgpqDDlJZ2Lkil/rLiRy684WMLc74xUnjJH48GQdfJo/pudlTRreZmKwzP8/tGdKf83wlbAdOCzlJOGQ== dependencies: "@codemirror/language" "^6.0.0" @@ -120,7 +140,7 @@ "@codemirror/lang-yaml@^6.0.0": version "6.1.2" - resolved "https://registry.yarnpkg.com/@codemirror/lang-yaml/-/lang-yaml-6.1.2.tgz#c84280c68fa7af456a355d91183b5e537e9b7038" + resolved "https://registry.npmjs.org/@codemirror/lang-yaml/-/lang-yaml-6.1.2.tgz" integrity sha512-dxrfG8w5Ce/QbT7YID7mWZFKhdhsaTNOYjOkSIMt1qmC4VQnXSDSYVHHHn8k6kJUfIhtLo8t1JJgltlxWdsITw== dependencies: "@codemirror/autocomplete" "^6.0.0" @@ -133,7 +153,7 @@ "@codemirror/language@^6.0.0", "@codemirror/language@^6.10.1", "@codemirror/language@^6.4.0", "@codemirror/language@^6.6.0": version "6.10.8" - resolved "https://registry.yarnpkg.com/@codemirror/language/-/language-6.10.8.tgz#3e3a346a2b0a8cf63ee1cfe03349eb1965dce5f9" + resolved "https://registry.npmjs.org/@codemirror/language/-/language-6.10.8.tgz" integrity sha512-wcP8XPPhDH2vTqf181U8MbZnW+tDyPYy0UzVOa+oHORjyT+mhhom9vBd7dApJwoDz9Nb/a8kHjJIsuA/t8vNFw== dependencies: "@codemirror/state" "^6.0.0" @@ -145,7 +165,7 @@ "@codemirror/lint@^6.0.0": version "6.8.4" - resolved "https://registry.yarnpkg.com/@codemirror/lint/-/lint-6.8.4.tgz#7d8aa5d1a6dec89ffcc23ad45ddca2e12e90982d" + resolved "https://registry.npmjs.org/@codemirror/lint/-/lint-6.8.4.tgz" integrity sha512-u4q7PnZlJUojeRe8FJa/njJcMctISGgPQ4PnWsd9268R4ZTtU+tfFYmwkBvgcrK2+QQ8tYFVALVb5fVJykKc5A== dependencies: "@codemirror/state" "^6.0.0" @@ -154,7 +174,7 @@ "@codemirror/search@^6.0.0": version "6.5.8" - resolved "https://registry.yarnpkg.com/@codemirror/search/-/search-6.5.8.tgz#b59b3659b46184cc75d6108d7c050a4ca344c3a0" + resolved "https://registry.npmjs.org/@codemirror/search/-/search-6.5.8.tgz" integrity sha512-PoWtZvo7c1XFeZWmmyaOp2G0XVbOnm+fJzvghqGAktBW3cufwJUWvSCcNG0ppXiBEM05mZu6RhMtXPv2hpllig== dependencies: "@codemirror/state" "^6.0.0" @@ -163,14 +183,14 @@ "@codemirror/state@^6.0.0", "@codemirror/state@^6.4.0", "@codemirror/state@^6.5.0": version "6.5.0" - resolved "https://registry.yarnpkg.com/@codemirror/state/-/state-6.5.0.tgz#e98dde85620618651543152fe1c2483300a0ccc9" + resolved "https://registry.npmjs.org/@codemirror/state/-/state-6.5.0.tgz" integrity sha512-MwBHVK60IiIHDcoMet78lxt6iw5gJOGSbNbOIVBHWVXIH4/Nq1+GQgLLGgI1KlnN86WDXsPudVaqYHKBIx7Eyw== dependencies: "@marijn/find-cluster-break" "^1.0.0" "@codemirror/view@^6.0.0", "@codemirror/view@^6.17.0", "@codemirror/view@^6.23.0", "@codemirror/view@^6.23.1", "@codemirror/view@^6.27.0", "@codemirror/view@^6.35.0": version "6.36.1" - resolved "https://registry.yarnpkg.com/@codemirror/view/-/view-6.36.1.tgz#3c543b8fd72c96b30c4b2b1464d1ebce7e0c5c4b" + resolved "https://registry.npmjs.org/@codemirror/view/-/view-6.36.1.tgz" integrity sha512-miD1nyT4m4uopZaDdO2uXU/LLHliKNYL9kB1C1wJHrunHLm/rpkb5QVSokqgw9hFqEZakrdlb/VGWX8aYZTslQ== dependencies: "@codemirror/state" "^6.5.0" @@ -179,146 +199,29 @@ "@corex/deepmerge@^4.0.43": version "4.0.43" - resolved "https://registry.yarnpkg.com/@corex/deepmerge/-/deepmerge-4.0.43.tgz#9bd42559ebb41cc5a7fb7cfeea5f231c20977dca" + resolved "https://registry.npmjs.org/@corex/deepmerge/-/deepmerge-4.0.43.tgz" integrity sha512-N8uEMrMPL0cu/bdboEWpQYb/0i2K5Qn8eCsxzOmxSggJbbQte7ljMRoXm917AbntqTGOzdTu+vP3KOOzoC70HQ== -"@emnapi/runtime@^1.2.0": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.3.1.tgz#0fcaa575afc31f455fd33534c19381cfce6c6f60" - integrity sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw== - dependencies: - tslib "^2.4.0" - -"@esbuild/aix-ppc64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f" - integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ== - -"@esbuild/android-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052" - integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A== - -"@esbuild/android-arm@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28" - integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg== - -"@esbuild/android-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e" - integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA== - "@esbuild/darwin-arm64@0.21.5": version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz#e495b539660e51690f3928af50a76fb0a6ccff2a" + resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz" integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ== -"@esbuild/darwin-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22" - integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw== - -"@esbuild/freebsd-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e" - integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g== - -"@esbuild/freebsd-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261" - integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ== - -"@esbuild/linux-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b" - integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q== - -"@esbuild/linux-arm@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9" - integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA== - -"@esbuild/linux-ia32@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2" - integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg== - -"@esbuild/linux-loong64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df" - integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg== - -"@esbuild/linux-mips64el@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe" - integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg== - -"@esbuild/linux-ppc64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4" - integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w== - -"@esbuild/linux-riscv64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc" - integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA== - -"@esbuild/linux-s390x@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de" - integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A== - -"@esbuild/linux-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0" - integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ== - -"@esbuild/netbsd-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047" - integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg== - -"@esbuild/openbsd-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70" - integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow== - -"@esbuild/sunos-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b" - integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg== - -"@esbuild/win32-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d" - integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A== - -"@esbuild/win32-ia32@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b" - integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA== - -"@esbuild/win32-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c" - integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw== - "@eslint-community/eslint-utils@^4.2.0": version "4.4.1" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz#d1145bf2c20132d6400495d6df4bf59362fd9d56" + resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz" integrity sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA== dependencies: eslint-visitor-keys "^3.4.3" "@eslint-community/regexpp@^4.6.1": version "4.12.1" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0" + resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz" integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ== "@eslint/eslintrc@^2.1.4": version "2.1.4" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" + resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz" integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== dependencies: ajv "^6.12.4" @@ -333,19 +236,19 @@ "@eslint/js@8.57.1": version "8.57.1" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.1.tgz#de633db3ec2ef6a3c89e2f19038063e8a122e2c2" + resolved "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz" integrity sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q== "@floating-ui/core@^1.6.0": version "1.6.8" - resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.6.8.tgz#aa43561be075815879305965020f492cdb43da12" + resolved "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.8.tgz" integrity sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA== dependencies: "@floating-ui/utils" "^0.2.8" "@floating-ui/dom@^1.0.0": version "1.6.12" - resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.6.12.tgz#6333dcb5a8ead3b2bf82f33d6bc410e95f54e556" + resolved "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.12.tgz" integrity sha512-NP83c0HjokcGVEMeoStg317VD9W7eDlGK7457dMBANbKA6GJZdc7rjujdgqzTaz93jkGgc5P/jeWbaCHnMNc+w== dependencies: "@floating-ui/core" "^1.6.0" @@ -353,19 +256,19 @@ "@floating-ui/react-dom@^2.0.0": version "2.1.2" - resolved "https://registry.yarnpkg.com/@floating-ui/react-dom/-/react-dom-2.1.2.tgz#a1349bbf6a0e5cb5ded55d023766f20a4d439a31" + resolved "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.2.tgz" integrity sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A== dependencies: "@floating-ui/dom" "^1.0.0" "@floating-ui/utils@^0.2.2", "@floating-ui/utils@^0.2.8": version "0.2.8" - resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.8.tgz#21a907684723bbbaa5f0974cf7730bd797eb8e62" + resolved "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.8.tgz" integrity sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig== "@floating-ui/vue@^1.0.2": version "1.1.5" - resolved "https://registry.yarnpkg.com/@floating-ui/vue/-/vue-1.1.5.tgz#dcbb5d7a2f9035b0c96a9c30cdf794977d360809" + resolved "https://registry.npmjs.org/@floating-ui/vue/-/vue-1.1.5.tgz" integrity sha512-ynL1p5Z+woPVSwgMGqeDrx6HrJfGIDzFyESFkyqJKilGW1+h/8yVY29Khn0LaU6wHBRwZ13ntG6reiHWK6jyzw== dependencies: "@floating-ui/dom" "^1.0.0" @@ -374,22 +277,22 @@ "@headlessui/react@^1.7.17": version "1.7.19" - resolved "https://registry.yarnpkg.com/@headlessui/react/-/react-1.7.19.tgz#91c78cf5fcb254f4a0ebe96936d48421caf75f40" + resolved "https://registry.npmjs.org/@headlessui/react/-/react-1.7.19.tgz" integrity sha512-Ll+8q3OlMJfJbAKM/+/Y2q6PPYbryqNTXDbryx7SXLIDamkF6iQFbriYHga0dY44PvDhvvBWCx1Xj4U5+G4hOw== dependencies: "@tanstack/react-virtual" "^3.0.0-beta.60" client-only "^0.0.1" -"@headlessui/vue@^1.7.20": +"@headlessui/vue@^1.7.0", "@headlessui/vue@^1.7.20": version "1.7.23" - resolved "https://registry.yarnpkg.com/@headlessui/vue/-/vue-1.7.23.tgz#7fe19dbeca35de9e6270c82c78c4864e6a6f7391" + resolved "https://registry.npmjs.org/@headlessui/vue/-/vue-1.7.23.tgz" integrity sha512-JzdCNqurrtuu0YW6QaDtR2PIYCKPUWq28csDyMvN4zmGccmE7lz40Is6hc3LA4HFeCI7sekZ/PQMTNmn9I/4Wg== dependencies: "@tanstack/vue-virtual" "^3.0.0-beta.60" "@humanwhocodes/config-array@^0.13.0": version "0.13.0" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.13.0.tgz#fb907624df3256d04b9aa2df50d7aa97ec648748" + resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz" integrity sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw== dependencies: "@humanwhocodes/object-schema" "^2.0.3" @@ -398,140 +301,39 @@ "@humanwhocodes/module-importer@^1.0.1": version "1.0.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== "@humanwhocodes/momoa@^3.0.1": version "3.3.5" - resolved "https://registry.yarnpkg.com/@humanwhocodes/momoa/-/momoa-3.3.5.tgz#7d3915eb6f1ffb8ab030bac2814810f0253112d4" + resolved "https://registry.npmjs.org/@humanwhocodes/momoa/-/momoa-3.3.5.tgz" integrity sha512-NI9codbQNjw9g4SS/cOizi8JDZ93B3oGVko8M3y0XF3gITaGDSQqea35V8fswWehnRQBLxPfZY5TJnuNhNCEzA== "@humanwhocodes/object-schema@^2.0.3": version "2.0.3" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" + resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz" integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== "@img/sharp-darwin-arm64@0.33.5": version "0.33.5" - resolved "https://registry.yarnpkg.com/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz#ef5b5a07862805f1e8145a377c8ba6e98813ca08" + resolved "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz" integrity sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ== optionalDependencies: "@img/sharp-libvips-darwin-arm64" "1.0.4" -"@img/sharp-darwin-x64@0.33.5": - version "0.33.5" - resolved "https://registry.yarnpkg.com/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz#e03d3451cd9e664faa72948cc70a403ea4063d61" - integrity sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q== - optionalDependencies: - "@img/sharp-libvips-darwin-x64" "1.0.4" - "@img/sharp-libvips-darwin-arm64@1.0.4": version "1.0.4" - resolved "https://registry.yarnpkg.com/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz#447c5026700c01a993c7804eb8af5f6e9868c07f" + resolved "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz" integrity sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg== -"@img/sharp-libvips-darwin-x64@1.0.4": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz#e0456f8f7c623f9dbfbdc77383caa72281d86062" - integrity sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ== - -"@img/sharp-libvips-linux-arm64@1.0.4": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz#979b1c66c9a91f7ff2893556ef267f90ebe51704" - integrity sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA== - -"@img/sharp-libvips-linux-arm@1.0.5": - version "1.0.5" - resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz#99f922d4e15216ec205dcb6891b721bfd2884197" - integrity sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g== - -"@img/sharp-libvips-linux-s390x@1.0.4": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz#f8a5eb1f374a082f72b3f45e2fb25b8118a8a5ce" - integrity sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA== - -"@img/sharp-libvips-linux-x64@1.0.4": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz#d4c4619cdd157774906e15770ee119931c7ef5e0" - integrity sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw== - -"@img/sharp-libvips-linuxmusl-arm64@1.0.4": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz#166778da0f48dd2bded1fa3033cee6b588f0d5d5" - integrity sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA== - -"@img/sharp-libvips-linuxmusl-x64@1.0.4": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz#93794e4d7720b077fcad3e02982f2f1c246751ff" - integrity sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw== - -"@img/sharp-linux-arm64@0.33.5": - version "0.33.5" - resolved "https://registry.yarnpkg.com/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz#edb0697e7a8279c9fc829a60fc35644c4839bb22" - integrity sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA== - optionalDependencies: - "@img/sharp-libvips-linux-arm64" "1.0.4" - -"@img/sharp-linux-arm@0.33.5": - version "0.33.5" - resolved "https://registry.yarnpkg.com/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz#422c1a352e7b5832842577dc51602bcd5b6f5eff" - integrity sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ== - optionalDependencies: - "@img/sharp-libvips-linux-arm" "1.0.5" - -"@img/sharp-linux-s390x@0.33.5": - version "0.33.5" - resolved "https://registry.yarnpkg.com/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz#f5c077926b48e97e4a04d004dfaf175972059667" - integrity sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q== - optionalDependencies: - "@img/sharp-libvips-linux-s390x" "1.0.4" - -"@img/sharp-linux-x64@0.33.5": - version "0.33.5" - resolved "https://registry.yarnpkg.com/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz#d806e0afd71ae6775cc87f0da8f2d03a7c2209cb" - integrity sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA== - optionalDependencies: - "@img/sharp-libvips-linux-x64" "1.0.4" - -"@img/sharp-linuxmusl-arm64@0.33.5": - version "0.33.5" - resolved "https://registry.yarnpkg.com/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz#252975b915894fb315af5deea174651e208d3d6b" - integrity sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g== - optionalDependencies: - "@img/sharp-libvips-linuxmusl-arm64" "1.0.4" - -"@img/sharp-linuxmusl-x64@0.33.5": - version "0.33.5" - resolved "https://registry.yarnpkg.com/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz#3f4609ac5d8ef8ec7dadee80b560961a60fd4f48" - integrity sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw== - optionalDependencies: - "@img/sharp-libvips-linuxmusl-x64" "1.0.4" - -"@img/sharp-wasm32@0.33.5": - version "0.33.5" - resolved "https://registry.yarnpkg.com/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz#6f44f3283069d935bb5ca5813153572f3e6f61a1" - integrity sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg== - dependencies: - "@emnapi/runtime" "^1.2.0" - -"@img/sharp-win32-ia32@0.33.5": - version "0.33.5" - resolved "https://registry.yarnpkg.com/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz#1a0c839a40c5351e9885628c85f2e5dfd02b52a9" - integrity sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ== - -"@img/sharp-win32-x64@0.33.5": - version "0.33.5" - resolved "https://registry.yarnpkg.com/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz#56f00962ff0c4e0eb93d34a047d29fa995e3e342" - integrity sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg== - "@inquirer/figures@^1.0.3": version "1.0.9" - resolved "https://registry.yarnpkg.com/@inquirer/figures/-/figures-1.0.9.tgz#9d8128f8274cde4ca009ca8547337cab3f37a4a3" + resolved "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.9.tgz" integrity sha512-BXvGj0ehzrngHTPTDqUoDT3NXL8U0RxUk2zJm2A66RhCEIWdtU1v6GuUqNAgArW4PQ9CinqIWyHdQgdwOj06zQ== "@isaacs/cliui@^8.0.2": version "8.0.2" - resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + resolved "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz" integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== dependencies: string-width "^5.1.2" @@ -543,7 +345,7 @@ "@jridgewell/gen-mapping@^0.3.2": version "0.3.8" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz#4f0e06362e01362f823d348f1872b08f666d8142" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz" integrity sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA== dependencies: "@jridgewell/set-array" "^1.2.1" @@ -552,22 +354,22 @@ "@jridgewell/resolve-uri@^3.1.0": version "3.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz" integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== "@jridgewell/set-array@^1.2.1": version "1.2.1" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz" integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== -"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0": version "1.5.0" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz" integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== "@jridgewell/trace-mapping@^0.3.24": version "0.3.25" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz" integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== dependencies: "@jridgewell/resolve-uri" "^3.1.0" @@ -575,12 +377,12 @@ "@lezer/common@^1.0.0", "@lezer/common@^1.0.2", "@lezer/common@^1.1.0", "@lezer/common@^1.2.0", "@lezer/common@^1.2.1": version "1.2.3" - resolved "https://registry.yarnpkg.com/@lezer/common/-/common-1.2.3.tgz#138fcddab157d83da557554851017c6c1e5667fd" + resolved "https://registry.npmjs.org/@lezer/common/-/common-1.2.3.tgz" integrity sha512-w7ojc8ejBqr2REPsWxJjrMFsA/ysDCFICn8zEOR9mrqzOu2amhITYuLD8ag6XZf0CFXDrhKqw7+tW8cX66NaDA== "@lezer/css@^1.1.0", "@lezer/css@^1.1.7": version "1.1.9" - resolved "https://registry.yarnpkg.com/@lezer/css/-/css-1.1.9.tgz#404563d361422c5a1fe917295f1527ee94845ed1" + resolved "https://registry.npmjs.org/@lezer/css/-/css-1.1.9.tgz" integrity sha512-TYwgljcDv+YrV0MZFFvYFQHCfGgbPMR6nuqLabBdmZoFH3EP1gvw8t0vae326Ne3PszQkbXfVBjCnf3ZVCr0bA== dependencies: "@lezer/common" "^1.2.0" @@ -589,14 +391,14 @@ "@lezer/highlight@^1.0.0", "@lezer/highlight@^1.1.3", "@lezer/highlight@^1.2.0": version "1.2.1" - resolved "https://registry.yarnpkg.com/@lezer/highlight/-/highlight-1.2.1.tgz#596fa8f9aeb58a608be0a563e960c373cbf23f8b" + resolved "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.2.1.tgz" integrity sha512-Z5duk4RN/3zuVO7Jq0pGLJ3qynpxUVsh7IbUbGj88+uV2ApSAn6kWg2au3iJb+0Zi7kKtqffIESgNcRXWZWmSA== dependencies: "@lezer/common" "^1.0.0" "@lezer/html@^1.3.0": version "1.3.10" - resolved "https://registry.yarnpkg.com/@lezer/html/-/html-1.3.10.tgz#1be9a029a6fe835c823b20a98a449a630416b2af" + resolved "https://registry.npmjs.org/@lezer/html/-/html-1.3.10.tgz" integrity sha512-dqpT8nISx/p9Do3AchvYGV3qYc4/rKr3IBZxlHmpIKam56P47RSHkSF5f13Vu9hebS1jM0HmtJIwLbWz1VIY6w== dependencies: "@lezer/common" "^1.2.0" @@ -605,7 +407,7 @@ "@lezer/javascript@^1.0.0": version "1.4.21" - resolved "https://registry.yarnpkg.com/@lezer/javascript/-/javascript-1.4.21.tgz#8ebf7d1f891c70e3d00864f5a03ac42c75d19492" + resolved "https://registry.npmjs.org/@lezer/javascript/-/javascript-1.4.21.tgz" integrity sha512-lL+1fcuxWYPURMM/oFZLEDm0XuLN128QPV+VuGtKpeaOGdcl9F2LYC3nh1S9LkPqx9M0mndZFdXCipNAZpzIkQ== dependencies: "@lezer/common" "^1.2.0" @@ -614,7 +416,7 @@ "@lezer/json@^1.0.0": version "1.0.3" - resolved "https://registry.yarnpkg.com/@lezer/json/-/json-1.0.3.tgz#e773a012ad0088fbf07ce49cfba875cc9e5bc05f" + resolved "https://registry.npmjs.org/@lezer/json/-/json-1.0.3.tgz" integrity sha512-BP9KzdF9Y35PDpv04r0VeSTKDeox5vVr3efE7eBbx3r4s3oNLfunchejZhjArmeieBH+nVOpgIiBJpEAv8ilqQ== dependencies: "@lezer/common" "^1.2.0" @@ -623,14 +425,14 @@ "@lezer/lr@^1.0.0", "@lezer/lr@^1.3.0", "@lezer/lr@^1.4.0": version "1.4.2" - resolved "https://registry.yarnpkg.com/@lezer/lr/-/lr-1.4.2.tgz#931ea3dea8e9de84e90781001dae30dea9ff1727" + resolved "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.2.tgz" integrity sha512-pu0K1jCIdnQ12aWNaAVU5bzi7Bd1w54J3ECgANPmYLtQKP0HBj2cE/5coBD66MT10xbtIuUr7tg0Shbsvk0mDA== dependencies: "@lezer/common" "^1.0.0" "@lezer/yaml@^1.0.0": version "1.0.3" - resolved "https://registry.yarnpkg.com/@lezer/yaml/-/yaml-1.0.3.tgz#b23770ab42b390056da6b187d861b998fd60b1ff" + resolved "https://registry.npmjs.org/@lezer/yaml/-/yaml-1.0.3.tgz" integrity sha512-GuBLekbw9jDBDhGur82nuwkxKQ+a3W5H0GfaAthDXcAu+XdpS43VlnxA9E9hllkpSP5ellRDKjLLj7Lu9Wr6xA== dependencies: "@lezer/common" "^1.2.0" @@ -639,12 +441,12 @@ "@marijn/find-cluster-break@^1.0.0": version "1.0.2" - resolved "https://registry.yarnpkg.com/@marijn/find-cluster-break/-/find-cluster-break-1.0.2.tgz#775374306116d51c0c500b8c4face0f9a04752d8" + resolved "https://registry.npmjs.org/@marijn/find-cluster-break/-/find-cluster-break-1.0.2.tgz" integrity sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g== "@mdx-js/mdx@^2.2.1", "@mdx-js/mdx@^2.3.0": version "2.3.0" - resolved "https://registry.yarnpkg.com/@mdx-js/mdx/-/mdx-2.3.0.tgz#d65d8c3c28f3f46bb0e7cb3bf7613b39980671a9" + resolved "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-2.3.0.tgz" integrity sha512-jLuwRlz8DQfQNiUCJR50Y09CGPq3fLtmtUQfVrj79E0JWu3dvsVcxVIcfhR5h0iXu+/z++zDrYeiJqifRynJkA== dependencies: "@types/estree-jsx" "^1.0.0" @@ -667,85 +469,20 @@ "@mdx-js/react@^2.2.1", "@mdx-js/react@^2.3.0": version "2.3.0" - resolved "https://registry.yarnpkg.com/@mdx-js/react/-/react-2.3.0.tgz#4208bd6d70f0d0831def28ef28c26149b03180b3" + resolved "https://registry.npmjs.org/@mdx-js/react/-/react-2.3.0.tgz" integrity sha512-zQH//gdOmuu7nt2oJR29vFhDv88oGPmVw6BggmrHeMI+xgEkp1B2dX9/bMBSYtK0dyLX/aOmesKS09g222K1/g== dependencies: "@types/mdx" "^2.0.0" "@types/react" ">=16" -"@napi-rs/simple-git-android-arm-eabi@0.1.19": - version "0.1.19" - resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-android-arm-eabi/-/simple-git-android-arm-eabi-0.1.19.tgz#72e1b33dd0e8af86f5443f69c35da66ef217e1f6" - integrity sha512-XryEH/hadZ4Duk/HS/HC/cA1j0RHmqUGey3MsCf65ZS0VrWMqChXM/xlTPWuY5jfCc/rPubHaqI7DZlbexnX/g== - -"@napi-rs/simple-git-android-arm64@0.1.19": - version "0.1.19" - resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-android-arm64/-/simple-git-android-arm64-0.1.19.tgz#71d0b228a1504a8576f75731af88c39a03769666" - integrity sha512-ZQ0cPvY6nV9p7zrR9ZPo7hQBkDAcY/CHj3BjYNhykeUCiSNCrhvwX+WEeg5on8M1j4d5jcI/cwVG2FslfiByUg== - "@napi-rs/simple-git-darwin-arm64@0.1.19": version "0.1.19" - resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-darwin-arm64/-/simple-git-darwin-arm64-0.1.19.tgz#5e5eb5a6311a17d785b942b9a2179dc7cc6f225b" + resolved "https://registry.npmjs.org/@napi-rs/simple-git-darwin-arm64/-/simple-git-darwin-arm64-0.1.19.tgz" integrity sha512-viZB5TYgjA1vH+QluhxZo0WKro3xBA+1xSzYx8mcxUMO5gnAoUMwXn0ZO/6Zy6pai+aGae+cj6XihGnrBRu3Pg== -"@napi-rs/simple-git-darwin-x64@0.1.19": - version "0.1.19" - resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-darwin-x64/-/simple-git-darwin-x64-0.1.19.tgz#70d60c842618f45c30d338901ab540954b31da7e" - integrity sha512-6dNkzSNUV5X9rsVYQbpZLyJu4Gtkl2vNJ3abBXHX/Etk0ILG5ZasO3ncznIANZQpqcbn/QPHr49J2QYAXGoKJA== - -"@napi-rs/simple-git-freebsd-x64@0.1.19": - version "0.1.19" - resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-freebsd-x64/-/simple-git-freebsd-x64-0.1.19.tgz#d9015fd46e98e68d8126d4de16247697b8121b0d" - integrity sha512-sB9krVIchzd20FjI2ZZ8FDsTSsXLBdnwJ6CpeVyrhXHnoszfcqxt49ocZHujAS9lMpXq7i2Nv1EXJmCy4KdhwA== - -"@napi-rs/simple-git-linux-arm-gnueabihf@0.1.19": - version "0.1.19" - resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-linux-arm-gnueabihf/-/simple-git-linux-arm-gnueabihf-0.1.19.tgz#a4e7b2cd9303fe42683b68ee1532f807a510c61e" - integrity sha512-6HPn09lr9N1n5/XKfP8Np53g4fEXVxOFqNkS6rTH3Rm1lZHdazTRH62RggXLTguZwjcE+MvOLvoTIoR5kAS8+g== - -"@napi-rs/simple-git-linux-arm64-gnu@0.1.19": - version "0.1.19" - resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-linux-arm64-gnu/-/simple-git-linux-arm64-gnu-0.1.19.tgz#e45cb392d4ec6c0477df62519ac98a8dd6096f58" - integrity sha512-G0gISckt4cVDp3oh5Z6PV3GHJrJO6Z8bIS+9xA7vTtKdqB1i5y0n3cSFLlzQciLzhr+CajFD27doW4lEyErQ/Q== - -"@napi-rs/simple-git-linux-arm64-musl@0.1.19": - version "0.1.19" - resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-linux-arm64-musl/-/simple-git-linux-arm64-musl-0.1.19.tgz#bbf53497f86b2bbfc20953b8c5757ed763cf7809" - integrity sha512-OwTRF+H4IZYxmDFRi1IrLMfqbdIpvHeYbJl2X94NVsLVOY+3NUHvEzL3fYaVx5urBaMnIK0DD3wZLbcueWvxbA== - -"@napi-rs/simple-git-linux-powerpc64le-gnu@0.1.19": - version "0.1.19" - resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-linux-powerpc64le-gnu/-/simple-git-linux-powerpc64le-gnu-0.1.19.tgz#fbb4c0ce7233893e8104f53ee55c983e128859e2" - integrity sha512-p7zuNNVyzpRvkCt2RIGv9FX/WPcPbZ6/FRUgUTZkA2WU33mrbvNqSi4AOqCCl6mBvEd+EOw5NU4lS9ORRJvAEg== - -"@napi-rs/simple-git-linux-s390x-gnu@0.1.19": - version "0.1.19" - resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-linux-s390x-gnu/-/simple-git-linux-s390x-gnu-0.1.19.tgz#d90518049b8971643195c70c731bf8d42331a06a" - integrity sha512-6N2vwJUPLiak8GLrS0a3is0gSb0UwI2CHOOqtvQxPmv+JVI8kn3vKiUscsktdDb0wGEPeZ8PvZs0y8UWix7K4g== - -"@napi-rs/simple-git-linux-x64-gnu@0.1.19": - version "0.1.19" - resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-linux-x64-gnu/-/simple-git-linux-x64-gnu-0.1.19.tgz#fddf74194550f13906e8f197f63b83dd83ac000e" - integrity sha512-61YfeO1J13WK7MalLgP3QlV6of2rWnVw1aqxWkAgy/lGxoOFSJ4Wid6ANVCEZk4tJpPX/XNeneqkUz5xpeb2Cw== - -"@napi-rs/simple-git-linux-x64-musl@0.1.19": - version "0.1.19" - resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-linux-x64-musl/-/simple-git-linux-x64-musl-0.1.19.tgz#b7eb604511e5f8f49d4f3bb560045d5f535bdd9e" - integrity sha512-cCTWNpMJnN3PrUBItWcs3dQKCydsIasbrS3laMzq8k7OzF93Zrp2LWDTPlLCO9brbBVpBzy2Qk5Xg9uAfe/Ukw== - -"@napi-rs/simple-git-win32-arm64-msvc@0.1.19": - version "0.1.19" - resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-win32-arm64-msvc/-/simple-git-win32-arm64-msvc-0.1.19.tgz#5f3bee37a3414944fa8181b532e07d9a6ef978ea" - integrity sha512-sWavb1BjeLKKBA+PbTsRSSzVNfb7V/dOpaJvkgR5d2kWFn/AHmCZHSSj/3nyZdYf0BdDC+DIvqk3daAEZ6QMVw== - -"@napi-rs/simple-git-win32-x64-msvc@0.1.19": - version "0.1.19" - resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-win32-x64-msvc/-/simple-git-win32-x64-msvc-0.1.19.tgz#86dde2db46f89304c9fa08c7362ad58fa3dd28a4" - integrity sha512-FmNuPoK4+qwaSCkp8lm3sJlrxk374enW+zCE5ZksXlZzj/9BDJAULJb5QUJ7o9Y8A/G+d8LkdQLPBE2Jaxe5XA== - "@napi-rs/simple-git@^0.1.9": version "0.1.19" - resolved "https://registry.yarnpkg.com/@napi-rs/simple-git/-/simple-git-0.1.19.tgz#0de76924ea9c3daf1d8e10aaa830c37b6143d472" + resolved "https://registry.npmjs.org/@napi-rs/simple-git/-/simple-git-0.1.19.tgz" integrity sha512-jMxvwzkKzd3cXo2EB9GM2ic0eYo2rP/BS6gJt6HnWbsDO1O8GSD4k7o2Cpr2YERtMpGF/MGcDfsfj2EbQPtrXw== optionalDependencies: "@napi-rs/simple-git-android-arm-eabi" "0.1.19" @@ -763,91 +500,51 @@ "@napi-rs/simple-git-win32-arm64-msvc" "0.1.19" "@napi-rs/simple-git-win32-x64-msvc" "0.1.19" -"@next/env@14.2.22": - version "14.2.22" - resolved "https://registry.yarnpkg.com/@next/env/-/env-14.2.22.tgz#8898ae47595badbfacebfc1585f42a4e06a97301" - integrity sha512-EQ6y1QeNQglNmNIXvwP/Bb+lf7n9WtgcWvtoFsHquVLCJUuxRs+6SfZ5EK0/EqkkLex4RrDySvKgKNN7PXip7Q== - "@next/env@^13.4.3": version "13.5.8" - resolved "https://registry.yarnpkg.com/@next/env/-/env-13.5.8.tgz#404d3b3e5881b6a0510500c6cc97e3589a2e6371" + resolved "https://registry.npmjs.org/@next/env/-/env-13.5.8.tgz" integrity sha512-YmiG58BqyZ2FjrF2+5uZExL2BrLr8RTQzLXNDJ8pJr0O+rPlOeDPXp1p1/4OrR3avDidzZo3D8QO2cuDv1KCkw== +"@next/env@14.2.22": + version "14.2.22" + resolved "https://registry.npmjs.org/@next/env/-/env-14.2.22.tgz" + integrity sha512-EQ6y1QeNQglNmNIXvwP/Bb+lf7n9WtgcWvtoFsHquVLCJUuxRs+6SfZ5EK0/EqkkLex4RrDySvKgKNN7PXip7Q== + "@next/eslint-plugin-next@14.1.4": version "14.1.4" - resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-14.1.4.tgz#d7372b5ffede0e466af8af2ff534386418827fc8" + resolved "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.1.4.tgz" integrity sha512-n4zYNLSyCo0Ln5b7qxqQeQ34OZKXwgbdcx6kmkQbywr+0k6M3Vinft0T72R6CDAcDrne2IAgSud4uWCzFgc5HA== dependencies: glob "10.3.10" "@next/swc-darwin-arm64@14.2.22": version "14.2.22" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.22.tgz#2b3fcb42247ba951b19a48fc03f1d6fe65629baa" + resolved "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.22.tgz" integrity sha512-HUaLiehovgnqY4TMBZJ3pDaOsTE1spIXeR10pWgdQVPYqDGQmHJBj3h3V6yC0uuo/RoY2GC0YBFRkOX3dI9WVQ== -"@next/swc-darwin-x64@14.2.22": - version "14.2.22" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.22.tgz#11ecc609e9530b3edf8ddfd1fd3bd6aca4e1bfda" - integrity sha512-ApVDANousaAGrosWvxoGdLT0uvLBUC+srqOcpXuyfglA40cP2LBFaGmBjhgpxYk5z4xmunzqQvcIgXawTzo2uQ== - -"@next/swc-linux-arm64-gnu@14.2.22": - version "14.2.22" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.22.tgz#4c08dd223e50c348f561af2285e27fb326ffabbf" - integrity sha512-3O2J99Bk9aM+d4CGn9eEayJXHuH9QLx0BctvWyuUGtJ3/mH6lkfAPRI4FidmHMBQBB4UcvLMfNf8vF0NZT7iKw== - -"@next/swc-linux-arm64-musl@14.2.22": - version "14.2.22" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.22.tgz#0b285336f145887d421b3762f3d7c75f847ec1b3" - integrity sha512-H/hqfRz75yy60y5Eg7DxYfbmHMjv60Dsa6IWHzpJSz4MRkZNy5eDnEW9wyts9bkxwbOVZNPHeb3NkqanP+nGPg== - -"@next/swc-linux-x64-gnu@14.2.22": - version "14.2.22" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.22.tgz#a936b6cfea0364571102f0389c6368d6acf3e294" - integrity sha512-LckLwlCLcGR1hlI5eiJymR8zSHPsuruuwaZ3H2uudr25+Dpzo6cRFjp/3OR5UYJt8LSwlXv9mmY4oI2QynwpqQ== - -"@next/swc-linux-x64-musl@14.2.22": - version "14.2.22" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.22.tgz#0359497840d0b7d8c095d0d9735bc6aec68cef5d" - integrity sha512-qGUutzmh0PoFU0fCSu0XYpOfT7ydBZgDfcETIeft46abPqP+dmePhwRGLhFKwZWxNWQCPprH26TjaTxM0Nv8mw== - -"@next/swc-win32-arm64-msvc@14.2.22": - version "14.2.22" - resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.22.tgz#9fd249d49ffccf3388400ab24472c432cdd04c24" - integrity sha512-K6MwucMWmIvMb9GlvT0haYsfIPxfQD8yXqxwFy4uLFMeXIb2TcVYQimxkaFZv86I7sn1NOZnpOaVk5eaxThGIw== - -"@next/swc-win32-ia32-msvc@14.2.22": - version "14.2.22" - resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.22.tgz#70d8d5a48e78c7382c3e0544af28c2788ca6b551" - integrity sha512-5IhDDTPEbzPR31ZzqHe90LnNe7BlJUZvC4sA1thPJV6oN5WmtWjZ0bOYfNsyZx00FJt7gggNs6SrsX0UEIcIpA== - -"@next/swc-win32-x64-msvc@14.2.22": - version "14.2.22" - resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.22.tgz#b034f544c1346093a235f6bba46497a1ba344fc1" - integrity sha512-nvRaB1PyG4scn9/qNzlkwEwLzuoPH3Gjp7Q/pLuwUgOTt1oPMlnCI3A3rgkt+eZnU71emOiEv/mR201HoURPGg== - "@next/third-parties@^14.1.4": version "14.2.22" - resolved "https://registry.yarnpkg.com/@next/third-parties/-/third-parties-14.2.22.tgz#481c9a10f1601fecb40cfdf113547354ddac0401" + resolved "https://registry.npmjs.org/@next/third-parties/-/third-parties-14.2.22.tgz" integrity sha512-DDa1uhvLE+bz0OUUK1Xk4m4yduo3yVKvXyjywiLeApX8EpwyF4dfKrM7DLKIgYJyN2At5Eg+lJR68MY4sa/rgw== dependencies: third-party-capital "1.0.20" "@nodelib/fs.scandir@2.1.5": version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== dependencies: "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": +"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== "@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== dependencies: "@nodelib/fs.scandir" "2.1.5" @@ -855,77 +552,17 @@ "@nolyfill/is-core-module@1.0.39": version "1.0.39" - resolved "https://registry.yarnpkg.com/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz#3dc35ba0f1e66b403c00b39344f870298ebb1c8e" + resolved "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz" integrity sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA== -"@parcel/watcher-android-arm64@2.5.0": - version "2.5.0" - resolved "https://registry.yarnpkg.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.0.tgz#e32d3dda6647791ee930556aee206fcd5ea0fb7a" - integrity sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ== - "@parcel/watcher-darwin-arm64@2.5.0": version "2.5.0" - resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.0.tgz#0d9e680b7e9ec1c8f54944f1b945aa8755afb12f" + resolved "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.0.tgz" integrity sha512-hyZ3TANnzGfLpRA2s/4U1kbw2ZI4qGxaRJbBH2DCSREFfubMswheh8TeiC1sGZ3z2jUf3s37P0BBlrD3sjVTUw== -"@parcel/watcher-darwin-x64@2.5.0": - version "2.5.0" - resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.0.tgz#f9f1d5ce9d5878d344f14ef1856b7a830c59d1bb" - integrity sha512-9rhlwd78saKf18fT869/poydQK8YqlU26TMiNg7AIu7eBp9adqbJZqmdFOsbZ5cnLp5XvRo9wcFmNHgHdWaGYA== - -"@parcel/watcher-freebsd-x64@2.5.0": - version "2.5.0" - resolved "https://registry.yarnpkg.com/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.0.tgz#2b77f0c82d19e84ff4c21de6da7f7d096b1a7e82" - integrity sha512-syvfhZzyM8kErg3VF0xpV8dixJ+RzbUaaGaeb7uDuz0D3FK97/mZ5AJQ3XNnDsXX7KkFNtyQyFrXZzQIcN49Tw== - -"@parcel/watcher-linux-arm-glibc@2.5.0": - version "2.5.0" - resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.0.tgz#92ed322c56dbafa3d2545dcf2803334aee131e42" - integrity sha512-0VQY1K35DQET3dVYWpOaPFecqOT9dbuCfzjxoQyif1Wc574t3kOSkKevULddcR9znz1TcklCE7Ht6NIxjvTqLA== - -"@parcel/watcher-linux-arm-musl@2.5.0": - version "2.5.0" - resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.0.tgz#cd48e9bfde0cdbbd2ecd9accfc52967e22f849a4" - integrity sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA== - -"@parcel/watcher-linux-arm64-glibc@2.5.0": - version "2.5.0" - resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.0.tgz#7b81f6d5a442bb89fbabaf6c13573e94a46feb03" - integrity sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA== - -"@parcel/watcher-linux-arm64-musl@2.5.0": - version "2.5.0" - resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.0.tgz#dcb8ff01077cdf59a18d9e0a4dff7a0cfe5fd732" - integrity sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q== - -"@parcel/watcher-linux-x64-glibc@2.5.0": - version "2.5.0" - resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.0.tgz#2e254600fda4e32d83942384d1106e1eed84494d" - integrity sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw== - -"@parcel/watcher-linux-x64-musl@2.5.0": - version "2.5.0" - resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.0.tgz#01fcea60fedbb3225af808d3f0a7b11229792eef" - integrity sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA== - -"@parcel/watcher-win32-arm64@2.5.0": - version "2.5.0" - resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.0.tgz#87cdb16e0783e770197e52fb1dc027bb0c847154" - integrity sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig== - -"@parcel/watcher-win32-ia32@2.5.0": - version "2.5.0" - resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.0.tgz#778c39b56da33e045ba21c678c31a9f9d7c6b220" - integrity sha512-+rgpsNRKwo8A53elqbbHXdOMtY/tAtTzManTWShB5Kk54N8Q9mzNWV7tV+IbGueCbcj826MfWGU3mprWtuf1TA== - -"@parcel/watcher-win32-x64@2.5.0": - version "2.5.0" - resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.0.tgz#33873876d0bbc588aacce38e90d1d7480ce81cb7" - integrity sha512-lPrxve92zEHdgeff3aiu4gDOIt4u7sJYha6wbdEZDCDUhtjTsOMiaJzG5lMY4GkWH8p0fMmO2Ppq5G5XXG+DQw== - "@parcel/watcher@^2.4.1": version "2.5.0" - resolved "https://registry.yarnpkg.com/@parcel/watcher/-/watcher-2.5.0.tgz#5c88818b12b8de4307a9d3e6dc3e28eba0dfbd10" + resolved "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.0.tgz" integrity sha512-i0GV1yJnm2n3Yq1qw6QrUrd/LI9bE8WEBOTtOkpCXHHdyN3TAGgqAK/DAT05z4fq2x04cARXt2pDmjWjL92iTQ== dependencies: detect-libc "^1.0.3" @@ -949,39 +586,39 @@ "@pkgjs/parseargs@^0.11.0": version "0.11.0" - resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + resolved "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz" integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== "@popperjs/core@^2.11.8": version "2.11.8" - resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.8.tgz#6b79032e760a0899cd4204710beede972a3a185f" + resolved "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz" integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A== "@radix-ui/primitive@1.1.1": version "1.1.1" - resolved "https://registry.yarnpkg.com/@radix-ui/primitive/-/primitive-1.1.1.tgz#fc169732d755c7fbad33ba8d0cd7fd10c90dc8e3" + resolved "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.1.tgz" integrity sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA== "@radix-ui/react-arrow@1.1.1": version "1.1.1" - resolved "https://registry.yarnpkg.com/@radix-ui/react-arrow/-/react-arrow-1.1.1.tgz#2103721933a8bfc6e53bbfbdc1aaad5fc8ba0dd7" + resolved "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.1.tgz" integrity sha512-NaVpZfmv8SKeZbn4ijN2V3jlHA9ngBG16VnIIm22nUR0Yk8KUALyBxT3KYEUnNuch9sTE8UTsS3whzBgKOL30w== dependencies: "@radix-ui/react-primitive" "2.0.1" "@radix-ui/react-compose-refs@1.1.1": version "1.1.1" - resolved "https://registry.yarnpkg.com/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.1.tgz#6f766faa975f8738269ebb8a23bad4f5a8d2faec" + resolved "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.1.tgz" integrity sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw== "@radix-ui/react-context@1.1.1": version "1.1.1" - resolved "https://registry.yarnpkg.com/@radix-ui/react-context/-/react-context-1.1.1.tgz#82074aa83a472353bb22e86f11bcbd1c61c4c71a" + resolved "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.1.tgz" integrity sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q== "@radix-ui/react-dialog@^1.0.5": version "1.1.4" - resolved "https://registry.yarnpkg.com/@radix-ui/react-dialog/-/react-dialog-1.1.4.tgz#d68e977acfcc0d044b9dab47b6dd2c179d2b3191" + resolved "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.4.tgz" integrity sha512-Ur7EV1IwQGCyaAuyDRiOLA5JIUZxELJljF+MbM/2NC0BYwfuRrbpS30BiQBJrVruscgUkieKkqXYDOoByaxIoA== dependencies: "@radix-ui/primitive" "1.1.1" @@ -1001,7 +638,7 @@ "@radix-ui/react-dismissable-layer@1.1.3": version "1.1.3" - resolved "https://registry.yarnpkg.com/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.3.tgz#4ee0f0f82d53bf5bd9db21665799bb0d1bad5ed8" + resolved "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.3.tgz" integrity sha512-onrWn/72lQoEucDmJnr8uczSNTujT0vJnA/X5+3AkChVPowr8n1yvIKIabhWyMQeMvvmdpsvcyDqx3X1LEXCPg== dependencies: "@radix-ui/primitive" "1.1.1" @@ -1012,12 +649,12 @@ "@radix-ui/react-focus-guards@1.1.1": version "1.1.1" - resolved "https://registry.yarnpkg.com/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.1.tgz#8635edd346304f8b42cae86b05912b61aef27afe" + resolved "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.1.tgz" integrity sha512-pSIwfrT1a6sIoDASCSpFwOasEwKTZWDw/iBdtnqKO7v6FeOzYJ7U53cPzYFVR3geGGXgVHaH+CdngrrAzqUGxg== "@radix-ui/react-focus-scope@1.1.1": version "1.1.1" - resolved "https://registry.yarnpkg.com/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.1.tgz#5c602115d1db1c4fcfa0fae4c3b09bb8919853cb" + resolved "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.1.tgz" integrity sha512-01omzJAYRxXdG2/he/+xy+c8a8gCydoQ1yOxnWNcRhrrBW5W+RQJ22EK1SaO8tb3WoUsuEw7mJjBozPzihDFjA== dependencies: "@radix-ui/react-compose-refs" "1.1.1" @@ -1026,19 +663,19 @@ "@radix-ui/react-icons@^1.3.0": version "1.3.2" - resolved "https://registry.yarnpkg.com/@radix-ui/react-icons/-/react-icons-1.3.2.tgz#09be63d178262181aeca5fb7f7bc944b10a7f441" + resolved "https://registry.npmjs.org/@radix-ui/react-icons/-/react-icons-1.3.2.tgz" integrity sha512-fyQIhGDhzfc9pK2kH6Pl9c4BDJGfMkPqkyIgYDthyNYoNg3wVhoJMMh19WS4Up/1KMPFVpNsT2q3WmXn2N1m6g== "@radix-ui/react-id@1.1.0": version "1.1.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-id/-/react-id-1.1.0.tgz#de47339656594ad722eb87f94a6b25f9cffae0ed" + resolved "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.0.tgz" integrity sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA== dependencies: "@radix-ui/react-use-layout-effect" "1.1.0" "@radix-ui/react-popper@1.2.1": version "1.2.1" - resolved "https://registry.yarnpkg.com/@radix-ui/react-popper/-/react-popper-1.2.1.tgz#2fc66cfc34f95f00d858924e3bee54beae2dff0a" + resolved "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.1.tgz" integrity sha512-3kn5Me69L+jv82EKRuQCXdYyf1DqHwD2U/sxoNgBGCB7K9TRc3bQamQ+5EPM9EvyPdli0W41sROd+ZU1dTCztw== dependencies: "@floating-ui/react-dom" "^2.0.0" @@ -1054,7 +691,7 @@ "@radix-ui/react-portal@1.1.3": version "1.1.3" - resolved "https://registry.yarnpkg.com/@radix-ui/react-portal/-/react-portal-1.1.3.tgz#b0ea5141103a1671b715481b13440763d2ac4440" + resolved "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.3.tgz" integrity sha512-NciRqhXnGojhT93RPyDaMPfLH3ZSl4jjIFbZQ1b/vxvZEdHsBZ49wP9w8L3HzUQwep01LcWtkUvm0OVB5JAHTw== dependencies: "@radix-ui/react-primitive" "2.0.1" @@ -1062,7 +699,7 @@ "@radix-ui/react-presence@1.1.2": version "1.1.2" - resolved "https://registry.yarnpkg.com/@radix-ui/react-presence/-/react-presence-1.1.2.tgz#bb764ed8a9118b7ec4512da5ece306ded8703cdc" + resolved "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.2.tgz" integrity sha512-18TFr80t5EVgL9x1SwF/YGtfG+l0BS0PRAlCWBDoBEiDQjeKgnNZRVJp/oVBl24sr3Gbfwc/Qpj4OcWTQMsAEg== dependencies: "@radix-ui/react-compose-refs" "1.1.1" @@ -1070,21 +707,21 @@ "@radix-ui/react-primitive@2.0.1": version "2.0.1" - resolved "https://registry.yarnpkg.com/@radix-ui/react-primitive/-/react-primitive-2.0.1.tgz#6d9efc550f7520135366f333d1e820cf225fad9e" + resolved "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.1.tgz" integrity sha512-sHCWTtxwNn3L3fH8qAfnF3WbUZycW93SM1j3NFDzXBiz8D6F5UTTy8G1+WFEaiCdvCVRJWj6N2R4Xq6HdiHmDg== dependencies: "@radix-ui/react-slot" "1.1.1" "@radix-ui/react-slot@1.1.1": version "1.1.1" - resolved "https://registry.yarnpkg.com/@radix-ui/react-slot/-/react-slot-1.1.1.tgz#ab9a0ffae4027db7dc2af503c223c978706affc3" + resolved "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.1.tgz" integrity sha512-RApLLOcINYJA+dMVbOju7MYv1Mb2EBp2nH4HdDzXTSyaR5optlm6Otrz1euW3HbdOR8UmmFK06TD+A9frYWv+g== dependencies: "@radix-ui/react-compose-refs" "1.1.1" "@radix-ui/react-tooltip@^1.0.7": version "1.1.6" - resolved "https://registry.yarnpkg.com/@radix-ui/react-tooltip/-/react-tooltip-1.1.6.tgz#eab98e9a5c876ef0abfae3cfeee229870528ed06" + resolved "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.1.6.tgz" integrity sha512-TLB5D8QLExS1uDn7+wH/bjEmRurNMTzNrtq7IjaS4kjion9NtzsTGkvR5+i7yc9q01Pi2KMM2cN3f8UG4IvvXA== dependencies: "@radix-ui/primitive" "1.1.1" @@ -1102,167 +739,77 @@ "@radix-ui/react-use-callback-ref@1.1.0": version "1.1.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz#bce938ca413675bc937944b0d01ef6f4a6dc5bf1" + resolved "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz" integrity sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw== "@radix-ui/react-use-controllable-state@1.1.0": version "1.1.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz#1321446857bb786917df54c0d4d084877aab04b0" + resolved "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz" integrity sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw== dependencies: "@radix-ui/react-use-callback-ref" "1.1.0" "@radix-ui/react-use-escape-keydown@1.1.0": version "1.1.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.0.tgz#31a5b87c3b726504b74e05dac1edce7437b98754" + resolved "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.0.tgz" integrity sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw== dependencies: "@radix-ui/react-use-callback-ref" "1.1.0" "@radix-ui/react-use-layout-effect@1.1.0": version "1.1.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz#3c2c8ce04827b26a39e442ff4888d9212268bd27" + resolved "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz" integrity sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w== "@radix-ui/react-use-rect@1.1.0": version "1.1.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-use-rect/-/react-use-rect-1.1.0.tgz#13b25b913bd3e3987cc9b073a1a164bb1cf47b88" + resolved "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.0.tgz" integrity sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ== dependencies: "@radix-ui/rect" "1.1.0" "@radix-ui/react-use-size@1.1.0": version "1.1.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-use-size/-/react-use-size-1.1.0.tgz#b4dba7fbd3882ee09e8d2a44a3eed3a7e555246b" + resolved "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.0.tgz" integrity sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw== dependencies: "@radix-ui/react-use-layout-effect" "1.1.0" "@radix-ui/react-visually-hidden@1.1.1": version "1.1.1" - resolved "https://registry.yarnpkg.com/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.1.1.tgz#f7b48c1af50dfdc366e92726aee6d591996c5752" + resolved "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.1.1.tgz" integrity sha512-vVfA2IZ9q/J+gEamvj761Oq1FpWgCDaNOOIfbPVp2MVPLEomUr5+Vf7kJGwQ24YxZSlQVar7Bes8kyTo5Dshpg== dependencies: "@radix-ui/react-primitive" "2.0.1" "@radix-ui/rect@1.1.0": version "1.1.0" - resolved "https://registry.yarnpkg.com/@radix-ui/rect/-/rect-1.1.0.tgz#f817d1d3265ac5415dadc67edab30ae196696438" + resolved "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.0.tgz" integrity sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg== "@replit/codemirror-css-color-picker@^6.1.0": version "6.3.0" - resolved "https://registry.yarnpkg.com/@replit/codemirror-css-color-picker/-/codemirror-css-color-picker-6.3.0.tgz#069835261d2b7b7ff5cb5f3ce354253d6e7e1100" + resolved "https://registry.npmjs.org/@replit/codemirror-css-color-picker/-/codemirror-css-color-picker-6.3.0.tgz" integrity sha512-19biDANghUm7Fz7L1SNMIhK48tagaWuCOHj4oPPxc7hxPGkTVY2lU/jVZ8tsbTKQPVG7BO2CBDzs7CBwb20t4A== -"@rollup/rollup-android-arm-eabi@4.29.1": - version "4.29.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.29.1.tgz#9bd38df6a29afb7f0336d988bc8112af0c8816c0" - integrity sha512-ssKhA8RNltTZLpG6/QNkCSge+7mBQGUqJRisZ2MDQcEGaK93QESEgWK2iOpIDZ7k9zPVkG5AS3ksvD5ZWxmItw== - -"@rollup/rollup-android-arm64@4.29.1": - version "4.29.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.29.1.tgz#bd1a98390e15b76eeef907175a37c5f0f9e4d214" - integrity sha512-CaRfrV0cd+NIIcVVN/jx+hVLN+VRqnuzLRmfmlzpOzB87ajixsN/+9L5xNmkaUUvEbI5BmIKS+XTwXsHEb65Ew== - "@rollup/rollup-darwin-arm64@4.29.1": version "4.29.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.29.1.tgz#bc6fa8a2cc77b5f367424e5e994e3537524e6879" + resolved "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.29.1.tgz" integrity sha512-2ORr7T31Y0Mnk6qNuwtyNmy14MunTAMx06VAPI6/Ju52W10zk1i7i5U3vlDRWjhOI5quBcrvhkCHyF76bI7kEw== -"@rollup/rollup-darwin-x64@4.29.1": - version "4.29.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.29.1.tgz#76059c91f06b17406347b127df10f065283b2e61" - integrity sha512-j/Ej1oanzPjmN0tirRd5K2/nncAhS9W6ICzgxV+9Y5ZsP0hiGhHJXZ2JQ53iSSjj8m6cRY6oB1GMzNn2EUt6Ng== - -"@rollup/rollup-freebsd-arm64@4.29.1": - version "4.29.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.29.1.tgz#83178315c0be4b4c8c1fd835e1952d2dc1eb4e6e" - integrity sha512-91C//G6Dm/cv724tpt7nTyP+JdN12iqeXGFM1SqnljCmi5yTXriH7B1r8AD9dAZByHpKAumqP1Qy2vVNIdLZqw== - -"@rollup/rollup-freebsd-x64@4.29.1": - version "4.29.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.29.1.tgz#1ef24fa0576bf7899a0a0a649156606dbd7a0d46" - integrity sha512-hEioiEQ9Dec2nIRoeHUP6hr1PSkXzQaCUyqBDQ9I9ik4gCXQZjJMIVzoNLBRGet+hIUb3CISMh9KXuCcWVW/8w== - -"@rollup/rollup-linux-arm-gnueabihf@4.29.1": - version "4.29.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.29.1.tgz#443a6f5681bf4611caae42988994a6d8ee676216" - integrity sha512-Py5vFd5HWYN9zxBv3WMrLAXY3yYJ6Q/aVERoeUFwiDGiMOWsMs7FokXihSOaT/PMWUty/Pj60XDQndK3eAfE6A== - -"@rollup/rollup-linux-arm-musleabihf@4.29.1": - version "4.29.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.29.1.tgz#9738b27184102228637a683e5f35b22ea352394f" - integrity sha512-RiWpGgbayf7LUcuSNIbahr0ys2YnEERD4gYdISA06wa0i8RALrnzflh9Wxii7zQJEB2/Eh74dX4y/sHKLWp5uQ== - -"@rollup/rollup-linux-arm64-gnu@4.29.1": - version "4.29.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.29.1.tgz#b5e9d5e30ff36a19bedd29c715ba18a1889ff269" - integrity sha512-Z80O+taYxTQITWMjm/YqNoe9d10OX6kDh8X5/rFCMuPqsKsSyDilvfg+vd3iXIqtfmp+cnfL1UrYirkaF8SBZA== - -"@rollup/rollup-linux-arm64-musl@4.29.1": - version "4.29.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.29.1.tgz#1d8f68f0829b57f746ec03432ad046f1af014a98" - integrity sha512-fOHRtF9gahwJk3QVp01a/GqS4hBEZCV1oKglVVq13kcK3NeVlS4BwIFzOHDbmKzt3i0OuHG4zfRP0YoG5OF/rA== - -"@rollup/rollup-linux-loongarch64-gnu@4.29.1": - version "4.29.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.29.1.tgz#07027feb883408e74a3002c8e50caaedd288ae38" - integrity sha512-5a7q3tnlbcg0OodyxcAdrrCxFi0DgXJSoOuidFUzHZ2GixZXQs6Tc3CHmlvqKAmOs5eRde+JJxeIf9DonkmYkw== - -"@rollup/rollup-linux-powerpc64le-gnu@4.29.1": - version "4.29.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.29.1.tgz#544ce1b0847a9c1240425e86f33daceac7ec4e12" - integrity sha512-9b4Mg5Yfz6mRnlSPIdROcfw1BU22FQxmfjlp/CShWwO3LilKQuMISMTtAu/bxmmrE6A902W2cZJuzx8+gJ8e9w== - -"@rollup/rollup-linux-riscv64-gnu@4.29.1": - version "4.29.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.29.1.tgz#64be13d51852ec1e2dfbd25d997ed5f42f35ea6d" - integrity sha512-G5pn0NChlbRM8OJWpJFMX4/i8OEU538uiSv0P6roZcbpe/WfhEO+AT8SHVKfp8qhDQzaz7Q+1/ixMy7hBRidnQ== - -"@rollup/rollup-linux-s390x-gnu@4.29.1": - version "4.29.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.29.1.tgz#31f51e1e05c6264552d03875d9e2e673f0fd86e3" - integrity sha512-WM9lIkNdkhVwiArmLxFXpWndFGuOka4oJOZh8EP3Vb8q5lzdSCBuhjavJsw68Q9AKDGeOOIHYzYm4ZFvmWez5g== - -"@rollup/rollup-linux-x64-gnu@4.29.1": - version "4.29.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.29.1.tgz#f4c95b26f4ad69ebdb64b42f0ae4da2a0f617958" - integrity sha512-87xYCwb0cPGZFoGiErT1eDcssByaLX4fc0z2nRM6eMtV9njAfEE6OW3UniAoDhX4Iq5xQVpE6qO9aJbCFumKYQ== - -"@rollup/rollup-linux-x64-musl@4.29.1": - version "4.29.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.29.1.tgz#ab7be89192f72beb9ea6e2386186fefde4f69d82" - integrity sha512-xufkSNppNOdVRCEC4WKvlR1FBDyqCSCpQeMMgv9ZyXqqtKBfkw1yfGMTUTs9Qsl6WQbJnsGboWCp7pJGkeMhKA== - -"@rollup/rollup-win32-arm64-msvc@4.29.1": - version "4.29.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.29.1.tgz#7f12efb8240b238346951559998802722944421e" - integrity sha512-F2OiJ42m77lSkizZQLuC+jiZ2cgueWQL5YC9tjo3AgaEw+KJmVxHGSyQfDUoYR9cci0lAywv2Clmckzulcq6ig== - -"@rollup/rollup-win32-ia32-msvc@4.29.1": - version "4.29.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.29.1.tgz#353d14d6eee943004d129796e4feddd3aa260921" - integrity sha512-rYRe5S0FcjlOBZQHgbTKNrqxCBUmgDJem/VQTCcTnA2KCabYSWQDrytOzX7avb79cAAweNmMUb/Zw18RNd4mng== - -"@rollup/rollup-win32-x64-msvc@4.29.1": - version "4.29.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.29.1.tgz#c82f04a09ba481e13857d6f2516e072aaa51b7f4" - integrity sha512-+10CMg9vt1MoHj6x1pxyjPSMjHTIlqs8/tBztXvPAx24SKs9jwVnKqHJumlH/IzhaPUaj3T6T6wfZr8okdXaIg== - "@rtsao/scc@^1.1.0": version "1.1.0" - resolved "https://registry.yarnpkg.com/@rtsao/scc/-/scc-1.1.0.tgz#927dd2fae9bc3361403ac2c7a00c32ddce9ad7e8" + resolved "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz" integrity sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g== "@rushstack/eslint-patch@^1.3.3": version "1.10.4" - resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.10.4.tgz#427d5549943a9c6fce808e39ea64dbe60d4047f1" + resolved "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.4.tgz" integrity sha512-WJgX9nzTqknM393q1QJDJmoW28kUfEnybeTfVNcNAPnIx210RXm2DiXiHzfNPJNIUUb1tJnz/l4QGtJ30PgWmA== "@scalar/api-client@1.2.39": version "1.2.39" - resolved "https://registry.yarnpkg.com/@scalar/api-client/-/api-client-1.2.39.tgz#49bf83b4093f2b6e7b7ae4f259249c22f0d4e4df" + resolved "https://registry.npmjs.org/@scalar/api-client/-/api-client-1.2.39.tgz" integrity sha512-2+XZ3ifIqjwmKiZot7hMJ38urbb/N2rd+8qqY3pqOAenI/pYIRaTfsOVut1LTRK60oPNl2APqd3ei7K1B5zmrg== dependencies: "@floating-ui/vue" "^1.0.2" @@ -1283,14 +830,14 @@ "@scalar/api-reference-react@^0.1.31": version "0.1.98" - resolved "https://registry.yarnpkg.com/@scalar/api-reference-react/-/api-reference-react-0.1.98.tgz#d5427bb98bdcf6b0ee8dcd2892891da2e4a43a97" + resolved "https://registry.npmjs.org/@scalar/api-reference-react/-/api-reference-react-0.1.98.tgz" integrity sha512-XGw0CBxmSRPhUpvAKC2xMzL4ulhJL9F3thCCELnBMIFyEx5F43T714RE4ks/uijyDurF7AiW86u6Jud4R7v9kg== dependencies: "@scalar/api-reference" "1.22.56" "@scalar/api-reference@1.22.56": version "1.22.56" - resolved "https://registry.yarnpkg.com/@scalar/api-reference/-/api-reference-1.22.56.tgz#e6a4e0c41ed0fb65c20a8bfb1f57749cbef130b4" + resolved "https://registry.npmjs.org/@scalar/api-reference/-/api-reference-1.22.56.tgz" integrity sha512-UZll5kOW9i7g2oAGnQc2XR1kzf+vtSlLt9clErH5yTRGSASuzuOD2HWxhavu+7EhGzAgJcat6NYY3LI9voCOsw== dependencies: "@headlessui/vue" "^1.7.20" @@ -1327,7 +874,7 @@ "@scalar/components@0.8.0": version "0.8.0" - resolved "https://registry.yarnpkg.com/@scalar/components/-/components-0.8.0.tgz#f5d0ec36f33527ccb8e8dff5be09a61d76574b95" + resolved "https://registry.npmjs.org/@scalar/components/-/components-0.8.0.tgz" integrity sha512-n2qgwoSiFF0ZlTqqXbSwiVBy5Zvm8e8XL6gdB6ZikPVuhK0Ci9SVMalqOrJMaP9YvYSasecNKFMU6Zr9dgWjKQ== dependencies: "@floating-ui/utils" "^0.2.2" @@ -1343,14 +890,14 @@ "@scalar/oas-utils@0.1.16": version "0.1.16" - resolved "https://registry.yarnpkg.com/@scalar/oas-utils/-/oas-utils-0.1.16.tgz#fd20d9a9689522ce3c15c5b7f952b4c42c503f72" + resolved "https://registry.npmjs.org/@scalar/oas-utils/-/oas-utils-0.1.16.tgz" integrity sha512-zEKm81WJdBiTXoNVB5oB6L3XOEdiJIxj3pVfDYDrtGVObp5vV+iZh+f0O0HdnUt4TxpyXxLWW6iVnrxAOle9fA== dependencies: yaml "^2.4.1" "@scalar/openapi-parser@^0.3.2": version "0.3.2" - resolved "https://registry.yarnpkg.com/@scalar/openapi-parser/-/openapi-parser-0.3.2.tgz#9a3d38f14ae5a0d607a43960d88396de4b171926" + resolved "https://registry.npmjs.org/@scalar/openapi-parser/-/openapi-parser-0.3.2.tgz" integrity sha512-o38wF1rKqCc7R0zFMta5rPTiY4cWwVcZPJkV1OCcnPsF2eE79uPkhYU2j/kdocJXVwMqqAe9a6+0o4R8YjgPVw== dependencies: "@humanwhocodes/momoa" "^3.0.1" @@ -1367,49 +914,49 @@ "@scalar/snippetz-core@0.1.4": version "0.1.4" - resolved "https://registry.yarnpkg.com/@scalar/snippetz-core/-/snippetz-core-0.1.4.tgz#4e93b90d592bc65ee9ea871db7bb83816bbba562" + resolved "https://registry.npmjs.org/@scalar/snippetz-core/-/snippetz-core-0.1.4.tgz" integrity sha512-NMnDzl5dHgUj0k8ZtfssDfy6wv1wO/M+GhpdGr/4OH3m8UZB27CZ3hM7wXh+fm75hZO5XIBsANW20kJVnzpaHg== dependencies: "@types/har-format" "^1.2.15" "@scalar/snippetz-plugin-js-fetch@0.1.1": version "0.1.1" - resolved "https://registry.yarnpkg.com/@scalar/snippetz-plugin-js-fetch/-/snippetz-plugin-js-fetch-0.1.1.tgz#061794bf577313c6cb7a347eb14d980a9f5fd53f" + resolved "https://registry.npmjs.org/@scalar/snippetz-plugin-js-fetch/-/snippetz-plugin-js-fetch-0.1.1.tgz" integrity sha512-9ODfi0OaEvZHdCe09c91eH1R5QPynL+FPxtYuK/9K5ElRE2NqxYysri9AsgOhr1Fqhpy5qKzDj4Gi5FHsJSGXw== dependencies: "@scalar/snippetz-core" "0.1.4" "@scalar/snippetz-plugin-js-ofetch@^0.1.1": version "0.1.1" - resolved "https://registry.yarnpkg.com/@scalar/snippetz-plugin-js-ofetch/-/snippetz-plugin-js-ofetch-0.1.1.tgz#4d8ae6e32c36f2e101fb8a0dfd7be2c38a5809d5" + resolved "https://registry.npmjs.org/@scalar/snippetz-plugin-js-ofetch/-/snippetz-plugin-js-ofetch-0.1.1.tgz" integrity sha512-fPIJlY4q1j5gbnsYSxix0IJ7hqcvm8Ly7iVoK66vaL738AIMiGZMhGKtLrTVPad77PimwO+jeq5iDIZ495UY7Q== dependencies: "@scalar/snippetz-core" "0.1.4" "@scalar/snippetz-plugin-node-fetch@0.1.2": version "0.1.2" - resolved "https://registry.yarnpkg.com/@scalar/snippetz-plugin-node-fetch/-/snippetz-plugin-node-fetch-0.1.2.tgz#f15ebcf55c916e8ba8951204c4093e00cd54e569" + resolved "https://registry.npmjs.org/@scalar/snippetz-plugin-node-fetch/-/snippetz-plugin-node-fetch-0.1.2.tgz" integrity sha512-kD6erA6aAqjHkj+JrJQKqrqcH4fnCrLi2uYw16CmELIGtqVHFau7ew2c087y4OQTltdi5rEk2zj5zOBu9yaS3Q== dependencies: "@scalar/snippetz-core" "0.1.4" "@scalar/snippetz-plugin-node-ofetch@^0.1.1": version "0.1.1" - resolved "https://registry.yarnpkg.com/@scalar/snippetz-plugin-node-ofetch/-/snippetz-plugin-node-ofetch-0.1.1.tgz#ab849f1bd5b289da5b35f00982a7f3866d021f26" + resolved "https://registry.npmjs.org/@scalar/snippetz-plugin-node-ofetch/-/snippetz-plugin-node-ofetch-0.1.1.tgz" integrity sha512-9NpvdMKebg82FkVWoWyOxd1JXAB8KNxmrsFFwQKNjhAw0A5hjNR5oW9lD+FtB1Laupg2FNtw9dcCydnF+LcCWw== dependencies: "@scalar/snippetz-core" "0.1.4" "@scalar/snippetz-plugin-node-undici@0.1.6": version "0.1.6" - resolved "https://registry.yarnpkg.com/@scalar/snippetz-plugin-node-undici/-/snippetz-plugin-node-undici-0.1.6.tgz#2b8b3502fb7c388005c5c5d850300f591865c24c" + resolved "https://registry.npmjs.org/@scalar/snippetz-plugin-node-undici/-/snippetz-plugin-node-undici-0.1.6.tgz" integrity sha512-CivUl7wgZ6vlUb01FMdqOt/NVyOWqT0iHZRp5YlPp1pflXZLnAyi5antUTtBEUHUtHM2EO/WR7vx4kRsPcrgLg== dependencies: "@scalar/snippetz-core" "0.1.4" "@scalar/snippetz@^0.1.6": version "0.1.6" - resolved "https://registry.yarnpkg.com/@scalar/snippetz/-/snippetz-0.1.6.tgz#f7fa34c49c921637d7a2823b7b5fd779152f126e" + resolved "https://registry.npmjs.org/@scalar/snippetz/-/snippetz-0.1.6.tgz" integrity sha512-z3DEpT/FIZq9yeHL/tz2v6WvdHIiZ4uvK96RdeTPKUUJ0IXvA5vONG3PF5LE0Q/408PCzWsZpGs9f97ztaeJSQ== dependencies: "@scalar/snippetz-core" "0.1.4" @@ -1421,12 +968,12 @@ "@scalar/themes@0.7.11": version "0.7.11" - resolved "https://registry.yarnpkg.com/@scalar/themes/-/themes-0.7.11.tgz#618011694d2872183284e296ac7946fc6b5bd9b7" + resolved "https://registry.npmjs.org/@scalar/themes/-/themes-0.7.11.tgz" integrity sha512-JakLxHhNnL0scW+29tZutkndVVS82bhaZcbAZxbu6PwIy2DJ5v5fOtcuRyGwyKlmF5G2grQl4yhlkHrIzSiF+g== "@scalar/use-codemirror@0.10.5": version "0.10.5" - resolved "https://registry.yarnpkg.com/@scalar/use-codemirror/-/use-codemirror-0.10.5.tgz#c3b3ef9c18498d9dd9d09eca12b9df0150f93208" + resolved "https://registry.npmjs.org/@scalar/use-codemirror/-/use-codemirror-0.10.5.tgz" integrity sha512-P7WTP061bIbGUMbtUG9pwIyItSxSbXljmWTFkqyq47qQOiDEG3cKXczjCapPn6LMR26s4m3mWAm4kl08dx0hQg== dependencies: "@codemirror/autocomplete" "^6.12.0" @@ -1449,34 +996,51 @@ "@scalar/use-modal@0.3.3": version "0.3.3" - resolved "https://registry.yarnpkg.com/@scalar/use-modal/-/use-modal-0.3.3.tgz#743279d33525e213f491febbe114691660116cc0" + resolved "https://registry.npmjs.org/@scalar/use-modal/-/use-modal-0.3.3.tgz" integrity sha512-j+o3RDeRoYT875oSSa8SytKwDPRMdL74Av9r9lwH95Fwk+IGC/B9Gc8dxtdncKmJBRvTk18nWVEoDn7JZ+CwaA== "@scalar/use-toasts@0.6.7": version "0.6.7" - resolved "https://registry.yarnpkg.com/@scalar/use-toasts/-/use-toasts-0.6.7.tgz#a5c168e1c05f02cdd49ae0f5475a086cfc3ddde1" + resolved "https://registry.npmjs.org/@scalar/use-toasts/-/use-toasts-0.6.7.tgz" integrity sha512-KRaSZ0WgH/745c8ckHo4qGAWWUcp/cU1QgpvLbAnI6qvye/EOxK0PQ5glJVci7w/T1XsAutP5OQ/TlaR7CB6Sw== "@scalar/use-tooltip@0.6.2": version "0.6.2" - resolved "https://registry.yarnpkg.com/@scalar/use-tooltip/-/use-tooltip-0.6.2.tgz#36d4ac594ff2842eacab497fd7caf0e7c1203518" + resolved "https://registry.npmjs.org/@scalar/use-tooltip/-/use-tooltip-0.6.2.tgz" integrity sha512-ntiHkA1A/4DHS7ISqIsE4az0AvG3LovwwJpX6LcnsiezwGfIswe6DSSwX2T0OIOO1n1Amg2/VhGFg+xOyWGOKQ== +"@storybook/core@8.6.4": + version "8.6.4" + resolved "https://registry.npmjs.org/@storybook/core/-/core-8.6.4.tgz" + integrity sha512-glDbjEBi3wokw1T+KQtl93irHO9N0LCwgylWfWVXYDdQjUJ7pGRQGnw73gPX7Ds9tg3myXFC83GjmY94UYSMbA== + dependencies: + "@storybook/theming" "8.6.4" + better-opn "^3.0.2" + browser-assert "^1.2.1" + esbuild "^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0" + esbuild-register "^3.5.0" + jsdoc-type-pratt-parser "^4.0.0" + process "^0.11.10" + recast "^0.23.5" + semver "^7.6.2" + util "^0.12.5" + ws "^8.2.3" + "@storybook/csf@^0.1.11": version "0.1.13" - resolved "https://registry.yarnpkg.com/@storybook/csf/-/csf-0.1.13.tgz#c8a9bea2ae518a3d9700546748fa30a8b07f7f80" + resolved "https://registry.npmjs.org/@storybook/csf/-/csf-0.1.13.tgz" integrity sha512-7xOOwCLGB3ebM87eemep89MYRFTko+D8qE7EdAAq74lgdqRR5cOUtYWJLjO2dLtP94nqoOdHJo6MdLLKzg412Q== dependencies: type-fest "^2.19.0" "@storybook/global@^5.0.0": version "5.0.0" - resolved "https://registry.yarnpkg.com/@storybook/global/-/global-5.0.0.tgz#b793d34b94f572c1d7d9e0f44fac4e0dbc9572ed" + resolved "https://registry.npmjs.org/@storybook/global/-/global-5.0.0.tgz" integrity sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ== "@storybook/instrumenter@8.4.7": version "8.4.7" - resolved "https://registry.yarnpkg.com/@storybook/instrumenter/-/instrumenter-8.4.7.tgz#5a37876fee8f828241a1e7fd76891c6effc1805a" + resolved "https://registry.npmjs.org/@storybook/instrumenter/-/instrumenter-8.4.7.tgz" integrity sha512-k6NSD3jaRCCHAFtqXZ7tw8jAzD/yTEWXGya+REgZqq5RCkmJ+9S4Ytp/6OhQMPtPFX23gAuJJzTQVLcCr+gjRg== dependencies: "@storybook/global" "^5.0.0" @@ -1484,7 +1048,7 @@ "@storybook/test@^8.0.8": version "8.4.7" - resolved "https://registry.yarnpkg.com/@storybook/test/-/test-8.4.7.tgz#7f58f2cdf3a6d810bf3ff4e0e2fee634040c678f" + resolved "https://registry.npmjs.org/@storybook/test/-/test-8.4.7.tgz" integrity sha512-AhvJsu5zl3uG40itSQVuSy5WByp3UVhS6xAnme4FWRwgSxhvZjATJ3AZkkHWOYjnnk+P2/sbz/XuPli1FVCWoQ== dependencies: "@storybook/csf" "^0.1.11" @@ -1496,48 +1060,46 @@ "@vitest/expect" "2.0.5" "@vitest/spy" "2.0.5" +"@storybook/theming@8.6.4": + version "8.6.4" + resolved "https://registry.npmjs.org/@storybook/theming/-/theming-8.6.4.tgz" + integrity sha512-g9Ns4uenC9oAWETaJ/tEKEIPMdS+CqjNWZz5Wbw1bLNhXwADZgKrVqawzZi64+bYYtQ+i8VCTjPoFa6s2eHiDQ== + "@swc/counter@^0.1.3": version "0.1.3" - resolved "https://registry.yarnpkg.com/@swc/counter/-/counter-0.1.3.tgz#cc7463bd02949611c6329596fccd2b0ec782b0e9" + resolved "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz" integrity sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ== -"@swc/helpers@0.5.5": +"@swc/helpers@^0.5.3", "@swc/helpers@0.5.5": version "0.5.5" - resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.5.tgz#12689df71bfc9b21c4f4ca00ae55f2f16c8b77c0" + resolved "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz" integrity sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A== dependencies: "@swc/counter" "^0.1.3" tslib "^2.4.0" -"@swc/helpers@^0.5.3": - version "0.5.15" - resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.15.tgz#79efab344c5819ecf83a43f3f9f811fc84b516d7" - integrity sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g== - dependencies: - tslib "^2.8.0" - "@tanstack/react-virtual@^3.0.0-beta.60": version "3.11.2" - resolved "https://registry.yarnpkg.com/@tanstack/react-virtual/-/react-virtual-3.11.2.tgz#d6b9bd999c181f0a2edce270c87a2febead04322" + resolved "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.11.2.tgz" integrity sha512-OuFzMXPF4+xZgx8UzJha0AieuMihhhaWG0tCqpp6tDzlFwOmNBPYMuLOtMJ1Tr4pXLHmgjcWhG6RlknY2oNTdQ== dependencies: "@tanstack/virtual-core" "3.11.2" "@tanstack/virtual-core@3.11.2": version "3.11.2" - resolved "https://registry.yarnpkg.com/@tanstack/virtual-core/-/virtual-core-3.11.2.tgz#00409e743ac4eea9afe5b7708594d5fcebb00212" + resolved "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.11.2.tgz" integrity sha512-vTtpNt7mKCiZ1pwU9hfKPhpdVO2sVzFQsxoVBGtOSHxlrRRzYr8iQ2TlwbAcRYCcEiZ9ECAM8kBzH0v2+VzfKw== "@tanstack/vue-virtual@^3.0.0-beta.60": version "3.11.2" - resolved "https://registry.yarnpkg.com/@tanstack/vue-virtual/-/vue-virtual-3.11.2.tgz#c1a7f1a3e20cb1eee7a81c58b5b21f6a381cbaab" + resolved "https://registry.npmjs.org/@tanstack/vue-virtual/-/vue-virtual-3.11.2.tgz" integrity sha512-y0b1p1FTlzxcSt/ZdGWY1AZ52ddwSU69pvFRYAELUSdLLxV8QOPe9dyT/KATO43UCb3DAwiyzi96h2IoYstBOQ== dependencies: "@tanstack/virtual-core" "3.11.2" -"@testing-library/dom@10.4.0": +"@testing-library/dom@>=7.21.4", "@testing-library/dom@10.4.0": version "10.4.0" - resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-10.4.0.tgz#82a9d9462f11d240ecadbf406607c6ceeeff43a8" + resolved "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz" integrity sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ== dependencies: "@babel/code-frame" "^7.10.4" @@ -1551,7 +1113,7 @@ "@testing-library/jest-dom@6.5.0": version "6.5.0" - resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-6.5.0.tgz#50484da3f80fb222a853479f618a9ce5c47bfe54" + resolved "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.5.0.tgz" integrity sha512-xGGHpBXYSHUUr6XsKBfs85TWlYKpTc37cSBBVrXcib2MkHLboWlkClhWF37JKlDb9KEq3dHs+f2xR7XJEWGBxA== dependencies: "@adobe/css-tools" "^4.4.0" @@ -1564,12 +1126,12 @@ "@testing-library/user-event@14.5.2": version "14.5.2" - resolved "https://registry.yarnpkg.com/@testing-library/user-event/-/user-event-14.5.2.tgz#db7257d727c891905947bd1c1a99da20e03c2ebd" + resolved "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.5.2.tgz" integrity sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ== "@theguild/remark-mermaid@^0.0.5": version "0.0.5" - resolved "https://registry.yarnpkg.com/@theguild/remark-mermaid/-/remark-mermaid-0.0.5.tgz#0f95671d247381f416e528e937be08bb7a695224" + resolved "https://registry.npmjs.org/@theguild/remark-mermaid/-/remark-mermaid-0.0.5.tgz" integrity sha512-e+ZIyJkEv9jabI4m7q29wZtZv+2iwPGsXJ2d46Zi7e+QcFudiyuqhLhHG/3gX3ZEB+hxTch+fpItyMS8jwbIcw== dependencies: mermaid "^10.2.2" @@ -1577,7 +1139,7 @@ "@theguild/remark-mermaid@^0.0.6": version "0.0.6" - resolved "https://registry.yarnpkg.com/@theguild/remark-mermaid/-/remark-mermaid-0.0.6.tgz#937406e74d37dc3d750fdd097b02cd0a0e7ca570" + resolved "https://registry.npmjs.org/@theguild/remark-mermaid/-/remark-mermaid-0.0.6.tgz" integrity sha512-WaOOaSz2tEmsE8SFL4WCiTRzwMlOIkKONnlc6DjKbqaJr+lVGlm0aWZAVTuvvVEebgmLzaFvmPUVf2M2GWwsJQ== dependencies: mermaid "^10.2.2" @@ -1585,7 +1147,7 @@ "@theguild/remark-npm2yarn@^0.2.0": version "0.2.1" - resolved "https://registry.yarnpkg.com/@theguild/remark-npm2yarn/-/remark-npm2yarn-0.2.1.tgz#63bf5a8c85d7fe505d4808812dbc56d9c2ce00f8" + resolved "https://registry.npmjs.org/@theguild/remark-npm2yarn/-/remark-npm2yarn-0.2.1.tgz" integrity sha512-jUTFWwDxtLEFtGZh/TW/w30ySaDJ8atKWH8dq2/IiQF61dPrGfETpl0WxD0VdBfuLOeU14/kop466oBSRO/5CA== dependencies: npm-to-yarn "^2.1.0" @@ -1593,79 +1155,79 @@ "@types/acorn@^4.0.0": version "4.0.6" - resolved "https://registry.yarnpkg.com/@types/acorn/-/acorn-4.0.6.tgz#d61ca5480300ac41a7d973dd5b84d0a591154a22" + resolved "https://registry.npmjs.org/@types/acorn/-/acorn-4.0.6.tgz" integrity sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ== dependencies: "@types/estree" "*" "@types/aria-query@^5.0.1": version "5.0.4" - resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-5.0.4.tgz#1a31c3d378850d2778dabb6374d036dcba4ba708" + resolved "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz" integrity sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw== "@types/d3-scale-chromatic@^3.0.0": version "3.1.0" - resolved "https://registry.yarnpkg.com/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz#dc6d4f9a98376f18ea50bad6c39537f1b5463c39" + resolved "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz" integrity sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ== "@types/d3-scale@^4.0.3": version "4.0.8" - resolved "https://registry.yarnpkg.com/@types/d3-scale/-/d3-scale-4.0.8.tgz#d409b5f9dcf63074464bf8ddfb8ee5a1f95945bb" + resolved "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.8.tgz" integrity sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ== dependencies: "@types/d3-time" "*" "@types/d3-time@*": version "3.0.4" - resolved "https://registry.yarnpkg.com/@types/d3-time/-/d3-time-3.0.4.tgz#8472feecd639691450dd8000eb33edd444e1323f" + resolved "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz" integrity sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g== "@types/debug@^4.0.0": version "4.1.12" - resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.12.tgz#a155f21690871953410df4b6b6f53187f0500917" + resolved "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz" integrity sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ== dependencies: "@types/ms" "*" "@types/estree-jsx@^1.0.0": version "1.0.5" - resolved "https://registry.yarnpkg.com/@types/estree-jsx/-/estree-jsx-1.0.5.tgz#858a88ea20f34fe65111f005a689fa1ebf70dc18" + resolved "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz" integrity sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg== dependencies: "@types/estree" "*" -"@types/estree@*", "@types/estree@1.0.6", "@types/estree@^1.0.0", "@types/estree@^1.0.6": +"@types/estree@*", "@types/estree@^1.0.0", "@types/estree@^1.0.6", "@types/estree@1.0.6": version "1.0.6" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" + resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz" integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== "@types/fined@*": version "1.1.5" - resolved "https://registry.yarnpkg.com/@types/fined/-/fined-1.1.5.tgz#504b87a0de8813e06e7d226f34c1cefb70d9afb0" + resolved "https://registry.npmjs.org/@types/fined/-/fined-1.1.5.tgz" integrity sha512-2N93vadEGDFhASTIRbizbl4bNqpMOId5zZfj6hHqYZfEzEfO9onnU4Im8xvzo8uudySDveDHBOOSlTWf38ErfQ== "@types/har-format@^1.2.10", "@types/har-format@^1.2.15": version "1.2.16" - resolved "https://registry.yarnpkg.com/@types/har-format/-/har-format-1.2.16.tgz#b71ede8681400cc08b3685f061c31e416cf94944" + resolved "https://registry.npmjs.org/@types/har-format/-/har-format-1.2.16.tgz" integrity sha512-fluxdy7ryD3MV6h8pTfTYpy/xQzCFC7m89nOH9y94cNqJ1mDIDPut7MnRHI3F6qRmh/cT2fUjG1MLdCNb4hE9A== "@types/hast@^2.0.0": version "2.3.10" - resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.10.tgz#5c9d9e0b304bbb8879b857225c5ebab2d81d7643" + resolved "https://registry.npmjs.org/@types/hast/-/hast-2.3.10.tgz" integrity sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw== dependencies: "@types/unist" "^2" "@types/hast@^3.0.0": version "3.0.4" - resolved "https://registry.yarnpkg.com/@types/hast/-/hast-3.0.4.tgz#1d6b39993b82cea6ad783945b0508c25903e15aa" + resolved "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz" integrity sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ== dependencies: "@types/unist" "*" "@types/inquirer@^9.0.3": version "9.0.7" - resolved "https://registry.yarnpkg.com/@types/inquirer/-/inquirer-9.0.7.tgz#61bb8d0e42f038b9a1738b08fba7fa98ad9b4b24" + resolved "https://registry.npmjs.org/@types/inquirer/-/inquirer-9.0.7.tgz" integrity sha512-Q0zyBupO6NxGRZut/JdmqYKOnN95Eg5V8Csg3PGKkP+FnvsUZx1jAyK7fztIszxxMuoBA6E3KXWvdZVXIpx60g== dependencies: "@types/through" "*" @@ -1673,22 +1235,22 @@ "@types/js-yaml@^4.0.0": version "4.0.9" - resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-4.0.9.tgz#cd82382c4f902fed9691a2ed79ec68c5898af4c2" + resolved "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.9.tgz" integrity sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg== "@types/json5@^0.0.29": version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + resolved "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz" integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== "@types/katex@^0.16.0": version "0.16.7" - resolved "https://registry.yarnpkg.com/@types/katex/-/katex-0.16.7.tgz#03ab680ab4fa4fbc6cb46ecf987ecad5d8019868" + resolved "https://registry.npmjs.org/@types/katex/-/katex-0.16.7.tgz" integrity sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ== "@types/liftoff@^4.0.3": version "4.0.3" - resolved "https://registry.yarnpkg.com/@types/liftoff/-/liftoff-4.0.3.tgz#ebac04d98b65e0aeff7cc31655cb6d060a3d8146" + resolved "https://registry.npmjs.org/@types/liftoff/-/liftoff-4.0.3.tgz" integrity sha512-UgbL2kR5pLrWICvr8+fuSg0u43LY250q7ZMkC+XKC3E+rs/YBDEnQIzsnhU5dYsLlwMi3R75UvCL87pObP1sxw== dependencies: "@types/fined" "*" @@ -1696,62 +1258,48 @@ "@types/mdast@^3.0.0": version "3.0.15" - resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.15.tgz#49c524a263f30ffa28b71ae282f813ed000ab9f5" + resolved "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz" integrity sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ== dependencies: "@types/unist" "^2" "@types/mdast@^4.0.0": version "4.0.4" - resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-4.0.4.tgz#7ccf72edd2f1aa7dd3437e180c64373585804dd6" + resolved "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz" integrity sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA== dependencies: "@types/unist" "*" "@types/mdx@^2.0.0": version "2.0.13" - resolved "https://registry.yarnpkg.com/@types/mdx/-/mdx-2.0.13.tgz#68f6877043d377092890ff5b298152b0a21671bd" + resolved "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz" integrity sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw== "@types/ms@*": version "0.7.34" - resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.34.tgz#10964ba0dee6ac4cd462e2795b6bebd407303433" + resolved "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz" integrity sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g== -"@types/node@*": - version "22.10.3" - resolved "https://registry.yarnpkg.com/@types/node/-/node-22.10.3.tgz#cdc2a89bf6e5d5e593fad08e83f74d7348d5dd10" - integrity sha512-DifAyw4BkrufCILvD3ucnuN8eydUfc/C1GlyrnI+LK6543w5/L3VeVgf05o3B4fqSXP1dKYLOZsKfutpxPzZrw== - dependencies: - undici-types "~6.20.0" - -"@types/node@^20", "@types/node@^20.11.26": +"@types/node@*", "@types/node@^18.0.0 || >=20.0.0", "@types/node@^20", "@types/node@^20.11.26": version "20.17.11" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.17.11.tgz#2c05215fc37316b1596df7fbdba52151eaf83c50" + resolved "https://registry.npmjs.org/@types/node/-/node-20.17.11.tgz" integrity sha512-Ept5glCK35R8yeyIeYlRIZtX6SLRyqMhOFTgj5SOkMpLTdw3SEHI9fHx60xaUZ+V1aJxQJODE+7/j5ocZydYTg== dependencies: undici-types "~6.19.2" "@types/prop-types@*": version "15.7.14" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.14.tgz#1433419d73b2a7ebfc6918dcefd2ec0d5cd698f2" + resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz" integrity sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ== -"@types/react-dom@^18": +"@types/react-dom@*", "@types/react-dom@^18": version "18.3.5" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.3.5.tgz#45f9f87398c5dcea085b715c58ddcf1faf65f716" + resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.5.tgz" integrity sha512-P4t6saawp+b/dFrUr2cvkVsfvPguwsxtH6dNIYRllMsefqFzkZk5UIjzyDOv5g1dXIPdG4Sp1yCR4Z6RCUsG/Q== -"@types/react@>=16": - version "19.0.2" - resolved "https://registry.yarnpkg.com/@types/react/-/react-19.0.2.tgz#9363e6b3ef898c471cb182dd269decc4afc1b4f6" - integrity sha512-USU8ZI/xyKJwFTpjSVIrSeHBVAGagkHQKPNbxeWwql/vDmnTIBgx+TJnhFnj1NXgz8XfprU0egV2dROLGpsBEg== - dependencies: - csstype "^3.0.2" - -"@types/react@^18": +"@types/react@*", "@types/react@^18", "@types/react@^18.0.0", "@types/react@>=16", "@types/react@>=18": version "18.3.18" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.18.tgz#9b382c4cd32e13e463f97df07c2ee3bbcd26904b" + resolved "https://registry.npmjs.org/@types/react/-/react-18.3.18.tgz" integrity sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ== dependencies: "@types/prop-types" "*" @@ -1759,29 +1307,29 @@ "@types/through@*": version "0.0.33" - resolved "https://registry.yarnpkg.com/@types/through/-/through-0.0.33.tgz#14ebf599320e1c7851e7d598149af183c6b9ea56" + resolved "https://registry.npmjs.org/@types/through/-/through-0.0.33.tgz" integrity sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ== dependencies: "@types/node" "*" -"@types/unist@*", "@types/unist@^3.0.0": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/unist/-/unist-3.0.3.tgz#acaab0f919ce69cce629c2d4ed2eb4adc1b6c20c" - integrity sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q== - -"@types/unist@^2", "@types/unist@^2.0.0": +"@types/unist@*", "@types/unist@^2", "@types/unist@^2.0.0": version "2.0.11" - resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.11.tgz#11af57b127e32487774841f7a4e54eab166d03c4" + resolved "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz" integrity sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA== +"@types/unist@^3.0.0": + version "3.0.3" + resolved "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz" + integrity sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q== + "@types/web-bluetooth@^0.0.20": version "0.0.20" - resolved "https://registry.yarnpkg.com/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz#f066abfcd1cbe66267cdbbf0de010d8a41b41597" + resolved "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz" integrity sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow== "@typescript-eslint/parser@^5.4.2 || ^6.0.0": version "6.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.21.0.tgz#af8fcf66feee2edc86bc5d1cf45e33b0630bf35b" + resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz" integrity sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ== dependencies: "@typescript-eslint/scope-manager" "6.21.0" @@ -1792,7 +1340,7 @@ "@typescript-eslint/scope-manager@6.21.0": version "6.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz#ea8a9bfc8f1504a6ac5d59a6df308d3a0630a2b1" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz" integrity sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg== dependencies: "@typescript-eslint/types" "6.21.0" @@ -1800,12 +1348,12 @@ "@typescript-eslint/types@6.21.0": version "6.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.21.0.tgz#205724c5123a8fef7ecd195075fa6e85bac3436d" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz" integrity sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg== "@typescript-eslint/typescript-estree@6.21.0": version "6.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz#c47ae7901db3b8bddc3ecd73daff2d0895688c46" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz" integrity sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ== dependencies: "@typescript-eslint/types" "6.21.0" @@ -1819,7 +1367,7 @@ "@typescript-eslint/visitor-keys@6.21.0": version "6.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz#87a99d077aa507e20e238b11d56cc26ade45fe47" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz" integrity sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A== dependencies: "@typescript-eslint/types" "6.21.0" @@ -1827,7 +1375,7 @@ "@uiw/codemirror-themes@^4.21.21": version "4.23.7" - resolved "https://registry.yarnpkg.com/@uiw/codemirror-themes/-/codemirror-themes-4.23.7.tgz#33d09a2d9df3eda3e3affcb68d91672e41bf646a" + resolved "https://registry.npmjs.org/@uiw/codemirror-themes/-/codemirror-themes-4.23.7.tgz" integrity sha512-UNf1XOx1hG9OmJnrtT86PxKcdcwhaNhbrcD+nsk8WxRJ3n5c8nH6euDvgVPdVLPwbizsaQcZTILACgA/FjRpVg== dependencies: "@codemirror/language" "^6.0.0" @@ -1836,20 +1384,20 @@ "@ungap/structured-clone@^1.0.0", "@ungap/structured-clone@^1.2.0": version "1.2.1" - resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.1.tgz#28fa185f67daaf7b7a1a8c1d445132c5d979f8bd" + resolved "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.1.tgz" integrity sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA== "@unhead/dom@1.11.14": version "1.11.14" - resolved "https://registry.yarnpkg.com/@unhead/dom/-/dom-1.11.14.tgz#30e39d9848c964e5038c98e2de0de8bd0737d77a" + resolved "https://registry.npmjs.org/@unhead/dom/-/dom-1.11.14.tgz" integrity sha512-FaHCWo9JR4h7PCpSRaXuMC6ifXOuBzlI0PD1MmUcxND2ayDl1d6DauIbN8TUf9TDRxNkrK1Ehb0OCXjC1ZJtrg== dependencies: "@unhead/schema" "1.11.14" "@unhead/shared" "1.11.14" -"@unhead/schema@1.11.14", "@unhead/schema@^1.9.5": +"@unhead/schema@^1.9.5", "@unhead/schema@1.11.14": version "1.11.14" - resolved "https://registry.yarnpkg.com/@unhead/schema/-/schema-1.11.14.tgz#fec0c3947144001c12d68c96a8585abaa6771f1b" + resolved "https://registry.npmjs.org/@unhead/schema/-/schema-1.11.14.tgz" integrity sha512-V9W9u5tF1/+TiLqxu+Qvh1ShoMDkPEwHoEo4DKdDG6ko7YlbzFfDxV6el9JwCren45U/4Vy/4Xi7j8OH02wsiA== dependencies: hookable "^5.5.3" @@ -1857,14 +1405,14 @@ "@unhead/shared@1.11.14": version "1.11.14" - resolved "https://registry.yarnpkg.com/@unhead/shared/-/shared-1.11.14.tgz#b001403cfbdb35c8a12a9231f0734a91d2460213" + resolved "https://registry.npmjs.org/@unhead/shared/-/shared-1.11.14.tgz" integrity sha512-41Qt4PJKYVrEGOTXgBJLRYrEu3S7n5stoB4TFC6312CIBVedXqg7voHQurn32LVDjpfJftjLa2ggCjpqdqoRDw== dependencies: "@unhead/schema" "1.11.14" "@vcarl/remark-headings@^0.1.0": version "0.1.0" - resolved "https://registry.yarnpkg.com/@vcarl/remark-headings/-/remark-headings-0.1.0.tgz#b5831c3f16d8b2570872f554ba509437ec507a1e" + resolved "https://registry.npmjs.org/@vcarl/remark-headings/-/remark-headings-0.1.0.tgz" integrity sha512-ffQxJUcapJ9Bk+fiGN49YJ9RaYMibrSTSezB1Fcrtu+0YSZxA3bsaLlIv1u/4sjPIeW/BKrs4xtMT3l3P9Ba5Q== dependencies: mdast-util-to-string "^3.1.0" @@ -1872,7 +1420,7 @@ "@vitest/expect@2.0.5": version "2.0.5" - resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-2.0.5.tgz#f3745a6a2c18acbea4d39f5935e913f40d26fa86" + resolved "https://registry.npmjs.org/@vitest/expect/-/expect-2.0.5.tgz" integrity sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA== dependencies: "@vitest/spy" "2.0.5" @@ -1882,28 +1430,37 @@ "@vitest/pretty-format@2.0.5": version "2.0.5" - resolved "https://registry.yarnpkg.com/@vitest/pretty-format/-/pretty-format-2.0.5.tgz#91d2e6d3a7235c742e1a6cc50e7786e2f2979b1e" + resolved "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.0.5.tgz" integrity sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ== dependencies: tinyrainbow "^1.2.0" "@vitest/pretty-format@2.1.8": version "2.1.8" - resolved "https://registry.yarnpkg.com/@vitest/pretty-format/-/pretty-format-2.1.8.tgz#88f47726e5d0cf4ba873d50c135b02e4395e2bca" + resolved "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.8.tgz" integrity sha512-9HiSZ9zpqNLKlbIDRWOnAWqgcA7xu+8YxXSekhr0Ykab7PAYFkhkwoqVArPOtJhPmYeE2YHgKZlj3CP36z2AJQ== dependencies: tinyrainbow "^1.2.0" "@vitest/spy@2.0.5": version "2.0.5" - resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-2.0.5.tgz#590fc07df84a78b8e9dd976ec2090920084a2b9f" + resolved "https://registry.npmjs.org/@vitest/spy/-/spy-2.0.5.tgz" integrity sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA== dependencies: tinyspy "^3.0.0" +"@vitest/utils@^2.1.1": + version "2.1.8" + resolved "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.8.tgz" + integrity sha512-dwSoui6djdwbfFmIgbIjX2ZhIoG7Ex/+xpxyiEgIGzjliY8xGkcpITKTlp6B4MgtGkF2ilvm97cPM96XZaAgcA== + dependencies: + "@vitest/pretty-format" "2.1.8" + loupe "^3.1.2" + tinyrainbow "^1.2.0" + "@vitest/utils@2.0.5": version "2.0.5" - resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-2.0.5.tgz#6f8307a4b6bc6ceb9270007f73c67c915944e926" + resolved "https://registry.npmjs.org/@vitest/utils/-/utils-2.0.5.tgz" integrity sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ== dependencies: "@vitest/pretty-format" "2.0.5" @@ -1911,18 +1468,89 @@ loupe "^3.1.1" tinyrainbow "^1.2.0" -"@vitest/utils@^2.1.1": - version "2.1.8" - resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-2.1.8.tgz#f8ef85525f3362ebd37fd25d268745108d6ae388" - integrity sha512-dwSoui6djdwbfFmIgbIjX2ZhIoG7Ex/+xpxyiEgIGzjliY8xGkcpITKTlp6B4MgtGkF2ilvm97cPM96XZaAgcA== +"@vue/compiler-core@3.5.13": + version "3.5.13" + resolved "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.13.tgz" + integrity sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q== dependencies: - "@vitest/pretty-format" "2.1.8" - loupe "^3.1.2" - tinyrainbow "^1.2.0" + "@babel/parser" "^7.25.3" + "@vue/shared" "3.5.13" + entities "^4.5.0" + estree-walker "^2.0.2" + source-map-js "^1.2.0" + +"@vue/compiler-dom@3.5.13": + version "3.5.13" + resolved "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.13.tgz" + integrity sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA== + dependencies: + "@vue/compiler-core" "3.5.13" + "@vue/shared" "3.5.13" + +"@vue/compiler-sfc@3.5.13": + version "3.5.13" + resolved "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.13.tgz" + integrity sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ== + dependencies: + "@babel/parser" "^7.25.3" + "@vue/compiler-core" "3.5.13" + "@vue/compiler-dom" "3.5.13" + "@vue/compiler-ssr" "3.5.13" + "@vue/shared" "3.5.13" + estree-walker "^2.0.2" + magic-string "^0.30.11" + postcss "^8.4.48" + source-map-js "^1.2.0" + +"@vue/compiler-ssr@3.5.13": + version "3.5.13" + resolved "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.13.tgz" + integrity sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA== + dependencies: + "@vue/compiler-dom" "3.5.13" + "@vue/shared" "3.5.13" + +"@vue/reactivity@3.5.13": + version "3.5.13" + resolved "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.13.tgz" + integrity sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg== + dependencies: + "@vue/shared" "3.5.13" + +"@vue/runtime-core@3.5.13": + version "3.5.13" + resolved "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.13.tgz" + integrity sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw== + dependencies: + "@vue/reactivity" "3.5.13" + "@vue/shared" "3.5.13" + +"@vue/runtime-dom@3.5.13": + version "3.5.13" + resolved "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.13.tgz" + integrity sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog== + dependencies: + "@vue/reactivity" "3.5.13" + "@vue/runtime-core" "3.5.13" + "@vue/shared" "3.5.13" + csstype "^3.1.3" + +"@vue/server-renderer@3.5.13": + version "3.5.13" + resolved "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.13.tgz" + integrity sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA== + dependencies: + "@vue/compiler-ssr" "3.5.13" + "@vue/shared" "3.5.13" + +"@vue/shared@3.5.13": + version "3.5.13" + resolved "https://registry.npmjs.org/@vue/shared/-/shared-3.5.13.tgz" + integrity sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ== "@vueuse/core@^10.9.0": version "10.11.1" - resolved "https://registry.yarnpkg.com/@vueuse/core/-/core-10.11.1.tgz#15d2c0b6448d2212235b23a7ba29c27173e0c2c6" + resolved "https://registry.npmjs.org/@vueuse/core/-/core-10.11.1.tgz" integrity sha512-guoy26JQktXPcz+0n3GukWIy/JDNKti9v6VEMu6kV2sYBsWuGiTU8OWdg+ADfUbHg3/3DlqySDe7JmdHrktiww== dependencies: "@types/web-bluetooth" "^0.0.20" @@ -1932,29 +1560,29 @@ "@vueuse/metadata@10.11.1": version "10.11.1" - resolved "https://registry.yarnpkg.com/@vueuse/metadata/-/metadata-10.11.1.tgz#209db7bb5915aa172a87510b6de2ca01cadbd2a7" + resolved "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.11.1.tgz" integrity sha512-IGa5FXd003Ug1qAZmyE8wF3sJ81xGLSqTqtQ6jaVfkeZ4i5kS2mwQF61yhVqojRnenVew5PldLyRgvdl4YYuSw== "@vueuse/shared@10.11.1": version "10.11.1" - resolved "https://registry.yarnpkg.com/@vueuse/shared/-/shared-10.11.1.tgz#62b84e3118ae6e1f3ff38f4fbe71b0c5d0f10938" + resolved "https://registry.npmjs.org/@vueuse/shared/-/shared-10.11.1.tgz" integrity sha512-LHpC8711VFZlDaYUXEBbFBCQ7GS3dVU9mjOhhMhXP6txTV4EhYQg/KGnQuvt/sPAtoUKq7VVUnL6mVtFoL42sA== dependencies: vue-demi ">=0.14.8" acorn-jsx@^5.0.0, acorn-jsx@^5.3.2: version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn@^8.0.0, acorn@^8.9.0: +"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.0.0, acorn@^8.9.0: version "8.14.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.0.tgz#063e2c70cac5fb4f6467f0b11152e04c682795b0" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz" integrity sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA== aggregate-error@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-4.0.1.tgz#25091fe1573b9e0be892aeda15c7c66a545f758e" + resolved "https://registry.npmjs.org/aggregate-error/-/aggregate-error-4.0.1.tgz" integrity sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w== dependencies: clean-stack "^4.0.0" @@ -1962,19 +1590,19 @@ aggregate-error@^4.0.0: ajv-draft-04@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz#3b64761b268ba0b9e668f0b41ba53fce0ad77fc8" + resolved "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz" integrity sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw== ajv-formats@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" + resolved "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz" integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== dependencies: ajv "^8.0.0" ajv@^6.12.4: version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== dependencies: fast-deep-equal "^3.1.1" @@ -1982,9 +1610,9 @@ ajv@^6.12.4: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.0.0, ajv@^8.12.0: +ajv@^8.0.0, ajv@^8.12.0, ajv@^8.5.0: version "8.17.1" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz" integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== dependencies: fast-deep-equal "^3.1.3" @@ -1994,58 +1622,58 @@ ajv@^8.0.0, ajv@^8.12.0: ansi-escapes@^4.3.2: version "4.3.2" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== dependencies: type-fest "^0.21.3" ansi-regex@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-regex@^6.0.1: version "6.1.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.1.0.tgz#95ec409c69619d6cb1b8b34f14b660ef28ebd654" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz" integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA== ansi-sequence-parser@^1.1.0: version "1.1.1" - resolved "https://registry.yarnpkg.com/ansi-sequence-parser/-/ansi-sequence-parser-1.1.1.tgz#e0aa1cdcbc8f8bb0b5bca625aac41f5f056973cf" + resolved "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.1.tgz" integrity sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg== ansi-styles@^3.1.0: version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== dependencies: color-convert "^1.9.0" ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: color-convert "^2.0.1" ansi-styles@^5.0.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== ansi-styles@^6.1.0: version "6.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz" integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== any-promise@^1.0.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + resolved "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz" integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== anymatch@~3.1.2: version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== dependencies: normalize-path "^3.0.0" @@ -2053,53 +1681,53 @@ anymatch@~3.1.2: arch@^2.1.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/arch/-/arch-2.2.0.tgz#1bc47818f305764f23ab3306b0bfc086c5a29d11" + resolved "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz" integrity sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ== -arg@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/arg/-/arg-1.0.0.tgz#444d885a4e25b121640b55155ef7cd03975d6050" - integrity sha512-Wk7TEzl1KqvTGs/uyhmHO/3XLd3t1UeU4IstvPXVzGPM522cTjqjNZ99esCkcL52sjqjo8e8CTBcWhkxvGzoAw== - arg@^5.0.2: version "5.0.2" - resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" + resolved "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz" integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== +arg@1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/arg/-/arg-1.0.0.tgz" + integrity sha512-Wk7TEzl1KqvTGs/uyhmHO/3XLd3t1UeU4IstvPXVzGPM522cTjqjNZ99esCkcL52sjqjo8e8CTBcWhkxvGzoAw== + argparse@^1.0.7: version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== dependencies: sprintf-js "~1.0.2" argparse@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== aria-hidden@^1.1.1: version "1.2.4" - resolved "https://registry.yarnpkg.com/aria-hidden/-/aria-hidden-1.2.4.tgz#b78e383fdbc04d05762c78b4a25a501e736c4522" + resolved "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.4.tgz" integrity sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A== dependencies: tslib "^2.0.0" -aria-query@5.3.0: +aria-query@^5.0.0, aria-query@5.3.0: version "5.3.0" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e" + resolved "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz" integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== dependencies: dequal "^2.0.3" -aria-query@^5.0.0, aria-query@^5.3.2: +aria-query@^5.3.2: version "5.3.2" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.2.tgz#93f81a43480e33a338f19163a3d10a50c01dcd59" + resolved "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz" integrity sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw== array-buffer-byte-length@^1.0.1, array-buffer-byte-length@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz#384d12a37295aec3769ab022ad323a18a51ccf8b" + resolved "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz" integrity sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw== dependencies: call-bound "^1.0.3" @@ -2107,12 +1735,12 @@ array-buffer-byte-length@^1.0.1, array-buffer-byte-length@^1.0.2: array-each@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/array-each/-/array-each-1.0.1.tgz#a794af0c05ab1752846ee753a1f211a05ba0c44f" + resolved "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz" integrity sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA== array-includes@^3.1.6, array-includes@^3.1.8: version "3.1.8" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d" + resolved "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz" integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ== dependencies: call-bind "^1.0.7" @@ -2124,17 +1752,17 @@ array-includes@^3.1.6, array-includes@^3.1.8: array-slice@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-1.1.0.tgz#e368ea15f89bc7069f7ffb89aec3a6c7d4ac22d4" + resolved "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz" integrity sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w== array-union@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== array.prototype.findlast@^1.2.5: version "1.2.5" - resolved "https://registry.yarnpkg.com/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz#3e4fbcb30a15a7f5bf64cf2faae22d139c2e4904" + resolved "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz" integrity sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ== dependencies: call-bind "^1.0.7" @@ -2146,7 +1774,7 @@ array.prototype.findlast@^1.2.5: array.prototype.findlastindex@^1.2.5: version "1.2.5" - resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz#8c35a755c72908719453f87145ca011e39334d0d" + resolved "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz" integrity sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ== dependencies: call-bind "^1.0.7" @@ -2158,7 +1786,7 @@ array.prototype.findlastindex@^1.2.5: array.prototype.flat@^1.3.1, array.prototype.flat@^1.3.2: version "1.3.3" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz#534aaf9e6e8dd79fb6b9a9917f839ef1ec63afe5" + resolved "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz" integrity sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg== dependencies: call-bind "^1.0.8" @@ -2168,7 +1796,7 @@ array.prototype.flat@^1.3.1, array.prototype.flat@^1.3.2: array.prototype.flatmap@^1.3.2, array.prototype.flatmap@^1.3.3: version "1.3.3" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz#712cc792ae70370ae40586264629e33aab5dd38b" + resolved "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz" integrity sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg== dependencies: call-bind "^1.0.8" @@ -2178,7 +1806,7 @@ array.prototype.flatmap@^1.3.2, array.prototype.flatmap@^1.3.3: array.prototype.tosorted@^1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz#fe954678ff53034e717ea3352a03f0b0b86f7ffc" + resolved "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz" integrity sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA== dependencies: call-bind "^1.0.7" @@ -2189,7 +1817,7 @@ array.prototype.tosorted@^1.1.4: arraybuffer.prototype.slice@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz#9d760d84dbdd06d0cbf92c8849615a1a7ab3183c" + resolved "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz" integrity sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ== dependencies: array-buffer-byte-length "^1.0.1" @@ -2202,27 +1830,34 @@ arraybuffer.prototype.slice@^1.0.4: assertion-error@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-2.0.1.tgz#f641a196b335690b1070bf00b6e7593fec190bf7" + resolved "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz" integrity sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA== ast-types-flow@^0.0.8: version "0.0.8" - resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.8.tgz#0a85e1c92695769ac13a428bb653e7538bea27d6" + resolved "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz" integrity sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ== +ast-types@^0.16.1: + version "0.16.1" + resolved "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz" + integrity sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg== + dependencies: + tslib "^2.0.1" + astring@^1.8.0: version "1.9.0" - resolved "https://registry.yarnpkg.com/astring/-/astring-1.9.0.tgz#cc73e6062a7eb03e7d19c22d8b0b3451fd9bfeef" + resolved "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz" integrity sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg== asynckit@^0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== autoprefixer@^10.0.1: version "10.4.20" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.20.tgz#5caec14d43976ef42e32dcb4bd62878e96be5b3b" + resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz" integrity sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g== dependencies: browserslist "^4.23.3" @@ -2234,19 +1869,19 @@ autoprefixer@^10.0.1: available-typed-arrays@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" + resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz" integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== dependencies: possible-typed-array-names "^1.0.0" axe-core@^4.10.0: version "4.10.2" - resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.10.2.tgz#85228e3e1d8b8532a27659b332e39b7fa0e022df" + resolved "https://registry.npmjs.org/axe-core/-/axe-core-4.10.2.tgz" integrity sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w== -axios@^1.6.8: +axios@^1.5, axios@^1.6.8: version "1.7.9" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.9.tgz#d7d071380c132a24accda1b2cfc1535b79ec650a" + resolved "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz" integrity sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw== dependencies: follow-redirects "^1.15.6" @@ -2255,32 +1890,39 @@ axios@^1.6.8: axobject-query@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-4.1.0.tgz#28768c76d0e3cff21bc62a9e2d0b6ac30042a1ee" + resolved "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz" integrity sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ== bail@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/bail/-/bail-2.0.2.tgz#d26f5cd8fe5d6f832a31517b9f7c356040ba6d5d" + resolved "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz" integrity sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw== balanced-match@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== base64-js@^1.3.1: version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== +better-opn@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/better-opn/-/better-opn-3.0.2.tgz" + integrity sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ== + dependencies: + open "^8.0.4" + binary-extensions@^2.0.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz" integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== bl@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + resolved "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz" integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== dependencies: buffer "^5.5.0" @@ -2289,7 +1931,7 @@ bl@^4.1.0: brace-expansion@^1.1.7: version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: balanced-match "^1.0.0" @@ -2297,21 +1939,26 @@ brace-expansion@^1.1.7: brace-expansion@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz" integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== dependencies: balanced-match "^1.0.0" braces@^3.0.3, braces@~3.0.2: version "3.0.3" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz" integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== dependencies: fill-range "^7.1.1" -browserslist@^4.23.3: +browser-assert@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/browser-assert/-/browser-assert-1.2.1.tgz" + integrity sha512-nfulgvOR6S4gt9UKCeGJOuSGBPGiFT6oQ/2UBnvTY/5aQ1PnksW72fhZkM30DzoRRv2WpwZf1vHHEr3mtuXIWQ== + +browserslist@^4.23.3, "browserslist@>= 4.21.0": version "4.24.3" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.3.tgz#5fc2725ca8fb3c1432e13dac278c7cc103e026d2" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.24.3.tgz" integrity sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA== dependencies: caniuse-lite "^1.0.30001688" @@ -2321,7 +1968,7 @@ browserslist@^4.23.3: buffer@^5.5.0: version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== dependencies: base64-js "^1.3.1" @@ -2329,14 +1976,14 @@ buffer@^5.5.0: busboy@1.6.0: version "1.6.0" - resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" + resolved "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz" integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== dependencies: streamsearch "^1.1.0" call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz#32e5892e6361b29b0b545ba6f7763378daca2840" + resolved "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz" integrity sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g== dependencies: es-errors "^1.3.0" @@ -2344,7 +1991,7 @@ call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1: call-bind@^1.0.7, call-bind@^1.0.8: version "1.0.8" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.8.tgz#0736a9660f537e3388826f440d5ec45f744eaa4c" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz" integrity sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww== dependencies: call-bind-apply-helpers "^1.0.0" @@ -2354,7 +2001,7 @@ call-bind@^1.0.7, call-bind@^1.0.8: call-bound@^1.0.2, call-bound@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.3.tgz#41cfd032b593e39176a71533ab4f384aa04fd681" + resolved "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz" integrity sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA== dependencies: call-bind-apply-helpers "^1.0.1" @@ -2362,12 +2009,12 @@ call-bound@^1.0.2, call-bound@^1.0.3: callsites@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== camel-case@^4.1.2: version "4.1.2" - resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" + resolved "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz" integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== dependencies: pascal-case "^3.1.2" @@ -2375,17 +2022,17 @@ camel-case@^4.1.2: camelcase-css@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" + resolved "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz" integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== caniuse-lite@^1.0.30001579, caniuse-lite@^1.0.30001646, caniuse-lite@^1.0.30001688: version "1.0.30001690" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001690.tgz#f2d15e3aaf8e18f76b2b8c1481abde063b8104c8" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001690.tgz" integrity sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w== capital-case@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/capital-case/-/capital-case-1.0.4.tgz#9d130292353c9249f6b00fa5852bee38a717e669" + resolved "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz" integrity sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A== dependencies: no-case "^3.0.4" @@ -2394,12 +2041,12 @@ capital-case@^1.0.4: ccount@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/ccount/-/ccount-2.0.1.tgz#17a3bf82302e0870d6da43a01311a8bc02a3ecf5" + resolved "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz" integrity sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg== chai@^5.1.1: version "5.1.2" - resolved "https://registry.yarnpkg.com/chai/-/chai-5.1.2.tgz#3afbc340b994ae3610ca519a6c70ace77ad4378d" + resolved "https://registry.npmjs.org/chai/-/chai-5.1.2.tgz" integrity sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw== dependencies: assertion-error "^2.0.1" @@ -2408,18 +2055,9 @@ chai@^5.1.1: loupe "^3.1.0" pathval "^2.0.0" -chalk@2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.0.tgz#b5ea48efc9c1793dccc9b4767c93914d3f2d52ba" - integrity sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q== - dependencies: - ansi-styles "^3.1.0" - escape-string-regexp "^1.0.5" - supports-color "^4.0.0" - chalk@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" + resolved "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz" integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== dependencies: ansi-styles "^4.1.0" @@ -2427,7 +2065,7 @@ chalk@^3.0.0: chalk@^4.0.0, chalk@^4.1.0: version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: ansi-styles "^4.1.0" @@ -2435,12 +2073,21 @@ chalk@^4.0.0, chalk@^4.1.0: chalk@^5.3.0: version "5.4.1" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.4.1.tgz#1b48bf0963ec158dce2aacf69c093ae2dd2092d8" + resolved "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz" integrity sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w== +chalk@2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz" + integrity sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q== + dependencies: + ansi-styles "^3.1.0" + escape-string-regexp "^1.0.5" + supports-color "^4.0.0" + change-case@^4.1.2: version "4.1.2" - resolved "https://registry.yarnpkg.com/change-case/-/change-case-4.1.2.tgz#fedfc5f136045e2398c0410ee441f95704641e12" + resolved "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz" integrity sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A== dependencies: camel-case "^4.1.2" @@ -2458,37 +2105,37 @@ change-case@^4.1.2: character-entities-html4@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/character-entities-html4/-/character-entities-html4-2.1.0.tgz#1f1adb940c971a4b22ba39ddca6b618dc6e56b2b" + resolved "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz" integrity sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA== character-entities-legacy@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz#76bc83a90738901d7bc223a9e93759fdd560125b" + resolved "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz" integrity sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ== character-entities@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-2.0.2.tgz#2d09c2e72cd9523076ccb21157dff66ad43fcc22" + resolved "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz" integrity sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ== character-reference-invalid@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz#85c66b041e43b47210faf401278abf808ac45cb9" + resolved "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz" integrity sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw== chardet@^0.7.0: version "0.7.0" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + resolved "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== check-error@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/check-error/-/check-error-2.1.1.tgz#87eb876ae71ee388fa0471fe423f494be1d96ccc" + resolved "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz" integrity sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw== chokidar@^3.6.0: version "3.6.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz" integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== dependencies: anymatch "~3.1.2" @@ -2503,55 +2150,55 @@ chokidar@^3.6.0: chokidar@^4.0.0: version "4.0.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-4.0.3.tgz#7be37a4c03c9aee1ecfe862a4a23b2c70c205d30" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz" integrity sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA== dependencies: readdirp "^4.0.1" classnames@^2.3.2: version "2.5.1" - resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.5.1.tgz#ba774c614be0f016da105c858e7159eae8e7687b" + resolved "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz" integrity sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow== clean-stack@^4.0.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-4.2.0.tgz#c464e4cde4ac789f4e0735c5d75beb49d7b30b31" + resolved "https://registry.npmjs.org/clean-stack/-/clean-stack-4.2.0.tgz" integrity sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg== dependencies: escape-string-regexp "5.0.0" cli-cursor@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + resolved "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz" integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== dependencies: restore-cursor "^3.1.0" cli-cursor@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-5.0.0.tgz#24a4831ecf5a6b01ddeb32fb71a4b2088b0dce38" + resolved "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz" integrity sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw== dependencies: restore-cursor "^5.0.0" cli-spinners@^2.5.0, cli-spinners@^2.9.2: version "2.9.2" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.2.tgz#1773a8f4b9c4d6ac31563df53b3fc1d79462fe41" + resolved "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz" integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== cli-width@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-4.1.0.tgz#42daac41d3c254ef38ad8ac037672130173691c5" + resolved "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz" integrity sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ== -client-only@0.0.1, client-only@^0.0.1: +client-only@^0.0.1, client-only@0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1" + resolved "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz" integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== clipboardy@1.2.2: version "1.2.2" - resolved "https://registry.yarnpkg.com/clipboardy/-/clipboardy-1.2.2.tgz#2ce320b9ed9be1514f79878b53ff9765420903e2" + resolved "https://registry.npmjs.org/clipboardy/-/clipboardy-1.2.2.tgz" integrity sha512-16KrBOV7bHmHdxcQiCvfUFYVFyEah4FI8vYT1Fr7CGSA4G+xBWMEfUEQJS1hxeHGtI9ju1Bzs9uXSbj5HZKArw== dependencies: arch "^2.1.0" @@ -2559,22 +2206,17 @@ clipboardy@1.2.2: clone@^1.0.2: version "1.0.4" - resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + resolved "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz" integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== -clsx@2.0.0: +clsx@^2.0.0, clsx@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.0.0.tgz#12658f3fd98fafe62075595a5c30e43d18f3d00b" + resolved "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz" integrity sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q== -clsx@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.1.1.tgz#eed397c9fd8bd882bfb18deab7102049a2f32999" - integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA== - codemirror@^6.0.0: version "6.0.1" - resolved "https://registry.yarnpkg.com/codemirror/-/codemirror-6.0.1.tgz#62b91142d45904547ee3e0e0e4c1a79158035a29" + resolved "https://registry.npmjs.org/codemirror/-/codemirror-6.0.1.tgz" integrity sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg== dependencies: "@codemirror/autocomplete" "^6.0.0" @@ -2587,31 +2229,31 @@ codemirror@^6.0.0: color-convert@^1.9.0: version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== dependencies: color-name "1.1.3" color-convert@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== dependencies: color-name "~1.1.4" -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - color-name@^1.0.0, color-name@~1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + color-string@^1.9.0: version "1.9.1" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" + resolved "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz" integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== dependencies: color-name "^1.0.0" @@ -2619,7 +2261,7 @@ color-string@^1.9.0: color@^4.2.3: version "4.2.3" - resolved "https://registry.yarnpkg.com/color/-/color-4.2.3.tgz#d781ecb5e57224ee43ea9627560107c0e0c6463a" + resolved "https://registry.npmjs.org/color/-/color-4.2.3.tgz" integrity sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A== dependencies: color-convert "^2.0.1" @@ -2627,65 +2269,70 @@ color@^4.2.3: combined-stream@^1.0.8: version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== dependencies: delayed-stream "~1.0.0" comma-separated-tokens@^2.0.0: version "2.0.3" - resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz#4e89c9458acb61bc8fef19f4529973b2392839ee" + resolved "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz" integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg== -commander@7: - version "7.2.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" - integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== - commander@^4.0.0: version "4.1.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" + resolved "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz" integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== commander@^8.3.0: version "8.3.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + resolved "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz" integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== +commander@7: + version "7.2.0" + resolved "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + compute-scroll-into-view@^3.0.2: version "3.1.0" - resolved "https://registry.yarnpkg.com/compute-scroll-into-view/-/compute-scroll-into-view-3.1.0.tgz#753f11d972596558d8fe7c6bcbc8497690ab4c87" + resolved "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-3.1.0.tgz" integrity sha512-rj8l8pD4bJ1nx+dAkMhV1xB5RuZEyVysfxJqB1pRchh1KVvwOv9b7CGB8ZfjTImVv2oF+sYMUkMZq6Na5Ftmbg== concat-map@0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== constant-case@^3.0.4: version "3.0.4" - resolved "https://registry.yarnpkg.com/constant-case/-/constant-case-3.0.4.tgz#3b84a9aeaf4cf31ec45e6bf5de91bdfb0589faf1" + resolved "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz" integrity sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ== dependencies: no-case "^3.0.4" tslib "^2.0.3" upper-case "^2.0.2" +core-js@^3.38.1: + version "3.41.0" + resolved "https://registry.npmjs.org/core-js/-/core-js-3.41.0.tgz" + integrity sha512-SJ4/EHwS36QMJd6h/Rg+GyR4A5xE0FSI3eZ+iBVpfqf1x0eTSg1smWLHrA+2jQThZSh97fmSgFSU8B61nxosxA== + cose-base@^1.0.0: version "1.0.3" - resolved "https://registry.yarnpkg.com/cose-base/-/cose-base-1.0.3.tgz#650334b41b869578a543358b80cda7e0abe0a60a" + resolved "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz" integrity sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg== dependencies: layout-base "^1.0.0" crelt@^1.0.5: version "1.0.6" - resolved "https://registry.yarnpkg.com/crelt/-/crelt-1.0.6.tgz#7cc898ea74e190fb6ef9dae57f8f81cf7302df72" + resolved "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz" integrity sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g== cross-spawn@^5.0.1: version "5.1.0" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz" integrity sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A== dependencies: lru-cache "^4.0.1" @@ -2694,7 +2341,7 @@ cross-spawn@^5.0.1: cross-spawn@^7.0.0, cross-spawn@^7.0.2: version "7.0.6" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz" integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== dependencies: path-key "^3.1.0" @@ -2703,60 +2350,60 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.2: css.escape@^1.5.1: version "1.5.1" - resolved "https://registry.yarnpkg.com/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb" + resolved "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz" integrity sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg== cssesc@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== -csstype@^3.0.2: +csstype@^3.0.2, csstype@^3.1.3: version "3.1.3" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" + resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz" integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== cva@1.0.0-beta.1: version "1.0.0-beta.1" - resolved "https://registry.yarnpkg.com/cva/-/cva-1.0.0-beta.1.tgz#ad5ad2cc744ccf50d6b70f72645a60f9dfd86e8c" + resolved "https://registry.npmjs.org/cva/-/cva-1.0.0-beta.1.tgz" integrity sha512-gznFqTgERU9q4wg7jfgqtt34+RUt9S5t0xDAAEuDwQEAXEgjdDkKXpLLNjwSxsB4Ln/sqWJEH7yhE8Ny0mxd0w== dependencies: clsx "2.0.0" cytoscape-cose-bilkent@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz#762fa121df9930ffeb51a495d87917c570ac209b" + resolved "https://registry.npmjs.org/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz" integrity sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ== dependencies: cose-base "^1.0.0" -cytoscape@^3.28.1: +cytoscape@^3.2.0, cytoscape@^3.28.1: version "3.30.4" - resolved "https://registry.yarnpkg.com/cytoscape/-/cytoscape-3.30.4.tgz#3404da0a159c00a1a3df2c85b2b43fdc66a0e28e" + resolved "https://registry.npmjs.org/cytoscape/-/cytoscape-3.30.4.tgz" integrity sha512-OxtlZwQl1WbwMmLiyPSEBuzeTIQnwZhJYYWFzZ2PhEHVFwpeaqNIkUzSiso00D98qk60l8Gwon2RP304d3BJ1A== -"d3-array@1 - 2": - version "2.12.1" - resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-2.12.1.tgz#e20b41aafcdffdf5d50928004ececf815a465e81" - integrity sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ== - dependencies: - internmap "^1.0.0" - -"d3-array@2 - 3", "d3-array@2.10.0 - 3", "d3-array@2.5.0 - 3", d3-array@3, d3-array@^3.2.0: +d3-array@^3.2.0, "d3-array@2 - 3", "d3-array@2.10.0 - 3", "d3-array@2.5.0 - 3", d3-array@3: version "3.2.4" - resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-3.2.4.tgz#15fec33b237f97ac5d7c986dc77da273a8ed0bb5" + resolved "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz" integrity sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg== dependencies: internmap "1 - 2" +"d3-array@1 - 2": + version "2.12.1" + resolved "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz" + integrity sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ== + dependencies: + internmap "^1.0.0" + d3-axis@3: version "3.0.0" - resolved "https://registry.yarnpkg.com/d3-axis/-/d3-axis-3.0.0.tgz#c42a4a13e8131d637b745fc2973824cfeaf93322" + resolved "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz" integrity sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw== d3-brush@3: version "3.0.0" - resolved "https://registry.yarnpkg.com/d3-brush/-/d3-brush-3.0.0.tgz#6f767c4ed8dcb79de7ede3e1c0f89e63ef64d31c" + resolved "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz" integrity sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ== dependencies: d3-dispatch "1 - 3" @@ -2767,38 +2414,38 @@ d3-brush@3: d3-chord@3: version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-chord/-/d3-chord-3.0.1.tgz#d156d61f485fce8327e6abf339cb41d8cbba6966" + resolved "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz" integrity sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g== dependencies: d3-path "1 - 3" "d3-color@1 - 3", d3-color@3: version "3.1.0" - resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-3.1.0.tgz#395b2833dfac71507f12ac2f7af23bf819de24e2" + resolved "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz" integrity sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA== d3-contour@4: version "4.0.2" - resolved "https://registry.yarnpkg.com/d3-contour/-/d3-contour-4.0.2.tgz#bb92063bc8c5663acb2422f99c73cbb6c6ae3bcc" + resolved "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz" integrity sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA== dependencies: d3-array "^3.2.0" d3-delaunay@6: version "6.0.4" - resolved "https://registry.yarnpkg.com/d3-delaunay/-/d3-delaunay-6.0.4.tgz#98169038733a0a5babbeda55054f795bb9e4a58b" + resolved "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz" integrity sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A== dependencies: delaunator "5" "d3-dispatch@1 - 3", d3-dispatch@3: version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-3.0.1.tgz#5fc75284e9c2375c36c839411a0cf550cbfc4d5e" + resolved "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz" integrity sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg== "d3-drag@2 - 3", d3-drag@3: version "3.0.0" - resolved "https://registry.yarnpkg.com/d3-drag/-/d3-drag-3.0.0.tgz#994aae9cd23c719f53b5e10e3a0a6108c69607ba" + resolved "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz" integrity sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg== dependencies: d3-dispatch "1 - 3" @@ -2806,7 +2453,7 @@ d3-delaunay@6: "d3-dsv@1 - 3", d3-dsv@3: version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-dsv/-/d3-dsv-3.0.1.tgz#c63af978f4d6a0d084a52a673922be2160789b73" + resolved "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz" integrity sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q== dependencies: commander "7" @@ -2815,19 +2462,19 @@ d3-delaunay@6: "d3-ease@1 - 3", d3-ease@3: version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-ease/-/d3-ease-3.0.1.tgz#9658ac38a2140d59d346160f1f6c30fda0bd12f4" + resolved "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz" integrity sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w== d3-fetch@3: version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-fetch/-/d3-fetch-3.0.1.tgz#83141bff9856a0edb5e38de89cdcfe63d0a60a22" + resolved "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz" integrity sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw== dependencies: d3-dsv "1 - 3" d3-force@3: version "3.0.0" - resolved "https://registry.yarnpkg.com/d3-force/-/d3-force-3.0.0.tgz#3e2ba1a61e70888fe3d9194e30d6d14eece155c4" + resolved "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz" integrity sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg== dependencies: d3-dispatch "1 - 3" @@ -2836,56 +2483,56 @@ d3-force@3: "d3-format@1 - 3", d3-format@3: version "3.1.0" - resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-3.1.0.tgz#9260e23a28ea5cb109e93b21a06e24e2ebd55641" + resolved "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz" integrity sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA== d3-geo@3: version "3.1.1" - resolved "https://registry.yarnpkg.com/d3-geo/-/d3-geo-3.1.1.tgz#6027cf51246f9b2ebd64f99e01dc7c3364033a4d" + resolved "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz" integrity sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q== dependencies: d3-array "2.5.0 - 3" d3-hierarchy@3: version "3.1.2" - resolved "https://registry.yarnpkg.com/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz#b01cd42c1eed3d46db77a5966cf726f8c09160c6" + resolved "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz" integrity sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA== "d3-interpolate@1 - 3", "d3-interpolate@1.2.0 - 3", d3-interpolate@3: version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-3.0.1.tgz#3c47aa5b32c5b3dfb56ef3fd4342078a632b400d" + resolved "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz" integrity sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g== dependencies: d3-color "1 - 3" +d3-path@^3.1.0, "d3-path@1 - 3", d3-path@3: + version "3.1.0" + resolved "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz" + integrity sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ== + d3-path@1: version "1.0.9" - resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-1.0.9.tgz#48c050bb1fe8c262493a8caf5524e3e9591701cf" + resolved "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz" integrity sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg== -"d3-path@1 - 3", d3-path@3, d3-path@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-3.1.0.tgz#22df939032fb5a71ae8b1800d61ddb7851c42526" - integrity sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ== - d3-polygon@3: version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-polygon/-/d3-polygon-3.0.1.tgz#0b45d3dd1c48a29c8e057e6135693ec80bf16398" + resolved "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz" integrity sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg== "d3-quadtree@1 - 3", d3-quadtree@3: version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-quadtree/-/d3-quadtree-3.0.1.tgz#6dca3e8be2b393c9a9d514dabbd80a92deef1a4f" + resolved "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz" integrity sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw== d3-random@3: version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-random/-/d3-random-3.0.1.tgz#d4926378d333d9c0bfd1e6fa0194d30aebaa20f4" + resolved "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz" integrity sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ== d3-sankey@^0.12.3: version "0.12.3" - resolved "https://registry.yarnpkg.com/d3-sankey/-/d3-sankey-0.12.3.tgz#b3c268627bd72e5d80336e8de6acbfec9d15d01d" + resolved "https://registry.npmjs.org/d3-sankey/-/d3-sankey-0.12.3.tgz" integrity sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ== dependencies: d3-array "1 - 2" @@ -2893,7 +2540,7 @@ d3-sankey@^0.12.3: d3-scale-chromatic@3: version "3.1.0" - resolved "https://registry.yarnpkg.com/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz#34c39da298b23c20e02f1a4b239bd0f22e7f1314" + resolved "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz" integrity sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ== dependencies: d3-color "1 - 3" @@ -2901,7 +2548,7 @@ d3-scale-chromatic@3: d3-scale@4: version "4.0.2" - resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-4.0.2.tgz#82b38e8e8ff7080764f8dcec77bd4be393689396" + resolved "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz" integrity sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ== dependencies: d3-array "2.10.0 - 3" @@ -2912,45 +2559,45 @@ d3-scale@4: "d3-selection@2 - 3", d3-selection@3: version "3.0.0" - resolved "https://registry.yarnpkg.com/d3-selection/-/d3-selection-3.0.0.tgz#c25338207efa72cc5b9bd1458a1a41901f1e1b31" + resolved "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz" integrity sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ== -d3-shape@3: - version "3.2.0" - resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-3.2.0.tgz#a1a839cbd9ba45f28674c69d7f855bcf91dfc6a5" - integrity sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA== - dependencies: - d3-path "^3.1.0" - d3-shape@^1.2.0: version "1.3.7" - resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-1.3.7.tgz#df63801be07bc986bc54f63789b4fe502992b5d7" + resolved "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz" integrity sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw== dependencies: d3-path "1" +d3-shape@3: + version "3.2.0" + resolved "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz" + integrity sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA== + dependencies: + d3-path "^3.1.0" + "d3-time-format@2 - 4", d3-time-format@4: version "4.1.0" - resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-4.1.0.tgz#7ab5257a5041d11ecb4fe70a5c7d16a195bb408a" + resolved "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz" integrity sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg== dependencies: d3-time "1 - 3" "d3-time@1 - 3", "d3-time@2.1.1 - 3", d3-time@3: version "3.1.0" - resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-3.1.0.tgz#9310db56e992e3c0175e1ef385e545e48a9bb5c7" + resolved "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz" integrity sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q== dependencies: d3-array "2 - 3" "d3-timer@1 - 3", d3-timer@3: version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-3.0.1.tgz#6284d2a2708285b1abb7e201eda4380af35e63b0" + resolved "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz" integrity sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA== "d3-transition@2 - 3", d3-transition@3: version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-transition/-/d3-transition-3.0.1.tgz#6869fdde1448868077fdd5989200cb61b2a1645f" + resolved "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz" integrity sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w== dependencies: d3-color "1 - 3" @@ -2961,7 +2608,7 @@ d3-shape@^1.2.0: d3-zoom@3: version "3.0.0" - resolved "https://registry.yarnpkg.com/d3-zoom/-/d3-zoom-3.0.0.tgz#d13f4165c73217ffeaa54295cd6969b3e7aee8f3" + resolved "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz" integrity sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw== dependencies: d3-dispatch "1 - 3" @@ -2972,7 +2619,7 @@ d3-zoom@3: d3@^7.4.0, d3@^7.8.2: version "7.9.0" - resolved "https://registry.yarnpkg.com/d3/-/d3-7.9.0.tgz#579e7acb3d749caf8860bd1741ae8d371070cd5d" + resolved "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz" integrity sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA== dependencies: d3-array "3" @@ -3008,7 +2655,7 @@ d3@^7.4.0, d3@^7.8.2: dagre-d3-es@7.0.10: version "7.0.10" - resolved "https://registry.yarnpkg.com/dagre-d3-es/-/dagre-d3-es-7.0.10.tgz#19800d4be674379a3cd8c86a8216a2ac6827cadc" + resolved "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.10.tgz" integrity sha512-qTCQmEhcynucuaZgY5/+ti3X/rnszKZhEQH/ZdWdtP1tA/y3VoHJzcVrO9pjjJCNpigfscAtoUB5ONcd2wNn0A== dependencies: d3 "^7.8.2" @@ -3016,12 +2663,12 @@ dagre-d3-es@7.0.10: damerau-levenshtein@^1.0.8: version "1.0.8" - resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" + resolved "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz" integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== data-view-buffer@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.2.tgz#211a03ba95ecaf7798a8c7198d79536211f88570" + resolved "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz" integrity sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ== dependencies: call-bound "^1.0.3" @@ -3030,7 +2677,7 @@ data-view-buffer@^1.0.2: data-view-byte-length@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz#9e80f7ca52453ce3e93d25a35318767ea7704735" + resolved "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz" integrity sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ== dependencies: call-bound "^1.0.3" @@ -3039,7 +2686,7 @@ data-view-byte-length@^1.0.2: data-view-byte-offset@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz#068307f9b71ab76dbbe10291389e020856606191" + resolved "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz" integrity sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ== dependencies: call-bound "^1.0.2" @@ -3048,78 +2695,83 @@ data-view-byte-offset@^1.0.1: date-fns@^2.15.0: version "2.30.0" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.30.0.tgz#f367e644839ff57894ec6ac480de40cae4b0f4d0" + resolved "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz" integrity sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw== dependencies: "@babel/runtime" "^7.21.0" date-fns@^3.6.0: version "3.6.0" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-3.6.0.tgz#f20ca4fe94f8b754951b24240676e8618c0206bf" + resolved "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz" integrity sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww== dayjs@^1.11.7: version "1.11.13" - resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.13.tgz#92430b0139055c3ebb60150aa13e860a4b5a366c" + resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz" integrity sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg== debug@^2.1.3: version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" debug@^3.2.7: version "3.2.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== dependencies: ms "^2.1.1" debug@^4.0.0, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.7: version "4.4.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a" + resolved "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz" integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== dependencies: ms "^2.1.3" decode-named-character-reference@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz#daabac9690874c394c81e4162a0304b35d824f0e" + resolved "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz" integrity sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg== dependencies: character-entities "^2.0.0" deep-eql@^5.0.1: version "5.0.2" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-5.0.2.tgz#4b756d8d770a9257300825d52a2c2cff99c3a341" + resolved "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz" integrity sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q== deep-is@^0.1.3: version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== defaults@^1.0.3: version "1.0.4" - resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a" + resolved "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz" integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== dependencies: clone "^1.0.2" define-data-property@^1.0.1, define-data-property@^1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + resolved "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz" integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== dependencies: es-define-property "^1.0.0" es-errors "^1.3.0" gopd "^1.0.1" +define-lazy-prop@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz" + integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== + define-properties@^1.1.3, define-properties@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz" integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== dependencies: define-data-property "^1.0.1" @@ -3128,7 +2780,7 @@ define-properties@^1.1.3, define-properties@^1.2.1: del@^7.1.0: version "7.1.0" - resolved "https://registry.yarnpkg.com/del/-/del-7.1.0.tgz#0de0044d556b649ff05387f1fa7c885e155fd1b6" + resolved "https://registry.npmjs.org/del/-/del-7.1.0.tgz" integrity sha512-v2KyNk7efxhlyHpjEvfyxaAihKKK0nWCuf6ZtqZcFFpQRG0bJ12Qsr0RpvsICMjAAZ8DOVCxrlqpxISlMHC4Kg== dependencies: globby "^13.1.2" @@ -3142,102 +2794,102 @@ del@^7.1.0: delaunator@5: version "5.0.1" - resolved "https://registry.yarnpkg.com/delaunator/-/delaunator-5.0.1.tgz#39032b08053923e924d6094fe2cde1a99cc51278" + resolved "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz" integrity sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw== dependencies: robust-predicates "^3.0.2" delayed-stream@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== dequal@^2.0.0, dequal@^2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" + resolved "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz" integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== detect-file@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" + resolved "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz" integrity sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q== detect-libc@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + resolved "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz" integrity sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg== detect-libc@^2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700" + resolved "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz" integrity sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw== detect-node-es@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/detect-node-es/-/detect-node-es-1.1.0.tgz#163acdf643330caa0b4cd7c21e7ee7755d6fa493" + resolved "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz" integrity sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ== devlop@^1.0.0, devlop@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/devlop/-/devlop-1.1.0.tgz#4db7c2ca4dc6e0e834c30be70c94bbc976dc7018" + resolved "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz" integrity sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA== dependencies: dequal "^2.0.0" didyoumean@^1.2.2: version "1.2.2" - resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" + resolved "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz" integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== diff@^5.0.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-5.2.0.tgz#26ded047cd1179b78b9537d5ef725503ce1ae531" + resolved "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz" integrity sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A== dir-glob@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== dependencies: path-type "^4.0.0" dlv@^1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" + resolved "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz" integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== doctrine@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz" integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== dependencies: esutils "^2.0.2" doctrine@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== dependencies: esutils "^2.0.2" dom-accessibility-api@^0.5.9: version "0.5.16" - resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz#5a7429e6066eb3664d911e33fb0e45de8eb08453" + resolved "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz" integrity sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg== dom-accessibility-api@^0.6.3: version "0.6.3" - resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz#993e925cc1d73f2c662e7d75dd5a5445259a8fd8" + resolved "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz" integrity sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w== "dompurify@^3.0.5 <3.1.7": version "3.1.6" - resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-3.1.6.tgz#43c714a94c6a7b8801850f82e756685300a027e2" + resolved "https://registry.npmjs.org/dompurify/-/dompurify-3.1.6.tgz" integrity sha512-cTOAhc36AalkjtBpfG6O8JimdTMWNXjiePT2xQH/ppBGi/4uIpmj8eKyIkMJErXWARyINV/sB38yf8JCLF5pbQ== dot-case@^3.0.4: version "3.0.4" - resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" + resolved "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz" integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== dependencies: no-case "^3.0.4" @@ -3245,7 +2897,7 @@ dot-case@^3.0.4: dunder-proto@^1.0.0, dunder-proto@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" + 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.1" @@ -3254,37 +2906,37 @@ dunder-proto@^1.0.0, dunder-proto@^1.0.1: eastasianwidth@^0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + resolved "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz" integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== electron-to-chromium@^1.5.73: version "1.5.76" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.76.tgz#db20295c5061b68f07c8ea4dfcbd701485d94a3d" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.76.tgz" integrity sha512-CjVQyG7n7Sr+eBXE86HIulnL5N8xZY1sgmOPGuq/F0Rr0FJq63lg0kEtOIDfZBk44FnDLf6FUJ+dsJcuiUDdDQ== elkjs@^0.9.0: version "0.9.3" - resolved "https://registry.yarnpkg.com/elkjs/-/elkjs-0.9.3.tgz#16711f8ceb09f1b12b99e971b138a8384a529161" + resolved "https://registry.npmjs.org/elkjs/-/elkjs-0.9.3.tgz" integrity sha512-f/ZeWvW/BCXbhGEf1Ujp29EASo/lk1FDnETgNKwJrsVvGZhUWCZyg3xLJjAsxfOmt8KjswHmI5EwCQcPMpOYhQ== embla-carousel-auto-height@^8.0.0: version "8.5.1" - resolved "https://registry.yarnpkg.com/embla-carousel-auto-height/-/embla-carousel-auto-height-8.5.1.tgz#1c54b35d57919b421b5d83462cce6b59b2f41bad" + resolved "https://registry.npmjs.org/embla-carousel-auto-height/-/embla-carousel-auto-height-8.5.1.tgz" integrity sha512-pH0LlCEX6D2uNf0zuEHPL14YCnlJK+xIlhjcWNy53TG+9qDPgUUwBLBoAdbWro+8/MzqzVf+kHDgsy25jkzu4g== embla-carousel-auto-scroll@^8.0.0: version "8.5.1" - resolved "https://registry.yarnpkg.com/embla-carousel-auto-scroll/-/embla-carousel-auto-scroll-8.5.1.tgz#314f2acc2e24697d841ee9a4556d0aacaa16a804" + resolved "https://registry.npmjs.org/embla-carousel-auto-scroll/-/embla-carousel-auto-scroll-8.5.1.tgz" integrity sha512-fbkZ5+kPHJnJ0aVhRClodnBuaWp8RvV/AW4ex+YhXtvkTld9ApAxmyKQsZzycQc24uz15kzyRjSTNfEvzXPYuQ== embla-carousel-autoplay@^8.0.0: version "8.5.1" - resolved "https://registry.yarnpkg.com/embla-carousel-autoplay/-/embla-carousel-autoplay-8.5.1.tgz#d0213ab6d7beeafcfcb8f7b1fa023a4d3882f0a2" + resolved "https://registry.npmjs.org/embla-carousel-autoplay/-/embla-carousel-autoplay-8.5.1.tgz" integrity sha512-FnZklFpePfp8wbj177UwVaGFehgs+ASVcJvYLWTtHuYKURynCc3IdDn2qrn0E5Qpa3g9yeGwCS4p8QkrZmO8xg== embla-carousel-react@^8.0.0: version "8.5.1" - resolved "https://registry.yarnpkg.com/embla-carousel-react/-/embla-carousel-react-8.5.1.tgz#e06ff28cb53698d453ffad89423c23d725e9b010" + resolved "https://registry.npmjs.org/embla-carousel-react/-/embla-carousel-react-8.5.1.tgz" integrity sha512-z9Y0K84BJvhChXgqn2CFYbfEi6AwEr+FFVVKm/MqbTQ2zIzO1VQri6w67LcfpVF0AjbhwVMywDZqY4alYkjW5w== dependencies: embla-carousel "8.5.1" @@ -3292,32 +2944,32 @@ embla-carousel-react@^8.0.0: embla-carousel-reactive-utils@8.5.1: version "8.5.1" - resolved "https://registry.yarnpkg.com/embla-carousel-reactive-utils/-/embla-carousel-reactive-utils-8.5.1.tgz#3059ab2f72f04988a96694f700a772a72bb75ffb" + resolved "https://registry.npmjs.org/embla-carousel-reactive-utils/-/embla-carousel-reactive-utils-8.5.1.tgz" integrity sha512-n7VSoGIiiDIc4MfXF3ZRTO59KDp820QDuyBDGlt5/65+lumPHxX2JLz0EZ23hZ4eg4vZGUXwMkYv02fw2JVo/A== embla-carousel@8.5.1: version "8.5.1" - resolved "https://registry.yarnpkg.com/embla-carousel/-/embla-carousel-8.5.1.tgz#8d83217e831666f6df573b0d3727ff0ae9208002" + resolved "https://registry.npmjs.org/embla-carousel/-/embla-carousel-8.5.1.tgz" integrity sha512-JUb5+FOHobSiWQ2EJNaueCNT/cQU9L6XWBbWmorWPQT9bkbk+fhsuLr8wWrzXKagO3oWszBO7MSx+GfaRk4E6A== emoji-regex@^10.3.0: version "10.4.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.4.0.tgz#03553afea80b3975749cfcb36f776ca268e413d4" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz" integrity sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw== emoji-regex@^8.0.0: version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== emoji-regex@^9.2.2: version "9.2.2" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== enhanced-resolve@^5.15.0: version "5.18.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.18.0.tgz#91eb1db193896b9801251eeff1c6980278b1e404" + resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.0.tgz" integrity sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ== dependencies: graceful-fs "^4.2.4" @@ -3325,12 +2977,12 @@ enhanced-resolve@^5.15.0: entities@^4.5.0: version "4.5.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + resolved "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz" integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== es-abstract@^1.17.5, es-abstract@^1.23.2, es-abstract@^1.23.3, es-abstract@^1.23.5, es-abstract@^1.23.6: version "1.23.8" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.8.tgz#99754723118355d82fcef9ce4c90ccbcd5d2a285" + resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.8.tgz" integrity sha512-lfab8IzDn6EpI1ibZakcgS6WsfEBiB+43cuJo+wgylx1xKXf+Sp+YR3vFuQwC/u3sxYwV8Cxe3B0DpVUu/WiJQ== dependencies: array-buffer-byte-length "^1.0.2" @@ -3385,17 +3037,17 @@ es-abstract@^1.17.5, es-abstract@^1.23.2, es-abstract@^1.23.3, es-abstract@^1.23 es-define-property@^1.0.0, es-define-property@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" + resolved "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz" integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== es-errors@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + resolved "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz" integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== es-iterator-helpers@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz#d1dd0f58129054c0ad922e6a9a1e65eef435fe75" + resolved "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz" integrity sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w== dependencies: call-bind "^1.0.8" @@ -3417,14 +3069,14 @@ es-iterator-helpers@^1.2.1: es-object-atoms@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941" + resolved "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz" integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== dependencies: es-errors "^1.3.0" es-set-tostringtag@^2.0.3: version "2.1.0" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz#f31dbbe0c183b00a6d26eb6325c810c0fd18bd4d" + resolved "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz" integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA== dependencies: es-errors "^1.3.0" @@ -3434,23 +3086,30 @@ es-set-tostringtag@^2.0.3: es-shim-unscopables@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" + resolved "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz" integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== dependencies: hasown "^2.0.0" es-to-primitive@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.3.0.tgz#96c89c82cc49fd8794a24835ba3e1ff87f214e18" + resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz" integrity sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g== dependencies: is-callable "^1.2.7" is-date-object "^1.0.5" is-symbol "^1.0.4" -esbuild@^0.21.3: +esbuild-register@^3.5.0: + version "3.6.0" + resolved "https://registry.npmjs.org/esbuild-register/-/esbuild-register-3.6.0.tgz" + integrity sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg== + dependencies: + debug "^4.3.4" + +"esbuild@^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0", esbuild@^0.21.3, "esbuild@>=0.12 <1": version "0.21.5" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.21.5.tgz#9ca301b120922959b766360d8ac830da0d02997d" + resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz" integrity sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw== optionalDependencies: "@esbuild/aix-ppc64" "0.21.5" @@ -3479,27 +3138,27 @@ esbuild@^0.21.3: escalade@^3.2.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz" integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== -escape-string-regexp@5.0.0, escape-string-regexp@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8" - integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== - escape-string-regexp@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== escape-string-regexp@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== +escape-string-regexp@^5.0.0, escape-string-regexp@5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz" + integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== + eslint-config-next@14.1.4: version "14.1.4" - resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-14.1.4.tgz#22f2ba4c0993e991249d863656a64c204bae542c" + resolved "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.1.4.tgz" integrity sha512-cihIahbhYAWwXJwZkAaRPpUi5t9aOi/HdfWXOjZeUOqNWXHD8X22kd1KG58Dc3MVaRx3HoR/oMGk2ltcrqDn8g== dependencies: "@next/eslint-plugin-next" "14.1.4" @@ -3514,7 +3173,7 @@ eslint-config-next@14.1.4: eslint-import-resolver-node@^0.3.6, eslint-import-resolver-node@^0.3.9: version "0.3.9" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" + resolved "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz" integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== dependencies: debug "^3.2.7" @@ -3523,7 +3182,7 @@ eslint-import-resolver-node@^0.3.6, eslint-import-resolver-node@^0.3.9: eslint-import-resolver-typescript@^3.5.2: version "3.7.0" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.7.0.tgz#e69925936a771a9cb2de418ccebc4cdf6c0818aa" + resolved "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.7.0.tgz" integrity sha512-Vrwyi8HHxY97K5ebydMtffsWAn1SCR9eol49eCd5fJS4O1WV7PaAjbcjmbfJJSMz/t4Mal212Uz/fQZrOB8mow== dependencies: "@nolyfill/is-core-module" "1.0.39" @@ -3537,14 +3196,14 @@ eslint-import-resolver-typescript@^3.5.2: eslint-module-utils@^2.12.0: version "2.12.0" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz#fe4cfb948d61f49203d7b08871982b65b9af0b0b" + resolved "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz" integrity sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg== dependencies: debug "^3.2.7" -eslint-plugin-import@^2.28.1: +eslint-plugin-import@*, eslint-plugin-import@^2.28.1: version "2.31.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz#310ce7e720ca1d9c0bb3f69adfd1c6bdd7d9e0e7" + resolved "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz" integrity sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A== dependencies: "@rtsao/scc" "^1.1.0" @@ -3569,7 +3228,7 @@ eslint-plugin-import@^2.28.1: eslint-plugin-jsx-a11y@^6.7.1: version "6.10.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz#d2812bb23bf1ab4665f1718ea442e8372e638483" + resolved "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz" integrity sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q== dependencies: aria-query "^5.3.2" @@ -3590,12 +3249,12 @@ eslint-plugin-jsx-a11y@^6.7.1: "eslint-plugin-react-hooks@^4.5.0 || 5.0.0-canary-7118f5dd7-20230705": version "5.0.0-canary-7118f5dd7-20230705" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.0.0-canary-7118f5dd7-20230705.tgz#4d55c50e186f1a2b0636433d2b0b2f592ddbccfd" + resolved "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.0.0-canary-7118f5dd7-20230705.tgz" integrity sha512-AZYbMo/NW9chdL7vk6HQzQhT+PvTAEVqWk9ziruUoW2kAOcN5qNyelv70e0F1VNQAbvutOC9oc+xfWycI9FxDw== eslint-plugin-react@^7.33.2: version "7.37.3" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.37.3.tgz#567549e9251533975c4ea9706f986c3a64832031" + resolved "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.3.tgz" integrity sha512-DomWuTQPFYZwF/7c9W2fkKkStqZmBd3uugfqBYLdkZ3Hii23WzZuOLUskGxB8qkSKqftxEeGL1TB2kMhrce0jA== dependencies: array-includes "^3.1.8" @@ -3619,7 +3278,7 @@ eslint-plugin-react@^7.33.2: eslint-scope@^7.2.2: version "7.2.2" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz" integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== dependencies: esrecurse "^4.3.0" @@ -3627,12 +3286,12 @@ eslint-scope@^7.2.2: eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: version "3.4.3" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== -eslint@^8: +eslint@*, "eslint@^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9", "eslint@^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9", "eslint@^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7", "eslint@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^7.0.0 || ^8.0.0", "eslint@^7.23.0 || ^8.0.0", eslint@^8: version "8.57.1" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.1.tgz#7df109654aba7e3bbe5c8eae533c5e461d3c6ca9" + resolved "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz" integrity sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA== dependencies: "@eslint-community/eslint-utils" "^4.2.0" @@ -3676,47 +3335,47 @@ eslint@^8: espree@^9.6.0, espree@^9.6.1: version "9.6.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" + resolved "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz" integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== dependencies: acorn "^8.9.0" acorn-jsx "^5.3.2" eslint-visitor-keys "^3.4.1" -esprima@^4.0.0: +esprima@^4.0.0, esprima@~4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== esquery@^1.4.2: version "1.6.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" + resolved "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz" integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== dependencies: estraverse "^5.1.0" esrecurse@^4.3.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== dependencies: estraverse "^5.2.0" estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== estree-util-attach-comments@^2.0.0: version "2.1.1" - resolved "https://registry.yarnpkg.com/estree-util-attach-comments/-/estree-util-attach-comments-2.1.1.tgz#ee44f4ff6890ee7dfb3237ac7810154c94c63f84" + resolved "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-2.1.1.tgz" integrity sha512-+5Ba/xGGS6mnwFbXIuQiDPTbuTxuMCooq3arVv7gPZtYpjp+VXH/NkHAP35OOefPhNG/UGqU3vt/LTABwcHX0w== dependencies: "@types/estree" "^1.0.0" estree-util-build-jsx@^2.0.0: version "2.2.2" - resolved "https://registry.yarnpkg.com/estree-util-build-jsx/-/estree-util-build-jsx-2.2.2.tgz#32f8a239fb40dc3f3dca75bb5dcf77a831e4e47b" + resolved "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-2.2.2.tgz" integrity sha512-m56vOXcOBuaF+Igpb9OPAy7f9w9OIkb5yhjsZuaPm7HoGi4oTOQi0h2+yZ+AtKklYFZ+rPC4n0wYCJCEU1ONqg== dependencies: "@types/estree-jsx" "^1.0.0" @@ -3725,17 +3384,17 @@ estree-util-build-jsx@^2.0.0: estree-util-is-identifier-name@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/estree-util-is-identifier-name/-/estree-util-is-identifier-name-2.1.0.tgz#fb70a432dcb19045e77b05c8e732f1364b4b49b2" + resolved "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-2.1.0.tgz" integrity sha512-bEN9VHRyXAUOjkKVQVvArFym08BTWB0aJPppZZr0UNyAqWsLaVfAqP7hbaTJjzHifmB5ebnR8Wm7r7yGN/HonQ== estree-util-is-identifier-name@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz#0b5ef4c4ff13508b34dcd01ecfa945f61fce5dbd" + resolved "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz" integrity sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg== estree-util-to-js@^1.1.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/estree-util-to-js/-/estree-util-to-js-1.2.0.tgz#0f80d42443e3b13bd32f7012fffa6f93603f4a36" + resolved "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-1.2.0.tgz" integrity sha512-IzU74r1PK5IMMGZXUVZbmiu4A1uhiPgW5hm1GjcOfr4ZzHaMPpLNJjR7HjXiIOzi25nZDrgFTobHTkV5Q6ITjA== dependencies: "@types/estree-jsx" "^1.0.0" @@ -3744,34 +3403,39 @@ estree-util-to-js@^1.1.0: estree-util-value-to-estree@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/estree-util-value-to-estree/-/estree-util-value-to-estree-1.3.0.tgz#1d3125594b4d6680f666644491e7ac1745a3df49" + resolved "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-1.3.0.tgz" integrity sha512-Y+ughcF9jSUJvncXwqRageavjrNPAI+1M/L3BI3PyLp1nmgYTGUXU6t5z1Y7OWuThoDdhPME07bQU+d5LxdJqw== dependencies: is-plain-obj "^3.0.0" estree-util-visit@^1.0.0: version "1.2.1" - resolved "https://registry.yarnpkg.com/estree-util-visit/-/estree-util-visit-1.2.1.tgz#8bc2bc09f25b00827294703835aabee1cc9ec69d" + resolved "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-1.2.1.tgz" integrity sha512-xbgqcrkIVbIG+lI/gzbvd9SGTJL4zqJKBFttUl5pP27KhAjtMKbX/mQXJ7qgyXpMgVy/zvpm0xoQQaGL8OloOw== dependencies: "@types/estree-jsx" "^1.0.0" "@types/unist" "^2.0.0" +estree-walker@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz" + integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== + estree-walker@^3.0.0, estree-walker@^3.0.3: version "3.0.3" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-3.0.3.tgz#67c3e549ec402a487b4fc193d1953a524752340d" + resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz" integrity sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g== dependencies: "@types/estree" "^1.0.0" esutils@^2.0.2: version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== execa@^0.8.0: version "0.8.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-0.8.0.tgz#d8d76bbc1b55217ed190fd6dd49d3c774ecfc8da" + resolved "https://registry.npmjs.org/execa/-/execa-0.8.0.tgz" integrity sha512-zDWS+Rb1E8BlqqhALSt9kUhss8Qq4nN3iof3gsOdyINksElaPyNBtKUMTR62qhvgVWR0CqCX7sdnKe4MnUbFEA== dependencies: cross-spawn "^5.0.1" @@ -3784,26 +3448,26 @@ execa@^0.8.0: expand-tilde@^2.0.0, expand-tilde@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" + resolved "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz" integrity sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw== dependencies: homedir-polyfill "^1.0.1" extend-shallow@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + resolved "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz" integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== dependencies: is-extendable "^0.1.0" extend@^3.0.0, extend@^3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + resolved "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== external-editor@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + resolved "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz" integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== dependencies: chardet "^0.7.0" @@ -3812,12 +3476,12 @@ external-editor@^3.1.0: fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-glob@^3.2.12, fast-glob@^3.2.9, fast-glob@^3.3.0, fast-glob@^3.3.2: version "3.3.2" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz" integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== dependencies: "@nodelib/fs.stat" "^2.0.2" @@ -3828,43 +3492,48 @@ fast-glob@^3.2.12, fast-glob@^3.2.9, fast-glob@^3.3.0, fast-glob@^3.3.2: fast-json-stable-stringify@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== fast-levenshtein@^2.0.6: version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== fast-uri@^3.0.1: version "3.0.3" - resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.3.tgz#892a1c91802d5d7860de728f18608a0573142241" + resolved "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.3.tgz" integrity sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw== fastq@^1.6.0: version "1.18.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.18.0.tgz#d631d7e25faffea81887fe5ea8c9010e1b36fee0" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz" integrity sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw== dependencies: reusify "^1.0.4" +fflate@^0.4.8: + version "0.4.8" + resolved "https://registry.npmjs.org/fflate/-/fflate-0.4.8.tgz" + integrity sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA== + file-entry-cache@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== dependencies: flat-cache "^3.0.4" fill-range@^7.1.1: version "7.1.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz" integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== dependencies: to-regex-range "^5.0.1" find-up@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== dependencies: locate-path "^6.0.0" @@ -3872,7 +3541,7 @@ find-up@^5.0.0: findup-sync@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-5.0.0.tgz#54380ad965a7edca00cc8f63113559aadc541bd2" + resolved "https://registry.npmjs.org/findup-sync/-/findup-sync-5.0.0.tgz" integrity sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ== dependencies: detect-file "^1.0.0" @@ -3882,7 +3551,7 @@ findup-sync@^5.0.0: fined@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/fined/-/fined-2.0.0.tgz#6846563ed96879ce6de6c85c715c42250f8d8089" + resolved "https://registry.npmjs.org/fined/-/fined-2.0.0.tgz" integrity sha512-OFRzsL6ZMHz5s0JrsEr+TpdGNCtrVtnuG3x1yzGNiQHT0yaDnXAj8V/lWcpJVrnoDpcwXcASxAZYbuXda2Y82A== dependencies: expand-tilde "^2.0.2" @@ -3893,12 +3562,12 @@ fined@^2.0.0: flagged-respawn@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-2.0.0.tgz#abf39719dcfe1ac06c86c9466081c541c682987b" + resolved "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-2.0.0.tgz" integrity sha512-Gq/a6YCi8zexmGHMuJwahTGzXlAZAOsbCVKduWXC6TlLCjjFRlExMJc4GC2NYPYZ0r/brw9P7CpRgQmlPVeOoA== flat-cache@^3.0.4: version "3.2.0" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" + resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz" integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== dependencies: flatted "^3.2.9" @@ -3907,46 +3576,46 @@ flat-cache@^3.0.4: flatted@^3.2.9: version "3.3.2" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.2.tgz#adba1448a9841bec72b42c532ea23dbbedef1a27" + resolved "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz" integrity sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA== flexsearch@^0.7.31: version "0.7.43" - resolved "https://registry.yarnpkg.com/flexsearch/-/flexsearch-0.7.43.tgz#34f89b36278a466ce379c5bf6fb341965ed3f16c" + resolved "https://registry.npmjs.org/flexsearch/-/flexsearch-0.7.43.tgz" integrity sha512-c5o/+Um8aqCSOXGcZoqZOm+NqtVwNsvVpWv6lfmSclU954O3wvQKxxK8zj74fPaSJbXpSLTs4PRhh+wnoCXnKg== focus-visible@^5.2.0: version "5.2.1" - resolved "https://registry.yarnpkg.com/focus-visible/-/focus-visible-5.2.1.tgz#38615e8be4d4df7819a0d9d92cdee4fda183ac96" + resolved "https://registry.npmjs.org/focus-visible/-/focus-visible-5.2.1.tgz" integrity sha512-8Bx950VD1bWTQJEH/AM6SpEk+SU55aVnp4Ujhuuxy3eMEBCRwBnTBnVXr9YAPvZL3/CNjCa8u4IWfNmEO53whA== follow-redirects@^1.15.6: version "1.15.9" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz" integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== for-each@^0.3.3: version "0.3.3" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz" integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== dependencies: is-callable "^1.1.3" for-in@^1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + resolved "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz" integrity sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ== for-own@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b" + resolved "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz" integrity sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg== dependencies: for-in "^1.0.1" foreground-child@^3.1.0: version "3.3.0" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.0.tgz#0ac8644c06e431439f8561db8ecf29a7b5519c77" + resolved "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz" integrity sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg== dependencies: cross-spawn "^7.0.0" @@ -3954,7 +3623,7 @@ foreground-child@^3.1.0: form-data@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.1.tgz#ba1076daaaa5bfd7e99c1a6cb02aa0a5cff90d48" + resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz" integrity sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw== dependencies: asynckit "^0.4.0" @@ -3963,7 +3632,7 @@ form-data@^4.0.0: formdata-node@^4.4.1: version "4.4.1" - resolved "https://registry.yarnpkg.com/formdata-node/-/formdata-node-4.4.1.tgz#23f6a5cb9cb55315912cbec4ff7b0f59bbd191e2" + resolved "https://registry.npmjs.org/formdata-node/-/formdata-node-4.4.1.tgz" integrity sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ== dependencies: node-domexception "1.0.0" @@ -3971,32 +3640,30 @@ formdata-node@^4.4.1: fraction.js@^4.3.7: version "4.3.7" - resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7" + resolved "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz" integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== fs.realpath@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== fs@^0.0.1-security: version "0.0.1-security" - resolved "https://registry.yarnpkg.com/fs/-/fs-0.0.1-security.tgz#8a7bd37186b6dddf3813f23858b57ecaaf5e41d4" + resolved "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz" integrity sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w== fsevents@~2.3.2, fsevents@~2.3.3: version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== function-bind@^1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== function.prototype.name@^1.1.6, function.prototype.name@^1.1.8: version "1.1.8" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.8.tgz#e68e1df7b259a5c949eeef95cdbde53edffabb78" + resolved "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz" integrity sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q== dependencies: call-bind "^1.0.8" @@ -4008,22 +3675,22 @@ function.prototype.name@^1.1.6, function.prototype.name@^1.1.8: functions-have-names@^1.2.3: version "1.2.3" - resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== fuse.js@^6.6.2: version "6.6.2" - resolved "https://registry.yarnpkg.com/fuse.js/-/fuse.js-6.6.2.tgz#fe463fed4b98c0226ac3da2856a415576dc9a111" + resolved "https://registry.npmjs.org/fuse.js/-/fuse.js-6.6.2.tgz" integrity sha512-cJaJkxCCxC8qIIcPBF9yGxY0W/tVZS3uEISDxhYIdtk8OL93pe+6Zj7LjCqVV4dzbqcriOZ+kQ/NE4RXZHsIGA== get-east-asian-width@^1.0.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz#21b4071ee58ed04ee0db653371b55b4299875389" + resolved "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz" integrity sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ== get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.2.6: version "1.2.6" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.6.tgz#43dd3dd0e7b49b82b2dfcad10dc824bf7fc265d5" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.6.tgz" integrity sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA== dependencies: call-bind-apply-helpers "^1.0.1" @@ -4039,17 +3706,17 @@ get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.2.6: get-nonce@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/get-nonce/-/get-nonce-1.0.1.tgz#fdf3f0278073820d2ce9426c18f07481b1e0cdf3" + resolved "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz" integrity sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q== get-own-enumerable-property-symbols@^3.0.0: version "3.0.2" - resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" + resolved "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz" integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== get-proto@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.0.tgz#2f14be4ab6a5ba2ca65b49defb544280730d9c5c" + resolved "https://registry.npmjs.org/get-proto/-/get-proto-1.0.0.tgz" integrity sha512-TtLgOcKaF1nMP2ijJnITkE4nRhbpshHhmzKiuhmSniiwWzovoqwqQ8rNuhf0mXJOqIY5iU+QkUe0CkJYrLsG9w== dependencies: dunder-proto "^1.0.1" @@ -4057,12 +3724,12 @@ get-proto@^1.0.0: get-stream@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz" integrity sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ== get-symbol-description@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.1.0.tgz#7bdd54e0befe8ffc9f3b4e203220d9f1e881b6ee" + resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz" integrity sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg== dependencies: call-bound "^1.0.3" @@ -4071,14 +3738,14 @@ get-symbol-description@^1.1.0: get-tsconfig@^4.7.5: version "4.8.1" - resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.8.1.tgz#8995eb391ae6e1638d251118c7b56de7eb425471" + resolved "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.8.1.tgz" integrity sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg== dependencies: resolve-pkg-maps "^1.0.0" git-up@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/git-up/-/git-up-7.0.0.tgz#bace30786e36f56ea341b6f69adfd83286337467" + resolved "https://registry.npmjs.org/git-up/-/git-up-7.0.0.tgz" integrity sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ== dependencies: is-ssh "^1.4.0" @@ -4086,33 +3753,33 @@ git-up@^7.0.0: git-url-parse@^13.1.0: version "13.1.1" - resolved "https://registry.yarnpkg.com/git-url-parse/-/git-url-parse-13.1.1.tgz#664bddf0857c6a75b3c1f0ae6239abb08a1486d4" + resolved "https://registry.npmjs.org/git-url-parse/-/git-url-parse-13.1.1.tgz" integrity sha512-PCFJyeSSdtnbfhSNRw9Wk96dDCNx+sogTe4YNXeXSJxt7xz5hvXekuRn9JX7m+Mf4OscCu8h+mtAl3+h5Fo8lQ== dependencies: git-up "^7.0.0" github-slugger@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/github-slugger/-/github-slugger-2.0.0.tgz#52cf2f9279a21eb6c59dd385b410f0c0adda8f1a" + resolved "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz" integrity sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw== glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" glob-parent@^6.0.2: version "6.0.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== dependencies: is-glob "^4.0.3" -glob@10.3.10: +glob@^10.3.10, glob@10.3.10: version "10.3.10" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.10.tgz#0351ebb809fd187fe421ab96af83d3a70715df4b" + resolved "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz" integrity sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g== dependencies: foreground-child "^3.1.0" @@ -4121,21 +3788,9 @@ glob@10.3.10: minipass "^5.0.0 || ^6.0.2 || ^7.0.0" path-scurry "^1.10.1" -glob@^10.3.10: - version "10.4.5" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" - integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== - dependencies: - foreground-child "^3.1.0" - jackspeak "^3.1.2" - minimatch "^9.0.4" - minipass "^7.1.2" - package-json-from-dist "^1.0.0" - path-scurry "^1.11.1" - glob@^7.1.3: version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== dependencies: fs.realpath "^1.0.0" @@ -4147,7 +3802,7 @@ glob@^7.1.3: global-modules@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" + resolved "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz" integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== dependencies: global-prefix "^1.0.1" @@ -4156,7 +3811,7 @@ global-modules@^1.0.0: global-prefix@^1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" + resolved "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz" integrity sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg== dependencies: expand-tilde "^2.0.2" @@ -4167,14 +3822,14 @@ global-prefix@^1.0.1: globals@^13.19.0: version "13.24.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" + resolved "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz" integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== dependencies: type-fest "^0.20.2" globalthis@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" + resolved "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz" integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== dependencies: define-properties "^1.2.1" @@ -4182,7 +3837,7 @@ globalthis@^1.0.4: globby@^11.1.0: version "11.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== dependencies: array-union "^2.1.0" @@ -4194,7 +3849,7 @@ globby@^11.1.0: globby@^13.1.2, globby@^13.2.2: version "13.2.2" - resolved "https://registry.yarnpkg.com/globby/-/globby-13.2.2.tgz#63b90b1bf68619c2135475cbd4e71e66aa090592" + resolved "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz" integrity sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w== dependencies: dir-glob "^3.0.1" @@ -4205,22 +3860,22 @@ globby@^13.1.2, globby@^13.2.2: gopd@^1.0.1, gopd@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" + resolved "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz" integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== graceful-fs@^4.2.10, graceful-fs@^4.2.11, graceful-fs@^4.2.4: version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== graphemer@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + resolved "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz" integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== gray-matter@^4.0.3: version "4.0.3" - resolved "https://registry.yarnpkg.com/gray-matter/-/gray-matter-4.0.3.tgz#e893c064825de73ea1f5f7d88c7a9f7274288798" + resolved "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz" integrity sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q== dependencies: js-yaml "^3.13.1" @@ -4230,7 +3885,7 @@ gray-matter@^4.0.3: handlebars@^4.7.8: version "4.7.8" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.8.tgz#41c42c18b1be2365439188c77c6afae71c0cd9e9" + resolved "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz" integrity sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ== dependencies: minimist "^1.2.5" @@ -4242,48 +3897,48 @@ handlebars@^4.7.8: has-bigints@^1.0.2: version "1.1.0" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.1.0.tgz#28607e965ac967e03cd2a2c70a2636a1edad49fe" + resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz" integrity sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg== has-flag@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz" integrity sha512-P+1n3MnwjR/Epg9BBo1KT8qbye2g2Ou4sFumihwt6I4tsUX7jnLcX4BTOSKg/B1ZrIYMN9FcEnG4x5a7NB8Eng== has-flag@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz" integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== dependencies: es-define-property "^1.0.0" has-proto@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.2.0.tgz#5de5a6eabd95fdffd9818b43055e8065e39fe9d5" + resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz" integrity sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ== dependencies: dunder-proto "^1.0.0" has-symbols@^1.0.3, has-symbols@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz" integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz" integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== dependencies: has-symbols "^1.0.3" hash-obj@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/hash-obj/-/hash-obj-4.0.0.tgz#3fafeb0b5f17994441dbe04efbdee82e26b74c8c" + resolved "https://registry.npmjs.org/hash-obj/-/hash-obj-4.0.0.tgz" integrity sha512-FwO1BUVWkyHasWDW4S8o0ssQXjvyghLV2rfVhnN36b2bbcj45eGiuzdn9XOvOpjV3TKQD7Gm2BWNXdE9V4KKYg== dependencies: is-obj "^3.0.0" @@ -4292,14 +3947,14 @@ hash-obj@^4.0.0: hasown@^2.0.0, hasown@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz" integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== dependencies: function-bind "^1.1.2" hast-util-embedded@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/hast-util-embedded/-/hast-util-embedded-3.0.0.tgz#be4477780fbbe079cdba22982e357a0de4ba853e" + resolved "https://registry.npmjs.org/hast-util-embedded/-/hast-util-embedded-3.0.0.tgz" integrity sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA== dependencies: "@types/hast" "^3.0.0" @@ -4307,7 +3962,7 @@ hast-util-embedded@^3.0.0: hast-util-format@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/hast-util-format/-/hast-util-format-1.1.0.tgz#373e77382e07deb04f6676f1b4437e7d8549d985" + resolved "https://registry.npmjs.org/hast-util-format/-/hast-util-format-1.1.0.tgz" integrity sha512-yY1UDz6bC9rDvCWHpx12aIBGRG7krurX0p0Fm6pT547LwDIZZiNr8a+IHDogorAdreULSEzP82Nlv5SZkHZcjA== dependencies: "@types/hast" "^3.0.0" @@ -4320,7 +3975,7 @@ hast-util-format@^1.0.0: hast-util-from-dom@^5.0.0: version "5.0.1" - resolved "https://registry.yarnpkg.com/hast-util-from-dom/-/hast-util-from-dom-5.0.1.tgz#c3c92fbd8d4e1c1625edeb3a773952b9e4ad64a8" + resolved "https://registry.npmjs.org/hast-util-from-dom/-/hast-util-from-dom-5.0.1.tgz" integrity sha512-N+LqofjR2zuzTjCPzyDUdSshy4Ma6li7p/c3pA78uTwzFgENbgbUrm2ugwsOdcjI1muO+o6Dgzp9p8WHtn/39Q== dependencies: "@types/hast" "^3.0.0" @@ -4329,7 +3984,7 @@ hast-util-from-dom@^5.0.0: hast-util-from-html-isomorphic@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/hast-util-from-html-isomorphic/-/hast-util-from-html-isomorphic-2.0.0.tgz#b31baee386a899a2472326a3c5692f29f86d1d3c" + resolved "https://registry.npmjs.org/hast-util-from-html-isomorphic/-/hast-util-from-html-isomorphic-2.0.0.tgz" integrity sha512-zJfpXq44yff2hmE0XmwEOzdWin5xwH+QIhMLOScpX91e/NSGPsAzNCvLQDIEPyO2TXi+lBmU6hjLIhV8MwP2kw== dependencies: "@types/hast" "^3.0.0" @@ -4339,7 +3994,7 @@ hast-util-from-html-isomorphic@^2.0.0: hast-util-from-html@^2.0.0: version "2.0.3" - resolved "https://registry.yarnpkg.com/hast-util-from-html/-/hast-util-from-html-2.0.3.tgz#485c74785358beb80c4ba6346299311ac4c49c82" + resolved "https://registry.npmjs.org/hast-util-from-html/-/hast-util-from-html-2.0.3.tgz" integrity sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw== dependencies: "@types/hast" "^3.0.0" @@ -4351,7 +4006,7 @@ hast-util-from-html@^2.0.0: hast-util-from-parse5@^8.0.0: version "8.0.2" - resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-8.0.2.tgz#29b42758ba96535fd6021f0f533c000886c0f00f" + resolved "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.2.tgz" integrity sha512-SfMzfdAi/zAoZ1KkFEyyeXBn7u/ShQrfd675ZEE9M3qj+PMFX05xubzRyF76CCSJu8au9jgVxDV1+okFvgZU4A== dependencies: "@types/hast" "^3.0.0" @@ -4365,28 +4020,28 @@ hast-util-from-parse5@^8.0.0: hast-util-has-property@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/hast-util-has-property/-/hast-util-has-property-3.0.0.tgz#4e595e3cddb8ce530ea92f6fc4111a818d8e7f93" + resolved "https://registry.npmjs.org/hast-util-has-property/-/hast-util-has-property-3.0.0.tgz" integrity sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA== dependencies: "@types/hast" "^3.0.0" hast-util-is-body-ok-link@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/hast-util-is-body-ok-link/-/hast-util-is-body-ok-link-3.0.1.tgz#ef63cb2f14f04ecf775139cd92bda5026380d8b4" + resolved "https://registry.npmjs.org/hast-util-is-body-ok-link/-/hast-util-is-body-ok-link-3.0.1.tgz" integrity sha512-0qpnzOBLztXHbHQenVB8uNuxTnm/QBFUOmdOSsEn7GnBtyY07+ENTWVFBAnXd/zEgd9/SUG3lRY7hSIBWRgGpQ== dependencies: "@types/hast" "^3.0.0" hast-util-is-element@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz#6e31a6532c217e5b533848c7e52c9d9369ca0932" + resolved "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz" integrity sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g== dependencies: "@types/hast" "^3.0.0" hast-util-minify-whitespace@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/hast-util-minify-whitespace/-/hast-util-minify-whitespace-1.0.1.tgz#7588fd1a53f48f1d30406b81959dffc3650daf55" + resolved "https://registry.npmjs.org/hast-util-minify-whitespace/-/hast-util-minify-whitespace-1.0.1.tgz" integrity sha512-L96fPOVpnclQE0xzdWb/D12VT5FabA7SnZOUMtL1DbXmYiHJMXZvFkIZfiMmTCNJHUeO2K9UYNXoVyfz+QHuOw== dependencies: "@types/hast" "^3.0.0" @@ -4397,14 +4052,14 @@ hast-util-minify-whitespace@^1.0.0: hast-util-parse-selector@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz#352879fa86e25616036037dd8931fb5f34cb4a27" + resolved "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz" integrity sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A== dependencies: "@types/hast" "^3.0.0" hast-util-phrasing@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/hast-util-phrasing/-/hast-util-phrasing-3.0.1.tgz#fa284c0cd4a82a0dd6020de8300a7b1ebffa1690" + resolved "https://registry.npmjs.org/hast-util-phrasing/-/hast-util-phrasing-3.0.1.tgz" integrity sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ== dependencies: "@types/hast" "^3.0.0" @@ -4415,7 +4070,7 @@ hast-util-phrasing@^3.0.0: hast-util-raw@^9.0.0: version "9.1.0" - resolved "https://registry.yarnpkg.com/hast-util-raw/-/hast-util-raw-9.1.0.tgz#79b66b26f6f68fb50dfb4716b2cdca90d92adf2e" + resolved "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz" integrity sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw== dependencies: "@types/hast" "^3.0.0" @@ -4434,7 +4089,7 @@ hast-util-raw@^9.0.0: hast-util-sanitize@^5.0.0: version "5.0.2" - resolved "https://registry.yarnpkg.com/hast-util-sanitize/-/hast-util-sanitize-5.0.2.tgz#edb260d94e5bba2030eb9375790a8753e5bf391f" + resolved "https://registry.npmjs.org/hast-util-sanitize/-/hast-util-sanitize-5.0.2.tgz" integrity sha512-3yTWghByc50aGS7JlGhk61SPenfE/p1oaFeNwkOOyrscaOkMGrcW9+Cy/QAIOBpZxP1yqDIzFMR0+Np0i0+usg== dependencies: "@types/hast" "^3.0.0" @@ -4443,7 +4098,7 @@ hast-util-sanitize@^5.0.0: hast-util-to-estree@^2.0.0: version "2.3.3" - resolved "https://registry.yarnpkg.com/hast-util-to-estree/-/hast-util-to-estree-2.3.3.tgz#da60142ffe19a6296923ec222aba73339c8bf470" + resolved "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-2.3.3.tgz" integrity sha512-ihhPIUPxN0v0w6M5+IiAZZrn0LH2uZomeWwhn7uP7avZC6TE7lIiEh2yBMPr5+zi1aUCXq6VoYRgs2Bw9xmycQ== dependencies: "@types/estree" "^1.0.0" @@ -4464,7 +4119,7 @@ hast-util-to-estree@^2.0.0: hast-util-to-html@^9.0.0: version "9.0.4" - resolved "https://registry.yarnpkg.com/hast-util-to-html/-/hast-util-to-html-9.0.4.tgz#d689c118c875aab1def692c58603e34335a0f5c5" + resolved "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.4.tgz" integrity sha512-wxQzXtdbhiwGAUKrnQJXlOPmHnEehzphwkK7aluUPQ+lEc1xefC8pblMgpp2w5ldBTEfveRIrADcrhGIWrlTDA== dependencies: "@types/hast" "^3.0.0" @@ -4481,7 +4136,7 @@ hast-util-to-html@^9.0.0: hast-util-to-jsx-runtime@^2.0.0: version "2.3.2" - resolved "https://registry.yarnpkg.com/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.2.tgz#6d11b027473e69adeaa00ca4cfb5bb68e3d282fa" + resolved "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.2.tgz" integrity sha512-1ngXYb+V9UT5h+PxNRa1O1FYguZK/XL+gkeqvp7EdHlB9oHUG0eYRo/vY5inBdcqo3RkPMC58/H94HvkbfGdyg== dependencies: "@types/estree" "^1.0.0" @@ -4502,7 +4157,7 @@ hast-util-to-jsx-runtime@^2.0.0: hast-util-to-parse5@^8.0.0: version "8.0.0" - resolved "https://registry.yarnpkg.com/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz#477cd42d278d4f036bc2ea58586130f6f39ee6ed" + resolved "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz" integrity sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw== dependencies: "@types/hast" "^3.0.0" @@ -4515,7 +4170,7 @@ hast-util-to-parse5@^8.0.0: hast-util-to-text@^4.0.0: version "4.0.2" - resolved "https://registry.yarnpkg.com/hast-util-to-text/-/hast-util-to-text-4.0.2.tgz#57b676931e71bf9cb852453678495b3080bfae3e" + resolved "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-4.0.2.tgz" integrity sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A== dependencies: "@types/hast" "^3.0.0" @@ -4525,19 +4180,19 @@ hast-util-to-text@^4.0.0: hast-util-whitespace@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz#0ec64e257e6fc216c7d14c8a1b74d27d650b4557" + resolved "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz" integrity sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng== hast-util-whitespace@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz#7778ed9d3c92dd9e8c5c8f648a49c21fc51cb621" + resolved "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz" integrity sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw== dependencies: "@types/hast" "^3.0.0" hastscript@^9.0.0: version "9.0.0" - resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-9.0.0.tgz#2b76b9aa3cba8bf6d5280869f6f6f7165c230763" + resolved "https://registry.npmjs.org/hastscript/-/hastscript-9.0.0.tgz" integrity sha512-jzaLBGavEDKHrc5EfFImKN7nZKKBdSLIdGvCwDZ9TfzbF2ffXiov8CKE445L2Z1Ek2t/m4SKQ2j6Ipv7NyUolw== dependencies: "@types/hast" "^3.0.0" @@ -4548,7 +4203,7 @@ hastscript@^9.0.0: header-case@^2.0.4: version "2.0.4" - resolved "https://registry.yarnpkg.com/header-case/-/header-case-2.0.4.tgz#5a42e63b55177349cf405beb8d775acabb92c063" + resolved "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz" integrity sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q== dependencies: capital-case "^1.0.4" @@ -4556,77 +4211,77 @@ header-case@^2.0.4: highlight.js@~11.11.0: version "11.11.1" - resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-11.11.1.tgz#fca06fa0e5aeecf6c4d437239135fabc15213585" + resolved "https://registry.npmjs.org/highlight.js/-/highlight.js-11.11.1.tgz" integrity sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w== homedir-polyfill@^1.0.1: version "1.0.3" - resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" + resolved "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz" integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== dependencies: parse-passwd "^1.0.0" hookable@^5.5.3: version "5.5.3" - resolved "https://registry.yarnpkg.com/hookable/-/hookable-5.5.3.tgz#6cfc358984a1ef991e2518cb9ed4a778bbd3215d" + resolved "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz" integrity sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ== html-url-attributes@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/html-url-attributes/-/html-url-attributes-3.0.1.tgz#83b052cd5e437071b756cd74ae70f708870c2d87" + resolved "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.1.tgz" integrity sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ== html-void-elements@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-3.0.0.tgz#fc9dbd84af9e747249034d4d62602def6517f1d7" + resolved "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz" integrity sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg== html-whitespace-sensitive-tag-names@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/html-whitespace-sensitive-tag-names/-/html-whitespace-sensitive-tag-names-3.0.1.tgz#c35edd28205f3bf8c1fd03274608d60b923de5b2" + resolved "https://registry.npmjs.org/html-whitespace-sensitive-tag-names/-/html-whitespace-sensitive-tag-names-3.0.1.tgz" integrity sha512-q+310vW8zmymYHALr1da4HyXUQ0zgiIwIicEfotYPWGN0OJVEN/58IJ3A4GBYcEq3LGAZqKb+ugvP0GNB9CEAA== httpsnippet-lite@^3.0.5: version "3.0.5" - resolved "https://registry.yarnpkg.com/httpsnippet-lite/-/httpsnippet-lite-3.0.5.tgz#af937fa37d3f34e333a1f68e64f906c0fe48c992" + resolved "https://registry.npmjs.org/httpsnippet-lite/-/httpsnippet-lite-3.0.5.tgz" integrity sha512-So4qTXY5iFj5XtFDwyz2PicUu+8NWrI8e8h+ZeZoVtMNcFQp4FFIntBHUE+JPUG6QQU8o1VHCy+X4ETRDwt9CA== dependencies: "@types/har-format" "^1.2.10" formdata-node "^4.4.1" stringify-object "3.3.0" -iconv-lite@0.6: - version "0.6.3" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" - integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - iconv-lite@^0.4.24: version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" +iconv-lite@0.6: + version "0.6.3" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + ieee754@^1.1.13: version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== ignore@^5.2.0, ignore@^5.2.4: version "5.3.2" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz" integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== immutable@^5.0.2: version "5.0.3" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-5.0.3.tgz#aa037e2313ea7b5d400cd9298fa14e404c933db1" + resolved "https://registry.npmjs.org/immutable/-/immutable-5.0.3.tgz" integrity sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw== import-fresh@^3.2.1: version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== dependencies: parent-module "^1.0.0" @@ -4634,55 +4289,55 @@ import-fresh@^3.2.1: imurmurhash@^0.1.4: version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== indent-string@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== indent-string@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-5.0.0.tgz#4fd2980fccaf8622d14c64d694f4cf33c81951a5" + resolved "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz" integrity sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg== inflight@^1.0.4: version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== dependencies: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.3, inherits@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -inherits@2.0.3: +inherits@^2.0.3, inherits@2, inherits@2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== +inherits@^2.0.4: + version "2.0.4" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + ini@^1.3.4: version "1.3.8" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== inline-style-parser@0.1.1: version "0.1.1" - resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz#ec8a3b429274e9c0a1f1c4ffa9453a7fef72cea1" + resolved "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz" integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q== inline-style-parser@0.2.4: version "0.2.4" - resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.2.4.tgz#f4af5fe72e612839fcd453d989a586566d695f22" + resolved "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.4.tgz" integrity sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q== inquirer@^9.2.10: version "9.3.7" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-9.3.7.tgz#0b562bf843812208844741c9aec9244c939b83d4" + resolved "https://registry.npmjs.org/inquirer/-/inquirer-9.3.7.tgz" integrity sha512-LJKFHCSeIRq9hanN14IlOtPSTe3lNES7TYDTE2xxdAy1LS5rYphajK1qtwvj3YmQXvvk0U2Vbmcni8P9EIQW9w== dependencies: "@inquirer/figures" "^1.0.3" @@ -4700,41 +4355,41 @@ inquirer@^9.2.10: internal-slot@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.1.0.tgz#1eac91762947d2f7056bc838d93e13b2e9604961" + resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz" integrity sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw== dependencies: es-errors "^1.3.0" hasown "^2.0.2" side-channel "^1.1.0" -"internmap@1 - 2": - version "2.0.3" - resolved "https://registry.yarnpkg.com/internmap/-/internmap-2.0.3.tgz#6685f23755e43c524e251d29cbc97248e3061009" - integrity sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg== - internmap@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/internmap/-/internmap-1.0.1.tgz#0017cc8a3b99605f0302f2b198d272e015e5df95" + resolved "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz" integrity sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw== +"internmap@1 - 2": + version "2.0.3" + resolved "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz" + integrity sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg== + interpret@^3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-3.1.1.tgz#5be0ceed67ca79c6c4bc5cf0d7ee843dcea110c4" + resolved "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz" integrity sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ== intersection-observer@^0.12.2: version "0.12.2" - resolved "https://registry.yarnpkg.com/intersection-observer/-/intersection-observer-0.12.2.tgz#4a45349cc0cd91916682b1f44c28d7ec737dc375" + resolved "https://registry.npmjs.org/intersection-observer/-/intersection-observer-0.12.2.tgz" integrity sha512-7m1vEcPCxXYI8HqnL8CKI6siDyD+eIWSwgB3DZA+ZTogxk9I4CDnj4wilt9x/+/QbHI4YG5YZNmC6458/e9Ktg== is-absolute-url@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-4.0.1.tgz#16e4d487d4fded05cfe0685e53ec86804a5e94dc" + resolved "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-4.0.1.tgz" integrity sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A== is-absolute@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-1.0.0.tgz#395e1ae84b11f26ad1795e73c17378e48a301576" + resolved "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz" integrity sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA== dependencies: is-relative "^1.0.0" @@ -4742,20 +4397,28 @@ is-absolute@^1.0.0: is-alphabetical@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-2.0.1.tgz#01072053ea7c1036df3c7d19a6daaec7f19e789b" + resolved "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz" integrity sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ== is-alphanumerical@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz#7c03fbe96e3e931113e57f964b0a368cc2dfd875" + resolved "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz" integrity sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw== dependencies: is-alphabetical "^2.0.0" is-decimal "^2.0.0" +is-arguments@^1.0.4: + version "1.2.0" + resolved "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz" + integrity sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA== + dependencies: + call-bound "^1.0.2" + has-tostringtag "^1.0.2" + is-array-buffer@^3.0.4, is-array-buffer@^3.0.5: version "3.0.5" - resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.5.tgz#65742e1e687bd2cc666253068fd8707fe4d44280" + resolved "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz" integrity sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A== dependencies: call-bind "^1.0.8" @@ -4764,33 +4427,33 @@ is-array-buffer@^3.0.4, is-array-buffer@^3.0.5: is-arrayish@^0.3.1: version "0.3.2" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz" integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== is-async-function@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.0.0.tgz#8e4418efd3e5d3a6ebb0164c05ef5afb69aa9646" + resolved "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz" integrity sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA== dependencies: has-tostringtag "^1.0.0" is-bigint@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.1.0.tgz#dda7a3445df57a42583db4228682eba7c4170672" + resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz" integrity sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ== dependencies: has-bigints "^1.0.2" is-binary-path@~2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== dependencies: binary-extensions "^2.0.0" is-boolean-object@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.2.1.tgz#c20d0c654be05da4fbc23c562635c019e93daf89" + resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.1.tgz" integrity sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng== dependencies: call-bound "^1.0.2" @@ -4798,31 +4461,31 @@ is-boolean-object@^1.2.1: is-buffer@^2.0.0: version "2.0.5" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" + resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz" integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== is-bun-module@^1.0.2: version "1.3.0" - resolved "https://registry.yarnpkg.com/is-bun-module/-/is-bun-module-1.3.0.tgz#ea4d24fdebfcecc98e81bcbcb506827fee288760" + resolved "https://registry.npmjs.org/is-bun-module/-/is-bun-module-1.3.0.tgz" integrity sha512-DgXeu5UWI0IsMQundYb5UAOzm6G2eVnarJ0byP6Tm55iZNKceD59LNPA2L4VvsScTtHcw0yEkVwSf7PC+QoLSA== dependencies: semver "^7.6.3" is-callable@^1.1.3, is-callable@^1.2.7: version "1.2.7" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== is-core-module@^2.13.0, is-core-module@^2.15.1, is-core-module@^2.16.0: version "2.16.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz" integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== dependencies: hasown "^2.0.2" is-data-view@^1.0.1, is-data-view@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.2.tgz#bae0a41b9688986c2188dda6657e56b8f9e63b8e" + resolved "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz" integrity sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw== dependencies: call-bound "^1.0.2" @@ -4831,7 +4494,7 @@ is-data-view@^1.0.1, is-data-view@^1.0.2: is-date-object@^1.0.5, is-date-object@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.1.0.tgz#ad85541996fc7aa8b2729701d27b7319f95d82f7" + resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz" integrity sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg== dependencies: call-bound "^1.0.2" @@ -4839,68 +4502,73 @@ is-date-object@^1.0.5, is-date-object@^1.1.0: is-decimal@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-2.0.1.tgz#9469d2dc190d0214fd87d78b78caecc0cc14eef7" + resolved "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz" integrity sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A== +is-docker@^2.0.0, is-docker@^2.1.1: + version "2.2.1" + resolved "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + is-extendable@^0.1.0: version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + resolved "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== is-extglob@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== is-finalizationregistry@^1.1.0: version "1.1.1" - resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz#eefdcdc6c94ddd0674d9c85887bf93f944a97c90" + resolved "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz" integrity sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg== dependencies: call-bound "^1.0.3" is-fullwidth-code-point@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== -is-generator-function@^1.0.10: +is-generator-function@^1.0.10, is-generator-function@^1.0.7: version "1.0.10" - resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + resolved "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz" integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== dependencies: has-tostringtag "^1.0.0" is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" is-hexadecimal@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz#86b5bf668fca307498d319dfc03289d781a90027" + resolved "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz" integrity sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg== is-interactive@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" + resolved "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz" integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== is-interactive@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-2.0.0.tgz#40c57614593826da1100ade6059778d597f16e90" + resolved "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz" integrity sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ== is-map@^2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" + resolved "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz" integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== is-number-object@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.1.1.tgz#144b21e95a1bc148205dcc2814a9134ec41b2541" + resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz" integrity sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw== dependencies: call-bound "^1.0.3" @@ -4908,59 +4576,59 @@ is-number-object@^1.1.1: is-number@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== is-obj@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + resolved "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz" integrity sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg== is-obj@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-3.0.0.tgz#b0889f1f9f8cb87e87df53a8d1230a2250f8b9be" + resolved "https://registry.npmjs.org/is-obj/-/is-obj-3.0.0.tgz" integrity sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ== is-path-cwd@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-3.0.0.tgz#889b41e55c8588b1eb2a96a61d05740a674521c7" + resolved "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-3.0.0.tgz" integrity sha512-kyiNFFLU0Ampr6SDZitD/DwUo4Zs1nSdnygUBqsu3LooL00Qvb5j+UnvApUn/TTj1J3OuE6BTdQ5rudKmU2ZaA== is-path-inside@^3.0.3: version "3.0.3" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== is-path-inside@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-4.0.0.tgz#805aeb62c47c1b12fc3fd13bfb3ed1e7430071db" + resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz" integrity sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA== is-plain-obj@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" + resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz" integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== is-plain-obj@^4.0.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz#d65025edec3657ce032fd7db63c97883eaed71f0" + resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz" integrity sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg== is-plain-object@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" + resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz" integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== is-reference@^3.0.0: version "3.0.3" - resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-3.0.3.tgz#9ef7bf9029c70a67b2152da4adf57c23d718910f" + resolved "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz" integrity sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw== dependencies: "@types/estree" "^1.0.6" is-regex@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.2.1.tgz#76d70a3ed10ef9be48eb577887d74205bf0cad22" + resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz" integrity sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g== dependencies: call-bound "^1.0.2" @@ -4970,43 +4638,43 @@ is-regex@^1.2.1: is-regexp@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" + resolved "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz" integrity sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA== is-relative@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-1.0.0.tgz#a1bb6935ce8c5dba1e8b9754b9b2dcc020e2260d" + resolved "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz" integrity sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA== dependencies: is-unc-path "^1.0.0" is-set@^2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d" + resolved "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz" integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== is-shared-array-buffer@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz#9b67844bd9b7f246ba0708c3a93e34269c774f6f" + resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz" integrity sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A== dependencies: call-bound "^1.0.3" is-ssh@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/is-ssh/-/is-ssh-1.4.0.tgz#4f8220601d2839d8fa624b3106f8e8884f01b8b2" + resolved "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.0.tgz" integrity sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ== dependencies: protocols "^2.0.1" is-stream@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz" integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== is-string@^1.0.7, is-string@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.1.1.tgz#92ea3f3d5c5b6e039ca8677e5ac8d07ea773cbb9" + resolved "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz" integrity sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA== dependencies: call-bound "^1.0.3" @@ -5014,57 +4682,57 @@ is-string@^1.0.7, is-string@^1.1.1: is-symbol@^1.0.4, is-symbol@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.1.1.tgz#f47761279f532e2b05a7024a7506dbbedacd0634" + resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz" integrity sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w== dependencies: call-bound "^1.0.2" has-symbols "^1.1.0" safe-regex-test "^1.1.0" -is-typed-array@^1.1.13, is-typed-array@^1.1.14, is-typed-array@^1.1.15: +is-typed-array@^1.1.13, is-typed-array@^1.1.14, is-typed-array@^1.1.15, is-typed-array@^1.1.3: version "1.1.15" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.15.tgz#4bfb4a45b61cee83a5a46fba778e4e8d59c0ce0b" + resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz" integrity sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ== dependencies: which-typed-array "^1.1.16" is-unc-path@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-1.0.0.tgz#d731e8898ed090a12c352ad2eaed5095ad322c9d" + resolved "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz" integrity sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ== dependencies: unc-path-regex "^0.1.2" is-unicode-supported@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== is-unicode-supported@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz#d824984b616c292a2e198207d4a609983842f714" + resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz" integrity sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ== is-unicode-supported@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz#09f0ab0de6d3744d48d265ebb98f65d11f2a9b3a" + resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz" integrity sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ== is-weakmap@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd" + resolved "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz" integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== is-weakref@^1.0.2, is-weakref@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.1.0.tgz#47e3472ae95a63fa9cf25660bcf0c181c39770ef" + resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.0.tgz" integrity sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q== dependencies: call-bound "^1.0.2" is-weakset@^2.0.3: version "2.0.4" - resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.4.tgz#c9f5deb0bc1906c6d6f1027f284ddf459249daca" + resolved "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz" integrity sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ== dependencies: call-bound "^1.0.3" @@ -5072,37 +4740,44 @@ is-weakset@^2.0.3: is-windows@^1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + resolved "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== +is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + isarray@^2.0.5: version "2.0.5" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz" integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== isbinaryfile@^5.0.0: version "5.0.4" - resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-5.0.4.tgz#2a2edefa76cafa66613fe4c1ea52f7f031017bdf" + resolved "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.4.tgz" integrity sha512-YKBKVkKhty7s8rxddb40oOkuP0NbaeXrQvLin6QMHL7Ypiy2RW9LwOVrVgZRyOrhQlayMd9t+D8yDy8MKFTSDQ== isexe@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== isobject@^3.0.0, isobject@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + resolved "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz" integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== isomorphic.js@^0.2.4: version "0.2.5" - resolved "https://registry.yarnpkg.com/isomorphic.js/-/isomorphic.js-0.2.5.tgz#13eecf36f2dba53e85d355e11bf9d4208c6f7f88" + resolved "https://registry.npmjs.org/isomorphic.js/-/isomorphic.js-0.2.5.tgz" integrity sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw== iterator.prototype@^1.1.4: version "1.1.5" - resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.5.tgz#12c959a29de32de0aa3bbbb801f4d777066dae39" + resolved "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz" integrity sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g== dependencies: define-data-property "^1.1.4" @@ -5114,35 +4789,26 @@ iterator.prototype@^1.1.4: jackspeak@^2.3.5: version "2.3.6" - resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.6.tgz#647ecc472238aee4b06ac0e461acc21a8c505ca8" + resolved "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz" integrity sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ== dependencies: "@isaacs/cliui" "^8.0.2" optionalDependencies: "@pkgjs/parseargs" "^0.11.0" -jackspeak@^3.1.2: - version "3.4.3" - resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a" - integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== - dependencies: - "@isaacs/cliui" "^8.0.2" - optionalDependencies: - "@pkgjs/parseargs" "^0.11.0" - jiti@^1.21.6: version "1.21.7" - resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.7.tgz#9dd81043424a3d28458b193d965f0d18a2300ba9" + resolved "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz" integrity sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A== "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== js-yaml@^3.13.1: version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== dependencies: argparse "^1.0.7" @@ -5150,58 +4816,63 @@ js-yaml@^3.13.1: js-yaml@^4.0.0, js-yaml@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== dependencies: argparse "^2.0.1" +jsdoc-type-pratt-parser@^4.0.0: + version "4.1.0" + resolved "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.1.0.tgz" + integrity sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg== + json-buffer@3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz" integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== json-schema-traverse@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== json-schema-traverse@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz" integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== json5@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" + resolved "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz" integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== dependencies: minimist "^1.2.0" jsonc-parser@^3.2.0: version "3.3.1" - resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.3.1.tgz#f2a524b4f7fd11e3d791e559977ad60b98b798b4" + resolved "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz" integrity sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ== jsonp@^0.2.1: version "0.2.1" - resolved "https://registry.yarnpkg.com/jsonp/-/jsonp-0.2.1.tgz#a65b4fa0f10bda719a05441ea7b94c55f3e15bae" + resolved "https://registry.npmjs.org/jsonp/-/jsonp-0.2.1.tgz" integrity sha512-pfog5gdDxPdV4eP7Kg87M8/bHgshlZ5pybl+yKxAnCZ5O7lCIn7Ixydj03wOlnDQesky2BPyA91SQ+5Y/mNwzw== dependencies: debug "^2.1.3" jsonpointer@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-5.0.1.tgz#2110e0af0900fd37467b5907ecd13a7884a1b559" + resolved "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz" integrity sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ== "jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.5: version "3.3.5" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a" + resolved "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz" integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ== dependencies: array-includes "^3.1.6" @@ -5211,73 +4882,73 @@ jsonpointer@^5.0.1: katex@^0.16.0, katex@^0.16.9: version "0.16.19" - resolved "https://registry.yarnpkg.com/katex/-/katex-0.16.19.tgz#698e026188876f9c8c93d3ecb27b212aaa056d0a" + resolved "https://registry.npmjs.org/katex/-/katex-0.16.19.tgz" integrity sha512-3IA6DYVhxhBabjSLTNO9S4+OliA3Qvb8pBQXMfC4WxXJgLwZgnfDl0BmB4z6nBMdznBsZ+CGM8DrGZ5hcguDZg== dependencies: commander "^8.3.0" keyv@^4.5.3: version "4.5.4" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + resolved "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz" integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== dependencies: json-buffer "3.0.1" khroma@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/khroma/-/khroma-2.1.0.tgz#45f2ce94ce231a437cf5b63c2e886e6eb42bbbb1" + resolved "https://registry.npmjs.org/khroma/-/khroma-2.1.0.tgz" integrity sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw== kind-of@^6.0.0, kind-of@^6.0.2: version "6.0.3" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== kleur@^4.0.3: version "4.1.5" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.5.tgz#95106101795f7050c6c650f350c683febddb1780" + resolved "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz" integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== language-subtag-registry@^0.3.20: version "0.3.23" - resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz#23529e04d9e3b74679d70142df3fd2eb6ec572e7" + resolved "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz" integrity sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ== language-tags@^1.0.9: version "1.0.9" - resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.9.tgz#1ffdcd0ec0fafb4b1be7f8b11f306ad0f9c08777" + resolved "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz" integrity sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA== dependencies: language-subtag-registry "^0.3.20" layout-base@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/layout-base/-/layout-base-1.0.2.tgz#1291e296883c322a9dd4c5dd82063721b53e26e2" + resolved "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz" integrity sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg== leven@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-4.0.0.tgz#b9c39c803f835950fabef9e122a9b47b95708710" + resolved "https://registry.npmjs.org/leven/-/leven-4.0.0.tgz" integrity sha512-puehA3YKku3osqPlNuzGDUHq8WpwXupUg1V6NXdV38G+gr+gkBwFC8g1b/+YcIvp8gnqVIus+eJCH/eGsRmJNw== levn@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== dependencies: prelude-ls "^1.2.1" type-check "~0.4.0" -lib0@^0.2.42: +lib0@^0.2.42, lib0@^0.2.99: version "0.2.99" - resolved "https://registry.yarnpkg.com/lib0/-/lib0-0.2.99.tgz#80d715dbd75496dabe0a1f5061fbb4ea162d2532" + resolved "https://registry.npmjs.org/lib0/-/lib0-0.2.99.tgz" integrity sha512-vwztYuUf1uf/1zQxfzRfO5yzfNKhTtgOByCruuiQQxWQXnPb8Itaube5ylofcV0oM0aKal9Mv+S1s1Ky0UYP1w== dependencies: isomorphic.js "^0.2.4" liftoff@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-4.0.0.tgz#1a463b9073335cd425cdaa3b468996f7d66d2d81" + resolved "https://registry.npmjs.org/liftoff/-/liftoff-4.0.0.tgz" integrity sha512-rMGwYF8q7g2XhG2ulBmmJgWv25qBsqRbDn5gH0+wnuyeFt7QBJlHJmtg5qEdn4pN6WVAUMgXnIxytMFRX9c1aA== dependencies: extend "^3.0.2" @@ -5291,44 +4962,44 @@ liftoff@^4.0.0: lilconfig@^3.0.0, lilconfig@^3.1.3: version "3.1.3" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.3.tgz#a1bcfd6257f9585bf5ae14ceeebb7b559025e4c4" + resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz" integrity sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw== lines-and-columns@^1.1.6: version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== locate-path@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== dependencies: p-locate "^5.0.0" lodash-es@^4.17.21: version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" + resolved "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz" integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== lodash.get@^4.4.2: version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" + resolved "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz" integrity sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ== lodash.merge@^4.6.2: version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== lodash@^4.17.21: version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== log-symbols@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz" integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== dependencies: chalk "^4.1.0" @@ -5336,7 +5007,7 @@ log-symbols@^4.1.0: log-symbols@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-6.0.0.tgz#bb95e5f05322651cac30c0feb6404f9f2a8a9439" + resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz" integrity sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw== dependencies: chalk "^5.3.0" @@ -5344,31 +5015,31 @@ log-symbols@^6.0.0: longest-streak@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-3.1.0.tgz#62fa67cd958742a1574af9f39866364102d90cd4" + resolved "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz" integrity sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g== loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== dependencies: js-tokens "^3.0.0 || ^4.0.0" loupe@^3.1.0, loupe@^3.1.1, loupe@^3.1.2: version "3.1.2" - resolved "https://registry.yarnpkg.com/loupe/-/loupe-3.1.2.tgz#c86e0696804a02218f2206124c45d8b15291a240" + resolved "https://registry.npmjs.org/loupe/-/loupe-3.1.2.tgz" integrity sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg== lower-case@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" + resolved "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz" integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== dependencies: tslib "^2.0.3" lowlight@^3.0.0: version "3.3.0" - resolved "https://registry.yarnpkg.com/lowlight/-/lowlight-3.3.0.tgz#007b8a5bfcfd27cc65b96246d2de3e9dd4e23c6c" + resolved "https://registry.npmjs.org/lowlight/-/lowlight-3.3.0.tgz" integrity sha512-0JNhgFoPvP6U6lE/UdVsSq99tn6DhjjpAj5MxG49ewd2mOBVtwWYIT8ClyABhq198aXXODMU6Ox8DrGy/CpTZQ== dependencies: "@types/hast" "^3.0.0" @@ -5377,12 +5048,12 @@ lowlight@^3.0.0: lru-cache@^10.2.0: version "10.4.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz" integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== lru-cache@^4.0.1: version "4.1.5" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz" integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== dependencies: pseudomap "^1.0.2" @@ -5390,39 +5061,46 @@ lru-cache@^4.0.1: lucide-react@^0.372.0: version "0.372.0" - resolved "https://registry.yarnpkg.com/lucide-react/-/lucide-react-0.372.0.tgz#bb032d1e34ffca2eba016f951aabd261bbffacbe" + resolved "https://registry.npmjs.org/lucide-react/-/lucide-react-0.372.0.tgz" integrity sha512-0cKdqmilHXWUwWAWnf6CrrjHD8YaqPMtLrmEHXolZusNTr9epULCsiJwIOHk2q1yFxdEwd96D4zShlAj67UJdA== lz-string@^1.5.0: version "1.5.0" - resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.5.0.tgz#c1ab50f77887b712621201ba9fd4e3a6ed099941" + resolved "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz" integrity sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ== +magic-string@^0.30.11: + version "0.30.17" + resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz" + integrity sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA== + dependencies: + "@jridgewell/sourcemap-codec" "^1.5.0" + make-iterator@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/make-iterator/-/make-iterator-1.0.1.tgz#29b33f312aa8f547c4a5e490f56afcec99133ad6" + resolved "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz" integrity sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw== dependencies: kind-of "^6.0.2" map-cache@^0.2.0: version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + resolved "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz" integrity sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg== markdown-extensions@^1.0.0: version "1.1.1" - resolved "https://registry.yarnpkg.com/markdown-extensions/-/markdown-extensions-1.1.1.tgz#fea03b539faeaee9b4ef02a3769b455b189f7fc3" + resolved "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-1.1.1.tgz" integrity sha512-WWC0ZuMzCyDHYCasEGs4IPvLyTGftYwh6wIEOULOF0HXcqZlhwRzrK0w2VUlxWA98xnvb/jszw4ZSkJ6ADpM6Q== markdown-table@^3.0.0: version "3.0.4" - resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-3.0.4.tgz#fe44d6d410ff9d6f2ea1797a3f60aa4d2b631c2a" + resolved "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz" integrity sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw== match-sorter@^6.3.1: version "6.4.0" - resolved "https://registry.yarnpkg.com/match-sorter/-/match-sorter-6.4.0.tgz#ae9c166cb3c9efd337690b3160c0e28cb8377c13" + resolved "https://registry.npmjs.org/match-sorter/-/match-sorter-6.4.0.tgz" integrity sha512-d4664ahzdL1QTTvmK1iI0JsrxWeJ6gn33qkYtnPg3mcn+naBLtXSgSPOe+X2vUgtgGwaAk3eiaj7gwKjjMAq+Q== dependencies: "@babel/runtime" "^7.23.8" @@ -5430,12 +5108,12 @@ match-sorter@^6.3.1: math-intrinsics@^1.0.0, math-intrinsics@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" + resolved "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz" integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== mdast-util-definitions@^5.0.0: version "5.1.2" - resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz#9910abb60ac5d7115d6819b57ae0bcef07a3f7a7" + resolved "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz" integrity sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA== dependencies: "@types/mdast" "^3.0.0" @@ -5444,7 +5122,7 @@ mdast-util-definitions@^5.0.0: mdast-util-find-and-replace@^2.0.0: version "2.2.2" - resolved "https://registry.yarnpkg.com/mdast-util-find-and-replace/-/mdast-util-find-and-replace-2.2.2.tgz#cc2b774f7f3630da4bd592f61966fecade8b99b1" + resolved "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-2.2.2.tgz" integrity sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw== dependencies: "@types/mdast" "^3.0.0" @@ -5454,7 +5132,7 @@ mdast-util-find-and-replace@^2.0.0: mdast-util-find-and-replace@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.1.tgz#a6fc7b62f0994e973490e45262e4bc07607b04e0" + resolved "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.1.tgz" integrity sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA== dependencies: "@types/mdast" "^4.0.0" @@ -5462,9 +5140,27 @@ mdast-util-find-and-replace@^3.0.0: unist-util-is "^6.0.0" unist-util-visit-parents "^6.0.0" -mdast-util-from-markdown@^1.0.0, mdast-util-from-markdown@^1.1.0, mdast-util-from-markdown@^1.3.0: +mdast-util-from-markdown@^1.0.0, mdast-util-from-markdown@^1.1.0: version "1.3.1" - resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz#9421a5a247f10d31d2faed2a30df5ec89ceafcf0" + resolved "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz" + integrity sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww== + dependencies: + "@types/mdast" "^3.0.0" + "@types/unist" "^2.0.0" + decode-named-character-reference "^1.0.0" + mdast-util-to-string "^3.1.0" + micromark "^3.0.0" + micromark-util-decode-numeric-character-reference "^1.0.0" + micromark-util-decode-string "^1.0.0" + micromark-util-normalize-identifier "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + unist-util-stringify-position "^3.0.0" + uvu "^0.5.0" + +mdast-util-from-markdown@^1.3.0: + version "1.3.1" + resolved "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz" integrity sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww== dependencies: "@types/mdast" "^3.0.0" @@ -5482,7 +5178,7 @@ mdast-util-from-markdown@^1.0.0, mdast-util-from-markdown@^1.1.0, mdast-util-fro mdast-util-from-markdown@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz#4850390ca7cf17413a9b9a0fbefcd1bc0eb4160a" + resolved "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz" integrity sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA== dependencies: "@types/mdast" "^4.0.0" @@ -5500,7 +5196,7 @@ mdast-util-from-markdown@^2.0.0: mdast-util-gfm-autolink-literal@^1.0.0: version "1.0.3" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-1.0.3.tgz#67a13abe813d7eba350453a5333ae1bc0ec05c06" + resolved "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-1.0.3.tgz" integrity sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA== dependencies: "@types/mdast" "^3.0.0" @@ -5510,7 +5206,7 @@ mdast-util-gfm-autolink-literal@^1.0.0: mdast-util-gfm-autolink-literal@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz#abd557630337bd30a6d5a4bd8252e1c2dc0875d5" + resolved "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz" integrity sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ== dependencies: "@types/mdast" "^4.0.0" @@ -5521,7 +5217,7 @@ mdast-util-gfm-autolink-literal@^2.0.0: mdast-util-gfm-footnote@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-1.0.2.tgz#ce5e49b639c44de68d5bf5399877a14d5020424e" + resolved "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-1.0.2.tgz" integrity sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ== dependencies: "@types/mdast" "^3.0.0" @@ -5530,7 +5226,7 @@ mdast-util-gfm-footnote@^1.0.0: mdast-util-gfm-footnote@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.0.0.tgz#25a1753c7d16db8bfd53cd84fe50562bd1e6d6a9" + resolved "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.0.0.tgz" integrity sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ== dependencies: "@types/mdast" "^4.0.0" @@ -5541,7 +5237,7 @@ mdast-util-gfm-footnote@^2.0.0: mdast-util-gfm-strikethrough@^1.0.0: version "1.0.3" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-1.0.3.tgz#5470eb105b483f7746b8805b9b989342085795b7" + resolved "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-1.0.3.tgz" integrity sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ== dependencies: "@types/mdast" "^3.0.0" @@ -5549,7 +5245,7 @@ mdast-util-gfm-strikethrough@^1.0.0: mdast-util-gfm-strikethrough@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz#d44ef9e8ed283ac8c1165ab0d0dfd058c2764c16" + resolved "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz" integrity sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg== dependencies: "@types/mdast" "^4.0.0" @@ -5558,7 +5254,7 @@ mdast-util-gfm-strikethrough@^2.0.0: mdast-util-gfm-table@^1.0.0: version "1.0.7" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-table/-/mdast-util-gfm-table-1.0.7.tgz#3552153a146379f0f9c4c1101b071d70bbed1a46" + resolved "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-1.0.7.tgz" integrity sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg== dependencies: "@types/mdast" "^3.0.0" @@ -5568,7 +5264,7 @@ mdast-util-gfm-table@^1.0.0: mdast-util-gfm-table@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz#7a435fb6223a72b0862b33afbd712b6dae878d38" + resolved "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz" integrity sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg== dependencies: "@types/mdast" "^4.0.0" @@ -5579,7 +5275,7 @@ mdast-util-gfm-table@^2.0.0: mdast-util-gfm-task-list-item@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-1.0.2.tgz#b280fcf3b7be6fd0cc012bbe67a59831eb34097b" + resolved "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-1.0.2.tgz" integrity sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ== dependencies: "@types/mdast" "^3.0.0" @@ -5587,7 +5283,7 @@ mdast-util-gfm-task-list-item@^1.0.0: mdast-util-gfm-task-list-item@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz#e68095d2f8a4303ef24094ab642e1047b991a936" + resolved "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz" integrity sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ== dependencies: "@types/mdast" "^4.0.0" @@ -5597,7 +5293,7 @@ mdast-util-gfm-task-list-item@^2.0.0: mdast-util-gfm@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/mdast-util-gfm/-/mdast-util-gfm-2.0.2.tgz#e92f4d8717d74bdba6de57ed21cc8b9552e2d0b6" + resolved "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-2.0.2.tgz" integrity sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg== dependencies: mdast-util-from-markdown "^1.0.0" @@ -5610,7 +5306,7 @@ mdast-util-gfm@^2.0.0: mdast-util-gfm@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/mdast-util-gfm/-/mdast-util-gfm-3.0.0.tgz#3f2aecc879785c3cb6a81ff3a243dc11eca61095" + resolved "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.0.0.tgz" integrity sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw== dependencies: mdast-util-from-markdown "^2.0.0" @@ -5623,7 +5319,7 @@ mdast-util-gfm@^3.0.0: mdast-util-math@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/mdast-util-math/-/mdast-util-math-2.0.2.tgz#19a06a81f31643f48cc805e7c31edb7ce739242c" + resolved "https://registry.npmjs.org/mdast-util-math/-/mdast-util-math-2.0.2.tgz" integrity sha512-8gmkKVp9v6+Tgjtq6SYx9kGPpTf6FVYRa53/DLh479aldR9AyP48qeVOgNZ5X7QUK7nOy4yw7vg6mbiGcs9jWQ== dependencies: "@types/mdast" "^3.0.0" @@ -5632,7 +5328,7 @@ mdast-util-math@^2.0.0: mdast-util-mdx-expression@^1.0.0: version "1.3.2" - resolved "https://registry.yarnpkg.com/mdast-util-mdx-expression/-/mdast-util-mdx-expression-1.3.2.tgz#d027789e67524d541d6de543f36d51ae2586f220" + resolved "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-1.3.2.tgz" integrity sha512-xIPmR5ReJDu/DHH1OoIT1HkuybIfRGYRywC+gJtI7qHjCJp/M9jrmBEJW22O8lskDWm562BX2W8TiAwRTb0rKA== dependencies: "@types/estree-jsx" "^1.0.0" @@ -5643,7 +5339,7 @@ mdast-util-mdx-expression@^1.0.0: mdast-util-mdx-expression@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz#43f0abac9adc756e2086f63822a38c8d3c3a5096" + resolved "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz" integrity sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ== dependencies: "@types/estree-jsx" "^1.0.0" @@ -5655,7 +5351,7 @@ mdast-util-mdx-expression@^2.0.0: mdast-util-mdx-jsx@^2.0.0: version "2.1.4" - resolved "https://registry.yarnpkg.com/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-2.1.4.tgz#7c1f07f10751a78963cfabee38017cbc8b7786d1" + resolved "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-2.1.4.tgz" integrity sha512-DtMn9CmVhVzZx3f+optVDF8yFgQVt7FghCRNdlIaS3X5Bnym3hZwPbg/XW86vdpKjlc1PVj26SpnLGeJBXD3JA== dependencies: "@types/estree-jsx" "^1.0.0" @@ -5673,7 +5369,7 @@ mdast-util-mdx-jsx@^2.0.0: mdast-util-mdx-jsx@^3.0.0: version "3.1.3" - resolved "https://registry.yarnpkg.com/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.1.3.tgz#76b957b3da18ebcfd0de3a9b4451dcd6fdec2320" + resolved "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.1.3.tgz" integrity sha512-bfOjvNt+1AcbPLTFMFWY149nJz0OjmewJs3LQQ5pIyVGxP4CdOqNVJL6kTaM5c68p8q82Xv3nCyFfUnuEcH3UQ== dependencies: "@types/estree-jsx" "^1.0.0" @@ -5691,7 +5387,7 @@ mdast-util-mdx-jsx@^3.0.0: mdast-util-mdx@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/mdast-util-mdx/-/mdast-util-mdx-2.0.1.tgz#49b6e70819b99bb615d7223c088d295e53bb810f" + resolved "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-2.0.1.tgz" integrity sha512-38w5y+r8nyKlGvNjSEqWrhG0w5PmnRA+wnBvm+ulYCct7nsGYhFVb0lljS9bQav4psDAS1eGkP2LMVcZBi/aqw== dependencies: mdast-util-from-markdown "^1.0.0" @@ -5702,7 +5398,7 @@ mdast-util-mdx@^2.0.0: mdast-util-mdxjs-esm@^1.0.0: version "1.3.1" - resolved "https://registry.yarnpkg.com/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-1.3.1.tgz#645d02cd607a227b49721d146fd81796b2e2d15b" + resolved "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-1.3.1.tgz" integrity sha512-SXqglS0HrEvSdUEfoXFtcg7DRl7S2cwOXc7jkuusG472Mmjag34DUDeOJUZtl+BVnyeO1frIgVpHlNRWc2gk/w== dependencies: "@types/estree-jsx" "^1.0.0" @@ -5713,7 +5409,7 @@ mdast-util-mdxjs-esm@^1.0.0: mdast-util-mdxjs-esm@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz#019cfbe757ad62dd557db35a695e7314bcc9fa97" + resolved "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz" integrity sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg== dependencies: "@types/estree-jsx" "^1.0.0" @@ -5725,7 +5421,7 @@ mdast-util-mdxjs-esm@^2.0.0: mdast-util-phrasing@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/mdast-util-phrasing/-/mdast-util-phrasing-3.0.1.tgz#c7c21d0d435d7fb90956038f02e8702781f95463" + resolved "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-3.0.1.tgz" integrity sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg== dependencies: "@types/mdast" "^3.0.0" @@ -5733,7 +5429,7 @@ mdast-util-phrasing@^3.0.0: mdast-util-phrasing@^4.0.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz#7cc0a8dec30eaf04b7b1a9661a92adb3382aa6e3" + resolved "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz" integrity sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w== dependencies: "@types/mdast" "^4.0.0" @@ -5741,7 +5437,7 @@ mdast-util-phrasing@^4.0.0: mdast-util-to-hast@^12.1.0: version "12.3.0" - resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-12.3.0.tgz#045d2825fb04374e59970f5b3f279b5700f6fb49" + resolved "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-12.3.0.tgz" integrity sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw== dependencies: "@types/hast" "^2.0.0" @@ -5755,7 +5451,7 @@ mdast-util-to-hast@^12.1.0: mdast-util-to-hast@^13.0.0: version "13.2.0" - resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz#5ca58e5b921cc0a3ded1bc02eed79a4fe4fe41f4" + resolved "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz" integrity sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA== dependencies: "@types/hast" "^3.0.0" @@ -5770,7 +5466,7 @@ mdast-util-to-hast@^13.0.0: mdast-util-to-markdown@^1.0.0, mdast-util-to-markdown@^1.3.0: version "1.5.0" - resolved "https://registry.yarnpkg.com/mdast-util-to-markdown/-/mdast-util-to-markdown-1.5.0.tgz#c13343cb3fc98621911d33b5cd42e7d0731171c6" + resolved "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-1.5.0.tgz" integrity sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A== dependencies: "@types/mdast" "^3.0.0" @@ -5784,7 +5480,7 @@ mdast-util-to-markdown@^1.0.0, mdast-util-to-markdown@^1.3.0: mdast-util-to-markdown@^2.0.0: version "2.1.2" - resolved "https://registry.yarnpkg.com/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz#f910ffe60897f04bb4b7e7ee434486f76288361b" + resolved "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz" integrity sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA== dependencies: "@types/mdast" "^4.0.0" @@ -5799,26 +5495,26 @@ mdast-util-to-markdown@^2.0.0: mdast-util-to-string@^3.0.0, mdast-util-to-string@^3.1.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz#66f7bb6324756741c5f47a53557f0cbf16b6f789" + resolved "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz" integrity sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg== dependencies: "@types/mdast" "^3.0.0" mdast-util-to-string@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz#7a5121475556a04e7eddeb67b264aae79d312814" + resolved "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz" integrity sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg== dependencies: "@types/mdast" "^4.0.0" merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== mermaid@^10.2.2: version "10.9.3" - resolved "https://registry.yarnpkg.com/mermaid/-/mermaid-10.9.3.tgz#90bc6f15c33dbe5d9507fed31592cc0d88fee9f7" + resolved "https://registry.npmjs.org/mermaid/-/mermaid-10.9.3.tgz" integrity sha512-V80X1isSEvAewIL3xhmz/rVmc27CVljcsbWxkxlWJWY/1kQa4XOABqpDl2qQLGKzpKm6WbTfUEKImBlUfFYArw== dependencies: "@braintree/sanitize-url" "^6.0.1" @@ -5844,7 +5540,7 @@ mermaid@^10.2.2: micromark-core-commonmark@^1.0.0, micromark-core-commonmark@^1.0.1: version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz#1386628df59946b2d39fb2edfd10f3e8e0a75bb8" + resolved "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz" integrity sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw== dependencies: decode-named-character-reference "^1.0.0" @@ -5866,7 +5562,7 @@ micromark-core-commonmark@^1.0.0, micromark-core-commonmark@^1.0.1: micromark-core-commonmark@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/micromark-core-commonmark/-/micromark-core-commonmark-2.0.2.tgz#6a45bbb139e126b3f8b361a10711ccc7c6e15e93" + resolved "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.2.tgz" integrity sha512-FKjQKbxd1cibWMM1P9N+H8TwlgGgSkWZMmfuVucLCHaYqeSvJ0hFeHsIa65pA2nYbes0f8LDHPMrd9X7Ujxg9w== dependencies: decode-named-character-reference "^1.0.0" @@ -5888,7 +5584,7 @@ micromark-core-commonmark@^2.0.0: micromark-extension-gfm-autolink-literal@^1.0.0: version "1.0.5" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-1.0.5.tgz#5853f0e579bbd8ef9e39a7c0f0f27c5a063a66e7" + resolved "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-1.0.5.tgz" integrity sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg== dependencies: micromark-util-character "^1.0.0" @@ -5898,7 +5594,7 @@ micromark-extension-gfm-autolink-literal@^1.0.0: micromark-extension-gfm-autolink-literal@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz#6286aee9686c4462c1e3552a9d505feddceeb935" + resolved "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz" integrity sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw== dependencies: micromark-util-character "^2.0.0" @@ -5908,7 +5604,7 @@ micromark-extension-gfm-autolink-literal@^2.0.0: micromark-extension-gfm-footnote@^1.0.0: version "1.1.2" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-1.1.2.tgz#05e13034d68f95ca53c99679040bc88a6f92fe2e" + resolved "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-1.1.2.tgz" integrity sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q== dependencies: micromark-core-commonmark "^1.0.0" @@ -5922,7 +5618,7 @@ micromark-extension-gfm-footnote@^1.0.0: micromark-extension-gfm-footnote@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz#4dab56d4e398b9853f6fe4efac4fc9361f3e0750" + resolved "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz" integrity sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw== dependencies: devlop "^1.0.0" @@ -5936,7 +5632,7 @@ micromark-extension-gfm-footnote@^2.0.0: micromark-extension-gfm-strikethrough@^1.0.0: version "1.0.7" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-1.0.7.tgz#c8212c9a616fa3bf47cb5c711da77f4fdc2f80af" + resolved "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-1.0.7.tgz" integrity sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw== dependencies: micromark-util-chunked "^1.0.0" @@ -5948,7 +5644,7 @@ micromark-extension-gfm-strikethrough@^1.0.0: micromark-extension-gfm-strikethrough@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz#86106df8b3a692b5f6a92280d3879be6be46d923" + resolved "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz" integrity sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw== dependencies: devlop "^1.0.0" @@ -5960,7 +5656,7 @@ micromark-extension-gfm-strikethrough@^2.0.0: micromark-extension-gfm-table@^1.0.0: version "1.0.7" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-table/-/micromark-extension-gfm-table-1.0.7.tgz#dcb46074b0c6254c3fc9cc1f6f5002c162968008" + resolved "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-1.0.7.tgz" integrity sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw== dependencies: micromark-factory-space "^1.0.0" @@ -5971,7 +5667,7 @@ micromark-extension-gfm-table@^1.0.0: micromark-extension-gfm-table@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.0.tgz#5cadedfbb29fca7abf752447967003dc3b6583c9" + resolved "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.0.tgz" integrity sha512-Ub2ncQv+fwD70/l4ou27b4YzfNaCJOvyX4HxXU15m7mpYY+rjuWzsLIPZHJL253Z643RpbcP1oeIJlQ/SKW67g== dependencies: devlop "^1.0.0" @@ -5982,21 +5678,21 @@ micromark-extension-gfm-table@^2.0.0: micromark-extension-gfm-tagfilter@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-1.0.2.tgz#aa7c4dd92dabbcb80f313ebaaa8eb3dac05f13a7" + resolved "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-1.0.2.tgz" integrity sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g== dependencies: micromark-util-types "^1.0.0" micromark-extension-gfm-tagfilter@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz#f26d8a7807b5985fba13cf61465b58ca5ff7dc57" + resolved "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz" integrity sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg== dependencies: micromark-util-types "^2.0.0" micromark-extension-gfm-task-list-item@^1.0.0: version "1.0.5" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-1.0.5.tgz#b52ce498dc4c69b6a9975abafc18f275b9dde9f4" + resolved "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-1.0.5.tgz" integrity sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ== dependencies: micromark-factory-space "^1.0.0" @@ -6007,7 +5703,7 @@ micromark-extension-gfm-task-list-item@^1.0.0: micromark-extension-gfm-task-list-item@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz#bcc34d805639829990ec175c3eea12bb5b781f2c" + resolved "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz" integrity sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw== dependencies: devlop "^1.0.0" @@ -6018,7 +5714,7 @@ micromark-extension-gfm-task-list-item@^2.0.0: micromark-extension-gfm@^2.0.0: version "2.0.3" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm/-/micromark-extension-gfm-2.0.3.tgz#e517e8579949a5024a493e49204e884aa74f5acf" + resolved "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-2.0.3.tgz" integrity sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ== dependencies: micromark-extension-gfm-autolink-literal "^1.0.0" @@ -6032,7 +5728,7 @@ micromark-extension-gfm@^2.0.0: micromark-extension-gfm@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz#3e13376ab95dd7a5cfd0e29560dfe999657b3c5b" + resolved "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz" integrity sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w== dependencies: micromark-extension-gfm-autolink-literal "^2.0.0" @@ -6046,7 +5742,7 @@ micromark-extension-gfm@^3.0.0: micromark-extension-math@^2.0.0: version "2.1.2" - resolved "https://registry.yarnpkg.com/micromark-extension-math/-/micromark-extension-math-2.1.2.tgz#52c70cc8266cd20ada1ef5a479bfed9a19b789bf" + resolved "https://registry.npmjs.org/micromark-extension-math/-/micromark-extension-math-2.1.2.tgz" integrity sha512-es0CcOV89VNS9wFmyn+wyFTKweXGW4CEvdaAca6SWRWPyYCbBisnjaHLjWO4Nszuiud84jCpkHsqAJoa768Pvg== dependencies: "@types/katex" "^0.16.0" @@ -6059,7 +5755,7 @@ micromark-extension-math@^2.0.0: micromark-extension-mdx-expression@^1.0.0: version "1.0.8" - resolved "https://registry.yarnpkg.com/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-1.0.8.tgz#5bc1f5fd90388e8293b3ef4f7c6f06c24aff6314" + resolved "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-1.0.8.tgz" integrity sha512-zZpeQtc5wfWKdzDsHRBY003H2Smg+PUi2REhqgIhdzAa5xonhP03FcXxqFSerFiNUr5AWmHpaNPQTBVOS4lrXw== dependencies: "@types/estree" "^1.0.0" @@ -6073,7 +5769,7 @@ micromark-extension-mdx-expression@^1.0.0: micromark-extension-mdx-jsx@^1.0.0: version "1.0.5" - resolved "https://registry.yarnpkg.com/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-1.0.5.tgz#e72d24b7754a30d20fb797ece11e2c4e2cae9e82" + resolved "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-1.0.5.tgz" integrity sha512-gPH+9ZdmDflbu19Xkb8+gheqEDqkSpdCEubQyxuz/Hn8DOXiXvrXeikOoBA71+e8Pfi0/UYmU3wW3H58kr7akA== dependencies: "@types/acorn" "^4.0.0" @@ -6089,14 +5785,14 @@ micromark-extension-mdx-jsx@^1.0.0: micromark-extension-mdx-md@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/micromark-extension-mdx-md/-/micromark-extension-mdx-md-1.0.1.tgz#595d4b2f692b134080dca92c12272ab5b74c6d1a" + resolved "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-1.0.1.tgz" integrity sha512-7MSuj2S7xjOQXAjjkbjBsHkMtb+mDGVW6uI2dBL9snOBCbZmoNgDAeZ0nSn9j3T42UE/g2xVNMn18PJxZvkBEA== dependencies: micromark-util-types "^1.0.0" micromark-extension-mdxjs-esm@^1.0.0: version "1.0.5" - resolved "https://registry.yarnpkg.com/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-1.0.5.tgz#e4f8be9c14c324a80833d8d3a227419e2b25dec1" + resolved "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-1.0.5.tgz" integrity sha512-xNRBw4aoURcyz/S69B19WnZAkWJMxHMT5hE36GtDAyhoyn/8TuAeqjFJQlwk+MKQsUD7b3l7kFX+vlfVWgcX1w== dependencies: "@types/estree" "^1.0.0" @@ -6111,7 +5807,7 @@ micromark-extension-mdxjs-esm@^1.0.0: micromark-extension-mdxjs@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/micromark-extension-mdxjs/-/micromark-extension-mdxjs-1.0.1.tgz#f78d4671678d16395efeda85170c520ee795ded8" + resolved "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-1.0.1.tgz" integrity sha512-7YA7hF6i5eKOfFUzZ+0z6avRG52GpWR8DL+kN47y3f2KhxbBZMhmxe7auOeaTBrW2DenbbZTf1ea9tA2hDpC2Q== dependencies: acorn "^8.0.0" @@ -6125,7 +5821,7 @@ micromark-extension-mdxjs@^1.0.0: micromark-factory-destination@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz#eb815957d83e6d44479b3df640f010edad667b9f" + resolved "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz" integrity sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg== dependencies: micromark-util-character "^1.0.0" @@ -6134,7 +5830,7 @@ micromark-factory-destination@^1.0.0: micromark-factory-destination@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz#8fef8e0f7081f0474fbdd92deb50c990a0264639" + resolved "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz" integrity sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA== dependencies: micromark-util-character "^2.0.0" @@ -6143,7 +5839,7 @@ micromark-factory-destination@^2.0.0: micromark-factory-label@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz#cc95d5478269085cfa2a7282b3de26eb2e2dec68" + resolved "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz" integrity sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w== dependencies: micromark-util-character "^1.0.0" @@ -6153,7 +5849,7 @@ micromark-factory-label@^1.0.0: micromark-factory-label@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz#5267efa97f1e5254efc7f20b459a38cb21058ba1" + resolved "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz" integrity sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg== dependencies: devlop "^1.0.0" @@ -6163,7 +5859,7 @@ micromark-factory-label@^2.0.0: micromark-factory-mdx-expression@^1.0.0: version "1.0.9" - resolved "https://registry.yarnpkg.com/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-1.0.9.tgz#57ba4571b69a867a1530f34741011c71c73a4976" + resolved "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-1.0.9.tgz" integrity sha512-jGIWzSmNfdnkJq05c7b0+Wv0Kfz3NJ3N4cBjnbO4zjXIlxJr+f8lk+5ZmwFvqdAbUy2q6B5rCY//g0QAAaXDWA== dependencies: "@types/estree" "^1.0.0" @@ -6177,7 +5873,7 @@ micromark-factory-mdx-expression@^1.0.0: micromark-factory-space@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz#c8f40b0640a0150751d3345ed885a080b0d15faf" + resolved "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz" integrity sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ== dependencies: micromark-util-character "^1.0.0" @@ -6185,7 +5881,7 @@ micromark-factory-space@^1.0.0: micromark-factory-space@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz#36d0212e962b2b3121f8525fc7a3c7c029f334fc" + resolved "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz" integrity sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg== dependencies: micromark-util-character "^2.0.0" @@ -6193,7 +5889,7 @@ micromark-factory-space@^2.0.0: micromark-factory-title@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz#dd0fe951d7a0ac71bdc5ee13e5d1465ad7f50ea1" + resolved "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz" integrity sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ== dependencies: micromark-factory-space "^1.0.0" @@ -6203,7 +5899,7 @@ micromark-factory-title@^1.0.0: micromark-factory-title@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz#237e4aa5d58a95863f01032d9ee9b090f1de6e94" + resolved "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz" integrity sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw== dependencies: micromark-factory-space "^2.0.0" @@ -6213,7 +5909,7 @@ micromark-factory-title@^2.0.0: micromark-factory-whitespace@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz#798fb7489f4c8abafa7ca77eed6b5745853c9705" + resolved "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz" integrity sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ== dependencies: micromark-factory-space "^1.0.0" @@ -6223,7 +5919,7 @@ micromark-factory-whitespace@^1.0.0: micromark-factory-whitespace@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz#06b26b2983c4d27bfcc657b33e25134d4868b0b1" + resolved "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz" integrity sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ== dependencies: micromark-factory-space "^2.0.0" @@ -6233,7 +5929,7 @@ micromark-factory-whitespace@^2.0.0: micromark-util-character@^1.0.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/micromark-util-character/-/micromark-util-character-1.2.0.tgz#4fedaa3646db249bc58caeb000eb3549a8ca5dcc" + resolved "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz" integrity sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg== dependencies: micromark-util-symbol "^1.0.0" @@ -6241,7 +5937,7 @@ micromark-util-character@^1.0.0: micromark-util-character@^2.0.0: version "2.1.1" - resolved "https://registry.yarnpkg.com/micromark-util-character/-/micromark-util-character-2.1.1.tgz#2f987831a40d4c510ac261e89852c4e9703ccda6" + resolved "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz" integrity sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q== dependencies: micromark-util-symbol "^2.0.0" @@ -6249,21 +5945,21 @@ micromark-util-character@^2.0.0: micromark-util-chunked@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz#37a24d33333c8c69a74ba12a14651fd9ea8a368b" + resolved "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz" integrity sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ== dependencies: micromark-util-symbol "^1.0.0" micromark-util-chunked@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz#47fbcd93471a3fccab86cff03847fc3552db1051" + resolved "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz" integrity sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA== dependencies: micromark-util-symbol "^2.0.0" micromark-util-classify-character@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz#6a7f8c8838e8a120c8e3c4f2ae97a2bff9190e9d" + resolved "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz" integrity sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw== dependencies: micromark-util-character "^1.0.0" @@ -6272,7 +5968,7 @@ micromark-util-classify-character@^1.0.0: micromark-util-classify-character@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz#d399faf9c45ca14c8b4be98b1ea481bced87b629" + resolved "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz" integrity sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q== dependencies: micromark-util-character "^2.0.0" @@ -6281,7 +5977,7 @@ micromark-util-classify-character@^2.0.0: micromark-util-combine-extensions@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz#192e2b3d6567660a85f735e54d8ea6e3952dbe84" + resolved "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz" integrity sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA== dependencies: micromark-util-chunked "^1.0.0" @@ -6289,7 +5985,7 @@ micromark-util-combine-extensions@^1.0.0: micromark-util-combine-extensions@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz#2a0f490ab08bff5cc2fd5eec6dd0ca04f89b30a9" + resolved "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz" integrity sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg== dependencies: micromark-util-chunked "^2.0.0" @@ -6297,21 +5993,21 @@ micromark-util-combine-extensions@^2.0.0: micromark-util-decode-numeric-character-reference@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz#b1e6e17009b1f20bc652a521309c5f22c85eb1c6" + resolved "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz" integrity sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw== dependencies: micromark-util-symbol "^1.0.0" micromark-util-decode-numeric-character-reference@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz#fcf15b660979388e6f118cdb6bf7d79d73d26fe5" + resolved "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz" integrity sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw== dependencies: micromark-util-symbol "^2.0.0" micromark-util-decode-string@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz#dc12b078cba7a3ff690d0203f95b5d5537f2809c" + resolved "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz" integrity sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ== dependencies: decode-named-character-reference "^1.0.0" @@ -6321,7 +6017,7 @@ micromark-util-decode-string@^1.0.0: micromark-util-decode-string@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz#6cb99582e5d271e84efca8e61a807994d7161eb2" + resolved "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz" integrity sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ== dependencies: decode-named-character-reference "^1.0.0" @@ -6331,17 +6027,17 @@ micromark-util-decode-string@^2.0.0: micromark-util-encode@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz#92e4f565fd4ccb19e0dcae1afab9a173bbeb19a5" + resolved "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz" integrity sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw== micromark-util-encode@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz#0d51d1c095551cfaac368326963cf55f15f540b8" + resolved "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz" integrity sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw== micromark-util-events-to-acorn@^1.0.0: version "1.2.3" - resolved "https://registry.yarnpkg.com/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-1.2.3.tgz#a4ab157f57a380e646670e49ddee97a72b58b557" + resolved "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-1.2.3.tgz" integrity sha512-ij4X7Wuc4fED6UoLWkmo0xJQhsktfNh1J0m8g4PbIMPlx+ek/4YdW5mvbye8z/aZvAPUoxgXHrwVlXAPKMRp1w== dependencies: "@types/acorn" "^4.0.0" @@ -6355,45 +6051,45 @@ micromark-util-events-to-acorn@^1.0.0: micromark-util-html-tag-name@^1.0.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz#48fd7a25826f29d2f71479d3b4e83e94829b3588" + resolved "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz" integrity sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q== micromark-util-html-tag-name@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz#e40403096481986b41c106627f98f72d4d10b825" + resolved "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz" integrity sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA== micromark-util-normalize-identifier@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz#7a73f824eb9f10d442b4d7f120fecb9b38ebf8b7" + resolved "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz" integrity sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q== dependencies: micromark-util-symbol "^1.0.0" micromark-util-normalize-identifier@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz#c30d77b2e832acf6526f8bf1aa47bc9c9438c16d" + resolved "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz" integrity sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q== dependencies: micromark-util-symbol "^2.0.0" micromark-util-resolve-all@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz#4652a591ee8c8fa06714c9b54cd6c8e693671188" + resolved "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz" integrity sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA== dependencies: micromark-util-types "^1.0.0" micromark-util-resolve-all@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz#e1a2d62cdd237230a2ae11839027b19381e31e8b" + resolved "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz" integrity sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg== dependencies: micromark-util-types "^2.0.0" micromark-util-sanitize-uri@^1.0.0, micromark-util-sanitize-uri@^1.1.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz#613f738e4400c6eedbc53590c67b197e30d7f90d" + resolved "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz" integrity sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A== dependencies: micromark-util-character "^1.0.0" @@ -6402,7 +6098,7 @@ micromark-util-sanitize-uri@^1.0.0, micromark-util-sanitize-uri@^1.1.0: micromark-util-sanitize-uri@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz#ab89789b818a58752b73d6b55238621b7faa8fd7" + resolved "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz" integrity sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ== dependencies: micromark-util-character "^2.0.0" @@ -6411,7 +6107,7 @@ micromark-util-sanitize-uri@^2.0.0: micromark-util-subtokenize@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz#941c74f93a93eaf687b9054aeb94642b0e92edb1" + resolved "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz" integrity sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A== dependencies: micromark-util-chunked "^1.0.0" @@ -6421,7 +6117,7 @@ micromark-util-subtokenize@^1.0.0: micromark-util-subtokenize@^2.0.0: version "2.0.3" - resolved "https://registry.yarnpkg.com/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.3.tgz#70ffb99a454bd8c913c8b709c3dc97baefb65f96" + resolved "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.3.tgz" integrity sha512-VXJJuNxYWSoYL6AJ6OQECCFGhIU2GGHMw8tahogePBrjkG8aCCas3ibkp7RnVOSTClg2is05/R7maAhF1XyQMg== dependencies: devlop "^1.0.0" @@ -6431,27 +6127,27 @@ micromark-util-subtokenize@^2.0.0: micromark-util-symbol@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz#813cd17837bdb912d069a12ebe3a44b6f7063142" + resolved "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz" integrity sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag== micromark-util-symbol@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz#e5da494e8eb2b071a0d08fb34f6cefec6c0a19b8" + resolved "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz" integrity sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q== micromark-util-types@^1.0.0, micromark-util-types@^1.0.1: version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-1.1.0.tgz#e6676a8cae0bb86a2171c498167971886cb7e283" + resolved "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz" integrity sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg== micromark-util-types@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-2.0.1.tgz#a3edfda3022c6c6b55bfb049ef5b75d70af50709" + resolved "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.1.tgz" integrity sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ== micromark@^3.0.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/micromark/-/micromark-3.2.0.tgz#1af9fef3f995ea1ea4ac9c7e2f19c48fd5c006e9" + resolved "https://registry.npmjs.org/micromark/-/micromark-3.2.0.tgz" integrity sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA== dependencies: "@types/debug" "^4.0.0" @@ -6474,7 +6170,7 @@ micromark@^3.0.0: micromark@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/micromark/-/micromark-4.0.1.tgz#294c2f12364759e5f9e925a767ae3dfde72223ff" + resolved "https://registry.npmjs.org/micromark/-/micromark-4.0.1.tgz" integrity sha512-eBPdkcoCNvYcxQOAKAlceo5SNdzZWfF+FcSupREAzdAh9rRmE239CEQAiTwIgblwnoM8zzj35sZ5ZwvSEOF6Kw== dependencies: "@types/debug" "^4.0.0" @@ -6497,7 +6193,7 @@ micromark@^4.0.0: micromatch@^4.0.4, micromatch@^4.0.5, micromatch@^4.0.8: version "4.0.8" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz" integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== dependencies: braces "^3.0.3" @@ -6505,119 +6201,124 @@ micromatch@^4.0.4, micromatch@^4.0.5, micromatch@^4.0.8: mime-db@1.52.0: version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== mime-types@^2.1.12: version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + 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" mimic-fn@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== mimic-function@^5.0.0: version "5.0.1" - resolved "https://registry.yarnpkg.com/mimic-function/-/mimic-function-5.0.1.tgz#acbe2b3349f99b9deaca7fb70e48b83e94e67076" + resolved "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz" integrity sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA== min-indent@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" + resolved "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz" integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== -minimatch@9.0.3: - version "9.0.3" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" - integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== - dependencies: - brace-expansion "^2.0.1" - minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" -minimatch@^9.0.1, minimatch@^9.0.4: +minimatch@^9.0.1: version "9.0.5" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz" integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== dependencies: brace-expansion "^2.0.1" +minimatch@9.0.3: + version "9.0.3" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz" + integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== + dependencies: + brace-expansion "^2.0.1" + minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6, minimist@^1.2.8: version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== -"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0": version "7.1.2" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" + resolved "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz" integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== mkdirp@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-3.0.1.tgz#e44e4c5607fb279c168241713cc6e0fea9adcb50" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz" integrity sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg== mri@^1.1.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" + resolved "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz" integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== - ms@^2.1.1, ms@^2.1.3: version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== +ms@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + mute-stream@1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-1.0.0.tgz#e31bd9fe62f0aed23520aa4324ea6671531e013e" + resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz" integrity sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA== mz@^2.7.0: version "2.7.0" - resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" + resolved "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz" integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== dependencies: any-promise "^1.0.0" object-assign "^4.0.1" thenify-all "^1.0.0" -nanoid@^3.3.6, nanoid@^3.3.7: - version "3.3.8" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.8.tgz#b1be3030bee36aaff18bacb375e5cce521684baf" - integrity sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w== +nanoid@^3.3.6: + version "3.3.9" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.9.tgz" + integrity sha512-SppoicMGpZvbF1l3z4x7No3OlIjP7QJvC9XR7AhZr1kL133KHnKPztkKDc+Ir4aJ/1VhTySrtKhrsycmrMQfvg== -nanoid@^5.0.1: - version "5.0.9" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-5.0.9.tgz#977dcbaac055430ce7b1e19cf0130cea91a20e50" - integrity sha512-Aooyr6MXU6HpvvWXKoVoXwKMs/KyVakWwg7xQfv5/S/RIgJMy0Ifa45H9qqYy7pTCszrHzP21Uk4PZq2HpEM8Q== +nanoid@^3.3.7: + version "3.3.9" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.9.tgz" + integrity sha512-SppoicMGpZvbF1l3z4x7No3OlIjP7QJvC9XR7AhZr1kL133KHnKPztkKDc+Ir4aJ/1VhTySrtKhrsycmrMQfvg== + +nanoid@^5.0.1, "nanoid@4 - 5": + version "5.1.3" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-5.1.3.tgz" + integrity sha512-zAbEOEr7u2CbxwoMRlz/pNSpRP0FdAU4pRaYunCdEezWohXFs+a0Xw7RfkKaezMsmSM1vttcLthJtwRnVtOfHQ== natural-compare@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== neo-async@^2.6.2: version "2.6.2" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== next-mdx-remote@^4.2.1: version "4.4.1" - resolved "https://registry.yarnpkg.com/next-mdx-remote/-/next-mdx-remote-4.4.1.tgz#96b16e2adc54dbcd0a7f204a9a3c3fd269d41abf" + resolved "https://registry.npmjs.org/next-mdx-remote/-/next-mdx-remote-4.4.1.tgz" integrity sha512-1BvyXaIou6xy3XoNF4yaMZUCb6vD2GTAa5ciOa6WoO+gAUTYsb1K4rI/HSC2ogAWLrb/7VSV52skz07vOzmqIQ== dependencies: "@mdx-js/mdx" "^2.2.1" @@ -6627,12 +6328,12 @@ next-mdx-remote@^4.2.1: next-seo@^6.0.0, next-seo@^6.5.0: version "6.6.0" - resolved "https://registry.yarnpkg.com/next-seo/-/next-seo-6.6.0.tgz#10c6278cc3be51f9db1ede6780812e5664742974" + resolved "https://registry.npmjs.org/next-seo/-/next-seo-6.6.0.tgz" integrity sha512-0VSted/W6XNtgAtH3D+BZrMLLudqfm0D5DYNJRXHcDgan/1ZF1tDFIsWrmvQlYngALyphPfZ3ZdOqlKpKdvG6w== next-sitemap@^4.2.3: version "4.2.3" - resolved "https://registry.yarnpkg.com/next-sitemap/-/next-sitemap-4.2.3.tgz#5db3f650351a51e84b9fd6b58c5af2f9257b5058" + resolved "https://registry.npmjs.org/next-sitemap/-/next-sitemap-4.2.3.tgz" integrity sha512-vjdCxeDuWDzldhCnyFCQipw5bfpl4HmZA7uoo3GAaYGjGgfL4Cxb1CiztPuWGmS+auYs7/8OekRS8C2cjdAsjQ== dependencies: "@corex/deepmerge" "^4.0.43" @@ -6642,12 +6343,12 @@ next-sitemap@^4.2.3: next-themes@^0.2.1: version "0.2.1" - resolved "https://registry.yarnpkg.com/next-themes/-/next-themes-0.2.1.tgz#0c9f128e847979daf6c67f70b38e6b6567856e45" + resolved "https://registry.npmjs.org/next-themes/-/next-themes-0.2.1.tgz" integrity sha512-B+AKNfYNIzh0vqQQKqQItTS8evEouKD7H5Hj3kmuPERwddR2TxvDSFZuTj6T7Jfn1oyeUyJMydPl1Bkxkh0W7A== -next@^14.1.4: +next@*, "next@^13.0.0 || ^14.0.0", next@^14.1.4, "next@^8.1.1-canary.54 || >=9.0.0", next@>=9.5.3: version "14.2.22" - resolved "https://registry.yarnpkg.com/next/-/next-14.2.22.tgz#0cd664916ef4c725f31fa812d870348cffd0115b" + resolved "https://registry.npmjs.org/next/-/next-14.2.22.tgz" integrity sha512-Ps2caobQ9hlEhscLPiPm3J3SYhfwfpMqzsoCMZGWxt9jBRK9hoBZj2A37i8joKhsyth2EuVKDVJCTF5/H4iEDw== dependencies: "@next/env" "14.2.22" @@ -6670,7 +6371,7 @@ next@^14.1.4: nextra-theme-docs@^2.13.4: version "2.13.4" - resolved "https://registry.yarnpkg.com/nextra-theme-docs/-/nextra-theme-docs-2.13.4.tgz#821795e149537413f459ae4b520eba1a195e5e07" + resolved "https://registry.npmjs.org/nextra-theme-docs/-/nextra-theme-docs-2.13.4.tgz" integrity sha512-2XOoMfwBCTYBt8ds4ZHftt9Wyf2XsykiNo02eir/XEYB+sGeUoE77kzqfidjEOKCSzOHYbK9BDMcg2+B/2vYRw== dependencies: "@headlessui/react" "^1.7.17" @@ -6687,9 +6388,9 @@ nextra-theme-docs@^2.13.4: scroll-into-view-if-needed "^3.1.0" zod "^3.22.3" -nextra@^2.13.4: +nextra@^2.13.4, nextra@2.13.4: version "2.13.4" - resolved "https://registry.yarnpkg.com/nextra/-/nextra-2.13.4.tgz#49e9f558735d86292cd8578b5a69f6d926bc2a14" + resolved "https://registry.npmjs.org/nextra/-/nextra-2.13.4.tgz" integrity sha512-7of2rSBxuUa3+lbMmZwG9cqgftcoNOVQLTT6Rxf3EhBR9t1EI7b43dted8YoqSNaigdE3j1CoyNkX8N/ZzlEpw== dependencies: "@headlessui/react" "^1.7.17" @@ -6721,7 +6422,7 @@ nextra@^2.13.4: no-case@^3.0.4: version "3.0.4" - resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" + resolved "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz" integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== dependencies: lower-case "^2.0.2" @@ -6729,24 +6430,24 @@ no-case@^3.0.4: node-addon-api@^7.0.0: version "7.1.1" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-7.1.1.tgz#1aba6693b0f255258a049d621329329322aad558" + resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz" integrity sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ== node-domexception@1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/node-domexception/-/node-domexception-1.0.0.tgz#6888db46a1f71c0b76b3f7555016b63fe64766e5" + resolved "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz" integrity sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ== node-fetch@^2.0.0: version "2.7.0" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz" integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== dependencies: whatwg-url "^5.0.0" node-plop@^0.32.0: version "0.32.0" - resolved "https://registry.yarnpkg.com/node-plop/-/node-plop-0.32.0.tgz#ec9952c3a8f7e47733a9e7b96b006d05369a5624" + resolved "https://registry.npmjs.org/node-plop/-/node-plop-0.32.0.tgz" integrity sha512-lKFSRSRuDHhwDKMUobdsvaWCbbDRbV3jMUSMiajQSQux1aNUevAZVxUHc2JERI//W8ABPRbi3ebYuSuIzkNIpQ== dependencies: "@types/inquirer" "^9.0.3" @@ -6765,59 +6466,59 @@ node-plop@^0.32.0: node-releases@^2.0.19: version "2.0.19" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.19.tgz#9e445a52950951ec4d177d843af370b411caf314" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz" integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw== non-layered-tidy-tree-layout@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/non-layered-tidy-tree-layout/-/non-layered-tidy-tree-layout-2.0.2.tgz#57d35d13c356643fc296a55fb11ac15e74da7804" + resolved "https://registry.npmjs.org/non-layered-tidy-tree-layout/-/non-layered-tidy-tree-layout-2.0.2.tgz" integrity sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw== normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== normalize-range@^0.1.2: version "0.1.2" - resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + resolved "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz" integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== npm-run-path@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz" integrity sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw== dependencies: path-key "^2.0.0" npm-to-yarn@^2.1.0: version "2.2.1" - resolved "https://registry.yarnpkg.com/npm-to-yarn/-/npm-to-yarn-2.2.1.tgz#048843a6630621daffc6a239dfc89698b8abf7e8" + resolved "https://registry.npmjs.org/npm-to-yarn/-/npm-to-yarn-2.2.1.tgz" integrity sha512-O/j/ROyX0KGLG7O6Ieut/seQ0oiTpHF2tXAcFbpdTLQFiaNtkyTXXocM1fwpaa60dg1qpWj0nHlbNhx6qwuENQ== object-assign@^4.0.1, object-assign@^4.1.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== object-hash@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" + resolved "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz" integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== object-inspect@^1.13.3: version "1.13.3" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.3.tgz#f14c183de51130243d6d18ae149375ff50ea488a" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz" integrity sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA== object-keys@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== object.assign@^4.1.4, object.assign@^4.1.7: version "4.1.7" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.7.tgz#8c14ca1a424c6a561b0bb2a22f66f5049a945d3d" + 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.8" @@ -6829,7 +6530,7 @@ object.assign@^4.1.4, object.assign@^4.1.7: object.defaults@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/object.defaults/-/object.defaults-1.1.0.tgz#3a7f868334b407dea06da16d88d5cd29e435fecf" + resolved "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz" integrity sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA== dependencies: array-each "^1.0.1" @@ -6839,7 +6540,7 @@ object.defaults@^1.1.0: object.entries@^1.1.8: version "1.1.8" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.8.tgz#bffe6f282e01f4d17807204a24f8edd823599c41" + resolved "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz" integrity sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ== dependencies: call-bind "^1.0.7" @@ -6848,7 +6549,7 @@ object.entries@^1.1.8: object.fromentries@^2.0.8: version "2.0.8" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" + resolved "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz" integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== dependencies: call-bind "^1.0.7" @@ -6858,7 +6559,7 @@ object.fromentries@^2.0.8: object.groupby@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.3.tgz#9b125c36238129f6f7b61954a1e7176148d5002e" + resolved "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz" integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== dependencies: call-bind "^1.0.7" @@ -6867,7 +6568,7 @@ object.groupby@^1.0.3: object.map@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/object.map/-/object.map-1.0.1.tgz#cf83e59dc8fcc0ad5f4250e1f78b3b81bd801d37" + resolved "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz" integrity sha512-3+mAJu2PLfnSVGHwIWubpOFLscJANBKuB/6A4CxBstc4aqwQY0FWcsppuy4jU5GSB95yES5JHSI+33AWuS4k6w== dependencies: for-own "^1.0.0" @@ -6875,14 +6576,14 @@ object.map@^1.0.1: object.pick@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + resolved "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz" integrity sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ== dependencies: isobject "^3.0.1" object.values@^1.1.6, object.values@^1.2.0, object.values@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.1.tgz#deed520a50809ff7f75a7cfd4bc64c7a038c6216" + resolved "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz" integrity sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA== dependencies: call-bind "^1.0.8" @@ -6892,33 +6593,42 @@ object.values@^1.1.6, object.values@^1.2.0, object.values@^1.2.1: once@^1.3.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" onetime@^5.1.0: version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz" integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== dependencies: mimic-fn "^2.1.0" onetime@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-7.0.0.tgz#9f16c92d8c9ef5120e3acd9dd9957cceecc1ab60" + resolved "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz" integrity sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ== dependencies: mimic-function "^5.0.0" +open@^8.0.4: + version "8.4.2" + resolved "https://registry.npmjs.org/open/-/open-8.4.2.tgz" + integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== + dependencies: + define-lazy-prop "^2.0.0" + is-docker "^2.1.1" + is-wsl "^2.2.0" + openapi-types@^12.1.3: version "12.1.3" - resolved "https://registry.yarnpkg.com/openapi-types/-/openapi-types-12.1.3.tgz#471995eb26c4b97b7bd356aacf7b91b73e777dd3" + resolved "https://registry.npmjs.org/openapi-types/-/openapi-types-12.1.3.tgz" integrity sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw== optionator@^0.9.3: version "0.9.4" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz" integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== dependencies: deep-is "^0.1.3" @@ -6930,7 +6640,7 @@ optionator@^0.9.3: ora@^5.4.1: version "5.4.1" - resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" + resolved "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz" integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== dependencies: bl "^4.1.0" @@ -6945,7 +6655,7 @@ ora@^5.4.1: ora@^8.0.0: version "8.1.1" - resolved "https://registry.yarnpkg.com/ora/-/ora-8.1.1.tgz#8efc8865e44c87e4b55468a47e80a03e678b0e54" + resolved "https://registry.npmjs.org/ora/-/ora-8.1.1.tgz" integrity sha512-YWielGi1XzG1UTvOaCFaNgEnuhZVMSHYkW/FQ7UX8O26PtlpdM84c0f7wLPlkvx2RfiQmnzd61d/MGxmpQeJPw== dependencies: chalk "^5.3.0" @@ -6960,12 +6670,12 @@ ora@^8.0.0: os-tmpdir@~1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + resolved "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz" integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== own-keys@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/own-keys/-/own-keys-1.0.1.tgz#e4006910a2bf913585289676eebd6f390cf51358" + resolved "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz" integrity sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg== dependencies: get-intrinsic "^1.2.6" @@ -6974,38 +6684,33 @@ own-keys@^1.0.0: p-finally@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + resolved "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz" integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== p-limit@^3.0.2, p-limit@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== dependencies: yocto-queue "^0.1.0" p-locate@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== dependencies: p-limit "^3.0.2" p-map@^5.5.0: version "5.5.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-5.5.0.tgz#054ca8ca778dfa4cf3f8db6638ccb5b937266715" + resolved "https://registry.npmjs.org/p-map/-/p-map-5.5.0.tgz" integrity sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg== dependencies: aggregate-error "^4.0.0" -package-json-from-dist@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505" - integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== - param-case@^3.0.4: version "3.0.4" - resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" + resolved "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz" integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== dependencies: dot-case "^3.0.4" @@ -7013,14 +6718,14 @@ param-case@^3.0.4: parent-module@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== dependencies: callsites "^3.0.0" parse-entities@^4.0.0: version "4.0.2" - resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-4.0.2.tgz#61d46f5ed28e4ee62e9ddc43d6b010188443f159" + resolved "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz" integrity sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw== dependencies: "@types/unist" "^2.0.0" @@ -7033,7 +6738,7 @@ parse-entities@^4.0.0: parse-filepath@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/parse-filepath/-/parse-filepath-1.0.2.tgz#a632127f53aaf3d15876f5872f3ffac763d6c891" + resolved "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz" integrity sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q== dependencies: is-absolute "^1.0.0" @@ -7042,43 +6747,43 @@ parse-filepath@^1.0.2: parse-ms@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-3.0.0.tgz#3ea24a934913345fcc3656deda72df921da3a70e" + resolved "https://registry.npmjs.org/parse-ms/-/parse-ms-3.0.0.tgz" integrity sha512-Tpb8Z7r7XbbtBTrM9UhpkzzaMrqA2VXMT3YChzYltwV3P3pM6t8wl7TvpMnSTosz1aQAdVib7kdoys7vYOPerw== parse-numeric-range@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz#7c63b61190d61e4d53a1197f0c83c47bb670ffa3" + resolved "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz" integrity sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ== parse-passwd@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" + resolved "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz" integrity sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q== parse-path@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/parse-path/-/parse-path-7.0.0.tgz#605a2d58d0a749c8594405d8cc3a2bf76d16099b" + resolved "https://registry.npmjs.org/parse-path/-/parse-path-7.0.0.tgz" integrity sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog== dependencies: protocols "^2.0.0" parse-url@^8.1.0: version "8.1.0" - resolved "https://registry.yarnpkg.com/parse-url/-/parse-url-8.1.0.tgz#972e0827ed4b57fc85f0ea6b0d839f0d8a57a57d" + resolved "https://registry.npmjs.org/parse-url/-/parse-url-8.1.0.tgz" integrity sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w== dependencies: parse-path "^7.0.0" parse5@^7.0.0: version "7.2.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.2.1.tgz#8928f55915e6125f430cc44309765bf17556a33a" + resolved "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz" integrity sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ== dependencies: entities "^4.5.0" pascal-case@^3.1.2: version "3.1.2" - resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" + resolved "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz" integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== dependencies: no-case "^3.0.4" @@ -7086,7 +6791,7 @@ pascal-case@^3.1.2: path-case@^3.0.4: version "3.0.4" - resolved "https://registry.yarnpkg.com/path-case/-/path-case-3.0.4.tgz#9168645334eb942658375c56f80b4c0cb5f82c6f" + resolved "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz" integrity sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg== dependencies: dot-case "^3.0.4" @@ -7094,44 +6799,44 @@ path-case@^3.0.4: path-exists@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== path-is-absolute@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== path-key@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + resolved "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz" integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== path-key@^3.1.0: version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== path-parse@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== path-root-regex@^0.1.0: version "0.1.2" - resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d" + resolved "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz" integrity sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ== path-root@^0.1.1: version "0.1.1" - resolved "https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7" + resolved "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz" integrity sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg== dependencies: path-root-regex "^0.1.0" -path-scurry@^1.10.1, path-scurry@^1.11.1: +path-scurry@^1.10.1: version "1.11.1" - resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" + resolved "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz" integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== dependencies: lru-cache "^10.2.0" @@ -7139,12 +6844,12 @@ path-scurry@^1.10.1, path-scurry@^1.11.1: path-type@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== path@^0.12.7: version "0.12.7" - resolved "https://registry.yarnpkg.com/path/-/path-0.12.7.tgz#d4dc2a506c4ce2197eb481ebfcd5b36c0140b10f" + resolved "https://registry.npmjs.org/path/-/path-0.12.7.tgz" integrity sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q== dependencies: process "^0.11.1" @@ -7152,12 +6857,12 @@ path@^0.12.7: pathval@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/pathval/-/pathval-2.0.0.tgz#7e2550b422601d4f6b8e26f1301bc8f15a741a25" + resolved "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz" integrity sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA== periscopic@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/periscopic/-/periscopic-3.1.0.tgz#7e9037bf51c5855bd33b48928828db4afa79d97a" + resolved "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz" integrity sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw== dependencies: "@types/estree" "^1.0.0" @@ -7166,34 +6871,34 @@ periscopic@^3.0.0: picocolors@^1.0.0, picocolors@^1.0.1, picocolors@^1.1.0, picocolors@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz" integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== pify@^2.3.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== pirates@^4.0.1: version "4.0.6" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" + resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz" integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== plop-helper-date@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/plop-helper-date/-/plop-helper-date-1.0.0.tgz#c795542b8a130b91494f65ea46387c266efa5ec4" + resolved "https://registry.npmjs.org/plop-helper-date/-/plop-helper-date-1.0.0.tgz" integrity sha512-JxRJKUICQndhuxfuJL/z7ZWL+muct8FwNK3o0Lm6EWLcoSNRP3sTIh4E86zpNvBmKUg/2Jl30NKt0NXsZ88u+Q== dependencies: date-fns "^2.15.0" plop@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/plop/-/plop-4.0.1.tgz#85d8a6e9d6d4dbcb1ec811f0d3220ae869539dd2" + resolved "https://registry.npmjs.org/plop/-/plop-4.0.1.tgz" integrity sha512-5n8QU93kvL/ObOzBcPAB1siVFtAH1TZM6TntJ3JK5kXT0jIgnQV+j+uaOWWFJlg1cNkzLYm8klgASF65K36q9w== dependencies: "@types/liftoff" "^4.0.3" @@ -7207,12 +6912,12 @@ plop@^4.0.1: possible-typed-array-names@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" + resolved "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz" integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== postcss-import@^15.1.0: version "15.1.0" - resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-15.1.0.tgz#41c64ed8cc0e23735a9698b3249ffdbf704adc70" + resolved "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz" integrity sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew== dependencies: postcss-value-parser "^4.0.0" @@ -7221,14 +6926,14 @@ postcss-import@^15.1.0: postcss-js@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-4.0.1.tgz#61598186f3703bab052f1c4f7d805f3991bee9d2" + resolved "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz" integrity sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw== dependencies: camelcase-css "^2.0.1" postcss-load-config@^4.0.2: version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-4.0.2.tgz#7159dcf626118d33e299f485d6afe4aff7c4a3e3" + resolved "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz" integrity sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ== dependencies: lilconfig "^3.0.0" @@ -7236,14 +6941,14 @@ postcss-load-config@^4.0.2: postcss-nested@^6.0.1, postcss-nested@^6.2.0: version "6.2.0" - resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-6.2.0.tgz#4c2d22ab5f20b9cb61e2c5c5915950784d068131" + resolved "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz" integrity sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ== dependencies: postcss-selector-parser "^6.1.1" postcss-selector-parser@^6.1.1, postcss-selector-parser@^6.1.2: version "6.1.2" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz#27ecb41fb0e3b6ba7a1ec84fff347f734c7929de" + resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz" integrity sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg== dependencies: cssesc "^3.0.0" @@ -7251,45 +6956,60 @@ postcss-selector-parser@^6.1.1, postcss-selector-parser@^6.1.2: postcss-value-parser@^4.0.0, postcss-value-parser@^4.2.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@8.4.31: - version "8.4.31" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" - integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== - dependencies: - nanoid "^3.3.6" - picocolors "^1.0.0" - source-map-js "^1.0.2" - -postcss@^8, postcss@^8.4.43, postcss@^8.4.47: +postcss@^8, postcss@^8.0.0, postcss@^8.1.0, postcss@^8.2.14, postcss@^8.4.21, postcss@^8.4.43, postcss@^8.4.47, postcss@^8.4.48, postcss@>=8.0.9: version "8.4.49" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.49.tgz#4ea479048ab059ab3ae61d082190fabfd994fe19" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz" integrity sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA== dependencies: nanoid "^3.3.7" picocolors "^1.1.1" source-map-js "^1.2.1" +postcss@8.4.31: + version "8.4.31" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz" + integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== + dependencies: + nanoid "^3.3.6" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +posthog-js@^1.194.6: + version "1.229.5" + resolved "https://registry.npmjs.org/posthog-js/-/posthog-js-1.229.5.tgz" + integrity sha512-M7WewK9nltttOpQ7TVksrTYun+A4MOC3auHQ7IGTEariXfTrRApvWnQFbRTZ1C4kLWFvsvsamotJf9nC+PgCug== + dependencies: + core-js "^3.38.1" + fflate "^0.4.8" + preact "^10.19.3" + web-vitals "^4.2.0" + +preact@^10.19.3: + version "10.26.4" + resolved "https://registry.npmjs.org/preact/-/preact-10.26.4.tgz" + integrity sha512-KJhO7LBFTjP71d83trW+Ilnjbo+ySsaAgCfXOXUlmGzJ4ygYPWmysm77yg4emwfmoz3b22yvH5IsVFHbhUaH5w== + prelude-ls@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== -prettier@^3.2.5: +"prettier@^2 || ^3", prettier@^3.2.5: version "3.4.2" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.4.2.tgz#a5ce1fb522a588bf2b78ca44c6e6fe5aa5a2b13f" + resolved "https://registry.npmjs.org/prettier/-/prettier-3.4.2.tgz" integrity sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ== pretty-bytes@^6.1.1: version "6.1.1" - resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-6.1.1.tgz#38cd6bb46f47afbf667c202cfc754bffd2016a3b" + resolved "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-6.1.1.tgz" integrity sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ== pretty-format@^27.0.2: version "27.5.1" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz" integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== dependencies: ansi-regex "^5.0.1" @@ -7298,24 +7018,24 @@ pretty-format@^27.0.2: pretty-ms@^8.0.0: version "8.0.0" - resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-8.0.0.tgz#a35563b2a02df01e595538f86d7de54ca23194a3" + resolved "https://registry.npmjs.org/pretty-ms/-/pretty-ms-8.0.0.tgz" integrity sha512-ASJqOugUF1bbzI35STMBUpZqdfYKlJugy6JBziGi2EE+AL5JPJGSzvpeVXojxrr0ViUYoToUjb5kjSEGf7Y83Q== dependencies: parse-ms "^3.0.0" prismjs@^1.29.0: version "1.29.0" - resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.29.0.tgz#f113555a8fa9b57c35e637bba27509dcf802dd12" + resolved "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz" integrity sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q== -process@^0.11.1: +process@^0.11.1, process@^0.11.10: version "0.11.10" - resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + resolved "https://registry.npmjs.org/process/-/process-0.11.10.tgz" integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== prop-types@^15.8.1: version "15.8.1" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== dependencies: loose-envify "^1.4.0" @@ -7324,37 +7044,37 @@ prop-types@^15.8.1: property-information@^6.0.0: version "6.5.0" - resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.5.0.tgz#6212fbb52ba757e92ef4fb9d657563b933b7ffec" + resolved "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz" integrity sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig== protocols@^2.0.0, protocols@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/protocols/-/protocols-2.0.1.tgz#8f155da3fc0f32644e83c5782c8e8212ccf70a86" + resolved "https://registry.npmjs.org/protocols/-/protocols-2.0.1.tgz" integrity sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q== proxy-from-env@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== pseudomap@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + resolved "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz" integrity sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ== punycode@^2.1.0: version "2.3.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== queue-microtask@^1.2.2: version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== -react-dom@^18: +react-dom@*, "react-dom@^16 || ^17 || ^18", "react-dom@^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", react-dom@^18, react-dom@^18.2.0, "react-dom@>= 18.0.0", react-dom@>=16.0.0, react-dom@>=16.13.1, react-dom@>=16.8.0, "react-dom@>=16.x <=18.x": version "18.3.1" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.3.1.tgz#c2265d79511b57d479b3dd3fdfa51536494c5cb4" + resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz" integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== dependencies: loose-envify "^1.1.0" @@ -7362,27 +7082,27 @@ react-dom@^18: react-hook-form@^7.51.1: version "7.54.2" - resolved "https://registry.yarnpkg.com/react-hook-form/-/react-hook-form-7.54.2.tgz#8c26ed54c71628dff57ccd3c074b1dd377cfb211" + resolved "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.54.2.tgz" integrity sha512-eHpAUgUjWbZocoQYUHposymRb4ZP6d0uwUnooL2uOybA9/3tPUvoAKqEWK1WaSiTxxOfTpffNZP7QwlnM3/gEg== react-icons@^5.0.1: version "5.4.0" - resolved "https://registry.yarnpkg.com/react-icons/-/react-icons-5.4.0.tgz#443000f6e5123ee1b21ea8c0a716f6e7797f7416" + resolved "https://registry.npmjs.org/react-icons/-/react-icons-5.4.0.tgz" integrity sha512-7eltJxgVt7X64oHh6wSWNwwbKTCtMfK35hcjvJS0yxEAhPM8oUKdS3+kqaW1vicIltw+kR2unHaa12S9pPALoQ== react-is@^16.13.1: version "16.13.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== react-is@^17.0.1: version "17.0.2" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" + resolved "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz" integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== react-markdown@^9.0.1: version "9.0.1" - resolved "https://registry.yarnpkg.com/react-markdown/-/react-markdown-9.0.1.tgz#c05ddbff67fd3b3f839f8c648e6fb35d022397d1" + resolved "https://registry.npmjs.org/react-markdown/-/react-markdown-9.0.1.tgz" integrity sha512-186Gw/vF1uRkydbsOIkcGXw7aHq0sZOCRFFjGrr7b9+nVZg4UfA4enXCaxm4fUzecU38sWfrNDitGhshuU7rdg== dependencies: "@types/hast" "^3.0.0" @@ -7398,7 +7118,7 @@ react-markdown@^9.0.1: react-remove-scroll-bar@^2.3.7: version "2.3.8" - resolved "https://registry.yarnpkg.com/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz#99c20f908ee467b385b68a3469b4a3e750012223" + resolved "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz" integrity sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q== dependencies: react-style-singleton "^2.2.2" @@ -7406,7 +7126,7 @@ react-remove-scroll-bar@^2.3.7: react-remove-scroll@^2.6.1: version "2.6.2" - resolved "https://registry.yarnpkg.com/react-remove-scroll/-/react-remove-scroll-2.6.2.tgz#2518d2c5112e71ea8928f1082a58459b5c7a2a97" + resolved "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.6.2.tgz" integrity sha512-KmONPx5fnlXYJQqC62Q+lwIeAk64ws/cUw6omIumRzMRPqgnYqhSSti99nbj0Ry13bv7dF+BKn7NB+OqkdZGTw== dependencies: react-remove-scroll-bar "^2.3.7" @@ -7417,7 +7137,7 @@ react-remove-scroll@^2.6.1: react-share@^5.1.0: version "5.1.2" - resolved "https://registry.yarnpkg.com/react-share/-/react-share-5.1.2.tgz#eccce92ab3f01d8d07a39ce6057e3c3e82ab6711" + resolved "https://registry.npmjs.org/react-share/-/react-share-5.1.2.tgz" integrity sha512-qwMT72LrGvDsg3E5lKlvUcXH4YWqjLcqlinxIomGaey2SoS/1/DBkTpan3TyzX9gDr0dcp1bl+z5LbdOOE4bmA== dependencies: classnames "^2.3.2" @@ -7425,7 +7145,7 @@ react-share@^5.1.0: react-style-singleton@^2.2.1, react-style-singleton@^2.2.2: version "2.2.3" - resolved "https://registry.yarnpkg.com/react-style-singleton/-/react-style-singleton-2.2.3.tgz#4265608be69a4d70cfe3047f2c6c88b2c3ace388" + resolved "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz" integrity sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ== dependencies: get-nonce "^1.0.0" @@ -7433,30 +7153,30 @@ react-style-singleton@^2.2.1, react-style-singleton@^2.2.2: react-tweet@^3.2.0: version "3.2.1" - resolved "https://registry.yarnpkg.com/react-tweet/-/react-tweet-3.2.1.tgz#000d9bf2b2ce919fdec0e14241f05631e8917143" + resolved "https://registry.npmjs.org/react-tweet/-/react-tweet-3.2.1.tgz" integrity sha512-dktP3RMuwRB4pnSDocKpSsW5Hq1IXRW6fONkHhxT5EBIXsKZzdQuI70qtub1XN2dtZdkJWWxfBm/Q+kN+vRYFA== dependencies: "@swc/helpers" "^0.5.3" clsx "^2.0.0" swr "^2.2.4" -react@^18: +react@*, "react@^16 || ^17 || ^18", "react@^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.5.1 || ^17.0.0 || ^18.0.0", "react@^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react@^16.8.0 || ^17 || ^18 || ^19", "react@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react@^16.8.0 || ^17.0.1 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react@^16.8.3 || ^17 || ^18", "react@^16.x || ^17.x || ^18.x || ^19.0.0 || ^19.0.0-rc", "react@^17 || ^18 || ^19", react@^18, react@^18.0.0, react@^18.2.0, react@^18.3.1, "react@>= 16.8.0 || 17.x.x || ^18.0.0-0", "react@>= 18.0.0", react@>=16, react@>=16.0.0, react@>=16.13.1, react@>=16.8.0, "react@>=16.x <=18.x", react@>=18: version "18.3.1" - resolved "https://registry.yarnpkg.com/react/-/react-18.3.1.tgz#49ab892009c53933625bd16b2533fc754cab2891" + resolved "https://registry.npmjs.org/react/-/react-18.3.1.tgz" integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== dependencies: loose-envify "^1.1.0" read-cache@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" + resolved "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz" integrity sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA== dependencies: pify "^2.3.0" readable-stream@^3.4.0: version "3.6.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== dependencies: inherits "^2.0.3" @@ -7465,31 +7185,42 @@ readable-stream@^3.4.0: readdirp@^4.0.1: version "4.0.2" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.0.2.tgz#388fccb8b75665da3abffe2d8f8ed59fe74c230a" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz" integrity sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA== readdirp@~3.6.0: version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== dependencies: picomatch "^2.2.1" reading-time@^1.3.0: version "1.5.0" - resolved "https://registry.yarnpkg.com/reading-time/-/reading-time-1.5.0.tgz#d2a7f1b6057cb2e169beaf87113cc3411b5bc5bb" + resolved "https://registry.npmjs.org/reading-time/-/reading-time-1.5.0.tgz" integrity sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg== +recast@^0.23.5: + version "0.23.11" + resolved "https://registry.npmjs.org/recast/-/recast-0.23.11.tgz" + integrity sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA== + dependencies: + ast-types "^0.16.1" + esprima "~4.0.0" + source-map "~0.6.1" + tiny-invariant "^1.3.3" + tslib "^2.0.1" + rechoir@^0.8.0: version "0.8.0" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.8.0.tgz#49f866e0d32146142da3ad8f0eff352b3215ff22" + resolved "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz" integrity sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ== dependencies: resolve "^1.20.0" redent@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" + resolved "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz" integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== dependencies: indent-string "^4.0.0" @@ -7497,7 +7228,7 @@ redent@^3.0.0: reflect.getprototypeof@^1.0.6, reflect.getprototypeof@^1.0.9: version "1.0.9" - resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.9.tgz#c905f3386008de95a62315f3ea8630404be19e2f" + resolved "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.9.tgz" integrity sha512-r0Ay04Snci87djAsI4U+WNRcSw5S4pOH7qFjd/veA5gC7TbqESR3tcj28ia95L/fYUDw11JKP7uqUKUAfVvV5Q== dependencies: call-bind "^1.0.8" @@ -7511,12 +7242,12 @@ reflect.getprototypeof@^1.0.6, reflect.getprototypeof@^1.0.9: regenerator-runtime@^0.14.0: version "0.14.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz" integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== regexp.prototype.flags@^1.5.3: version "1.5.3" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz#b3ae40b1d2499b8350ab2c3fe6ef3845d3a96f42" + resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz" integrity sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ== dependencies: call-bind "^1.0.7" @@ -7526,7 +7257,7 @@ regexp.prototype.flags@^1.5.3: rehype-external-links@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/rehype-external-links/-/rehype-external-links-3.0.0.tgz#2b28b5cda1932f83f045b6f80a3e1b15f168c6f6" + resolved "https://registry.npmjs.org/rehype-external-links/-/rehype-external-links-3.0.0.tgz" integrity sha512-yp+e5N9V3C6bwBeAC4n796kc86M4gJCdlVhiMTxIrJG5UHDMh+PJANf9heqORJbt1nrCbDwIlAZKjANIaVBbvw== dependencies: "@types/hast" "^3.0.0" @@ -7538,7 +7269,7 @@ rehype-external-links@^3.0.0: rehype-format@^5.0.0: version "5.0.1" - resolved "https://registry.yarnpkg.com/rehype-format/-/rehype-format-5.0.1.tgz#e255e59bed0c062156aaf51c16fad5a521a1f5c8" + resolved "https://registry.npmjs.org/rehype-format/-/rehype-format-5.0.1.tgz" integrity sha512-zvmVru9uB0josBVpr946OR8ui7nJEdzZobwLOOqHb/OOD88W0Vk2SqLwoVOj0fM6IPCCO6TaV9CvQvJMWwukFQ== dependencies: "@types/hast" "^3.0.0" @@ -7546,7 +7277,7 @@ rehype-format@^5.0.0: rehype-highlight@^7.0.0: version "7.0.1" - resolved "https://registry.yarnpkg.com/rehype-highlight/-/rehype-highlight-7.0.1.tgz#38b25d6dacb8719867c97765cef4763224d7f3ce" + resolved "https://registry.npmjs.org/rehype-highlight/-/rehype-highlight-7.0.1.tgz" integrity sha512-dB/vVGFsbm7xPglqnYbg0ABg6rAuIWKycTvuXaOO27SgLoOFNoTlniTBtAxp3n5ZyMioW1a3KwiNqgjkb6Skjg== dependencies: "@types/hast" "^3.0.0" @@ -7557,7 +7288,7 @@ rehype-highlight@^7.0.0: rehype-katex@^7.0.0: version "7.0.1" - resolved "https://registry.yarnpkg.com/rehype-katex/-/rehype-katex-7.0.1.tgz#832e6d7af2744a228981d1b0fe89483a9e7c93a1" + resolved "https://registry.npmjs.org/rehype-katex/-/rehype-katex-7.0.1.tgz" integrity sha512-OiM2wrZ/wuhKkigASodFoo8wimG3H12LWQaH8qSPVJn9apWKFSH3YOCtbKpBorTVw/eI7cuT21XBbvwEswbIOA== dependencies: "@types/hast" "^3.0.0" @@ -7570,7 +7301,7 @@ rehype-katex@^7.0.0: rehype-pretty-code@0.9.11: version "0.9.11" - resolved "https://registry.yarnpkg.com/rehype-pretty-code/-/rehype-pretty-code-0.9.11.tgz#742017cbcfd5bd85466dfedd65b33a954aff7f2a" + resolved "https://registry.npmjs.org/rehype-pretty-code/-/rehype-pretty-code-0.9.11.tgz" integrity sha512-Eq90eCYXQJISktfRZ8PPtwc5SUyH6fJcxS8XOMnHPUQZBtC6RYo67gGlley9X2nR8vlniPj0/7oCDEYHKQa/oA== dependencies: "@types/hast" "^2.0.0" @@ -7579,7 +7310,7 @@ rehype-pretty-code@0.9.11: rehype-raw@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/rehype-raw/-/rehype-raw-7.0.0.tgz#59d7348fd5dbef3807bbaa1d443efd2dd85ecee4" + resolved "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz" integrity sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww== dependencies: "@types/hast" "^3.0.0" @@ -7588,7 +7319,7 @@ rehype-raw@^7.0.0: rehype-sanitize@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/rehype-sanitize/-/rehype-sanitize-6.0.0.tgz#16e95f4a67a69cbf0f79e113c8e0df48203db73c" + resolved "https://registry.npmjs.org/rehype-sanitize/-/rehype-sanitize-6.0.0.tgz" integrity sha512-CsnhKNsyI8Tub6L4sm5ZFsme4puGfc6pYylvXo1AeqaGbjOYyzNv3qZPwvs0oMJ39eryyeOdmxwUIo94IpEhqg== dependencies: "@types/hast" "^3.0.0" @@ -7596,7 +7327,7 @@ rehype-sanitize@^6.0.0: rehype-stringify@^10.0.0: version "10.0.1" - resolved "https://registry.yarnpkg.com/rehype-stringify/-/rehype-stringify-10.0.1.tgz#2ec1ebc56c6aba07905d3b4470bdf0f684f30b75" + resolved "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-10.0.1.tgz" integrity sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA== dependencies: "@types/hast" "^3.0.0" @@ -7605,7 +7336,7 @@ rehype-stringify@^10.0.0: remark-gfm@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/remark-gfm/-/remark-gfm-3.0.1.tgz#0b180f095e3036545e9dddac0e8df3fa5cfee54f" + resolved "https://registry.npmjs.org/remark-gfm/-/remark-gfm-3.0.1.tgz" integrity sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig== dependencies: "@types/mdast" "^3.0.0" @@ -7615,7 +7346,7 @@ remark-gfm@^3.0.1: remark-gfm@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/remark-gfm/-/remark-gfm-4.0.0.tgz#aea777f0744701aa288b67d28c43565c7e8c35de" + resolved "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.0.tgz" integrity sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA== dependencies: "@types/mdast" "^4.0.0" @@ -7627,7 +7358,7 @@ remark-gfm@^4.0.0: remark-math@^5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/remark-math/-/remark-math-5.1.1.tgz#459e798d978d4ca032e745af0bac81ddcdf94964" + resolved "https://registry.npmjs.org/remark-math/-/remark-math-5.1.1.tgz" integrity sha512-cE5T2R/xLVtfFI4cCePtiRn+e6jKMtFDR3P8V3qpv8wpKjwvHoBA4eJzvX+nVrnlNy0911bdGmuspCSwetfYHw== dependencies: "@types/mdast" "^3.0.0" @@ -7637,7 +7368,7 @@ remark-math@^5.1.1: remark-mdx@^2.0.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/remark-mdx/-/remark-mdx-2.3.0.tgz#efe678025a8c2726681bde8bf111af4a93943db4" + resolved "https://registry.npmjs.org/remark-mdx/-/remark-mdx-2.3.0.tgz" integrity sha512-g53hMkpM0I98MU266IzDFMrTD980gNF3BJnkyFcmN+dD873mQeD5rdMO3Y2X+x8umQfbSE0PcoEDl7ledSA+2g== dependencies: mdast-util-mdx "^2.0.0" @@ -7645,7 +7376,7 @@ remark-mdx@^2.0.0: remark-parse@^10.0.0: version "10.0.2" - resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-10.0.2.tgz#ca241fde8751c2158933f031a4e3efbaeb8bc262" + resolved "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.2.tgz" integrity sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw== dependencies: "@types/mdast" "^3.0.0" @@ -7654,7 +7385,7 @@ remark-parse@^10.0.0: remark-parse@^11.0.0: version "11.0.0" - resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-11.0.0.tgz#aa60743fcb37ebf6b069204eb4da304e40db45a1" + resolved "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz" integrity sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA== dependencies: "@types/mdast" "^4.0.0" @@ -7664,7 +7395,7 @@ remark-parse@^11.0.0: remark-reading-time@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/remark-reading-time/-/remark-reading-time-2.0.1.tgz#fe8bb8e420db7678dc749385167adb4fc99318f7" + resolved "https://registry.npmjs.org/remark-reading-time/-/remark-reading-time-2.0.1.tgz" integrity sha512-fy4BKy9SRhtYbEHvp6AItbRTnrhiDGbqLQTSYVbQPGuRCncU1ubSsh9p/W5QZSxtYcUXv8KGL0xBgPLyNJA1xw== dependencies: estree-util-is-identifier-name "^2.0.0" @@ -7674,7 +7405,7 @@ remark-reading-time@^2.0.1: remark-rehype@^10.0.0: version "10.1.0" - resolved "https://registry.yarnpkg.com/remark-rehype/-/remark-rehype-10.1.0.tgz#32dc99d2034c27ecaf2e0150d22a6dcccd9a6279" + resolved "https://registry.npmjs.org/remark-rehype/-/remark-rehype-10.1.0.tgz" integrity sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw== dependencies: "@types/hast" "^2.0.0" @@ -7684,7 +7415,7 @@ remark-rehype@^10.0.0: remark-rehype@^11.0.0, remark-rehype@^11.1.0: version "11.1.1" - resolved "https://registry.yarnpkg.com/remark-rehype/-/remark-rehype-11.1.1.tgz#f864dd2947889a11997c0a2667cd6b38f685bca7" + resolved "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.1.tgz" integrity sha512-g/osARvjkBXb6Wo0XvAeXQohVta8i84ACbenPpoSsxTOQH/Ae0/RGP4WZgnMH5pMLpsj4FG7OHmcIcXxpza8eQ== dependencies: "@types/hast" "^3.0.0" @@ -7695,7 +7426,7 @@ remark-rehype@^11.0.0, remark-rehype@^11.1.0: remark-stringify@^11.0.0: version "11.0.0" - resolved "https://registry.yarnpkg.com/remark-stringify/-/remark-stringify-11.0.0.tgz#4c5b01dd711c269df1aaae11743eb7e2e7636fd3" + resolved "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz" integrity sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw== dependencies: "@types/mdast" "^4.0.0" @@ -7704,17 +7435,17 @@ remark-stringify@^11.0.0: remove-accents@0.5.0: version "0.5.0" - resolved "https://registry.yarnpkg.com/remove-accents/-/remove-accents-0.5.0.tgz#77991f37ba212afba162e375b627631315bed687" + resolved "https://registry.npmjs.org/remove-accents/-/remove-accents-0.5.0.tgz" integrity sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A== require-from-string@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== resolve-dir@^1.0.0, resolve-dir@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" + resolved "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz" integrity sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg== dependencies: expand-tilde "^2.0.0" @@ -7722,17 +7453,17 @@ resolve-dir@^1.0.0, resolve-dir@^1.0.1: resolve-from@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== resolve-pkg-maps@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" + resolved "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz" integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== resolve@^1.1.7, resolve@^1.20.0, resolve@^1.22.4, resolve@^1.22.8: version "1.22.10" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.10.tgz#b663e83ffb09bbf2386944736baae803029b8b39" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz" integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w== dependencies: is-core-module "^2.16.0" @@ -7741,7 +7472,7 @@ resolve@^1.1.7, resolve@^1.20.0, resolve@^1.22.4, resolve@^1.22.8: resolve@^2.0.0-next.5: version "2.0.0-next.5" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.5.tgz#6b0ec3107e671e52b68cd068ef327173b90dc03c" + resolved "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz" integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA== dependencies: is-core-module "^2.13.0" @@ -7750,7 +7481,7 @@ resolve@^2.0.0-next.5: restore-cursor@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz" integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== dependencies: onetime "^5.1.0" @@ -7758,7 +7489,7 @@ restore-cursor@^3.1.0: restore-cursor@^5.0.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-5.1.0.tgz#0766d95699efacb14150993f55baf0953ea1ebe7" + resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz" integrity sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA== dependencies: onetime "^7.0.0" @@ -7766,24 +7497,24 @@ restore-cursor@^5.0.0: reusify@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== rimraf@^3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== dependencies: glob "^7.1.3" robust-predicates@^3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/robust-predicates/-/robust-predicates-3.0.2.tgz#d5b28528c4824d20fc48df1928d41d9efa1ad771" + resolved "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz" integrity sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg== rollup@^4.20.0: version "4.29.1" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.29.1.tgz#a9aaaece817e5f778489e5bf82e379cc8a5c05bc" + resolved "https://registry.npmjs.org/rollup/-/rollup-4.29.1.tgz" integrity sha512-RaJ45M/kmJUzSWDs1Nnd5DdV4eerC98idtUOVr6FfKcgxqvjwHmxc5upLF9qZU9EpsVzzhleFahrT3shLuJzIw== dependencies: "@types/estree" "1.0.6" @@ -7811,38 +7542,38 @@ rollup@^4.20.0: run-async@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-3.0.0.tgz#42a432f6d76c689522058984384df28be379daad" + resolved "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz" integrity sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q== run-parallel@^1.1.9: version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== dependencies: queue-microtask "^1.2.2" rw@1: version "1.3.3" - resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4" + resolved "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz" integrity sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ== rxjs@^7.2.0, rxjs@^7.8.1: version "7.8.1" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" + resolved "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz" integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== dependencies: tslib "^2.1.0" sade@^1.7.3: version "1.8.1" - resolved "https://registry.yarnpkg.com/sade/-/sade-1.8.1.tgz#0a78e81d658d394887be57d2a409bf703a3b2701" + resolved "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz" integrity sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A== dependencies: mri "^1.1.0" safe-array-concat@^1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.3.tgz#c9e54ec4f603b0bbb8e7e5007a5ee7aecd1538c3" + resolved "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz" integrity sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q== dependencies: call-bind "^1.0.8" @@ -7853,12 +7584,12 @@ safe-array-concat@^1.1.3: safe-buffer@~5.2.0: version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== safe-push-apply@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/safe-push-apply/-/safe-push-apply-1.0.0.tgz#01850e981c1602d398c85081f360e4e6d03d27f5" + resolved "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz" integrity sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA== dependencies: es-errors "^1.3.0" @@ -7866,7 +7597,7 @@ safe-push-apply@^1.0.0: safe-regex-test@^1.0.3, safe-regex-test@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.1.0.tgz#7f87dfb67a3150782eaaf18583ff5d1711ac10c1" + resolved "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz" integrity sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw== dependencies: call-bound "^1.0.2" @@ -7875,12 +7606,12 @@ safe-regex-test@^1.0.3, safe-regex-test@^1.1.0: "safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sass@^1.72.0: +sass@*, sass@^1.3.0, sass@^1.72.0: version "1.83.0" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.83.0.tgz#e36842c0b88a94ed336fd16249b878a0541d536f" + resolved "https://registry.npmjs.org/sass/-/sass-1.83.0.tgz" integrity sha512-qsSxlayzoOjdvXMVLkzF84DJFc2HZEL/rFyGIKbbilYtAvlCxyuzUeff9LawTn4btVnLKg75Z8MMr1lxU1lfGw== dependencies: chokidar "^4.0.0" @@ -7891,21 +7622,21 @@ sass@^1.72.0: scheduler@^0.23.2: version "0.23.2" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.2.tgz#414ba64a3b282892e944cf2108ecc078d115cdc3" + resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz" integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ== dependencies: loose-envify "^1.1.0" scroll-into-view-if-needed@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.1.0.tgz#fa9524518c799b45a2ef6bbffb92bcad0296d01f" + resolved "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.1.0.tgz" integrity sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ== dependencies: compute-scroll-into-view "^3.0.2" section-matter@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/section-matter/-/section-matter-1.0.0.tgz#e9041953506780ec01d59f292a19c7b850b84167" + resolved "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz" integrity sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA== dependencies: extend-shallow "^2.0.1" @@ -7913,17 +7644,17 @@ section-matter@^1.0.0: semver@^6.3.1: version "6.3.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.5.4, semver@^7.6.3: +semver@^7.5.4, semver@^7.6.2, semver@^7.6.3: version "7.6.3" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" + resolved "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz" integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== sentence-case@^3.0.4: version "3.0.4" - resolved "https://registry.yarnpkg.com/sentence-case/-/sentence-case-3.0.4.tgz#3645a7b8c117c787fde8702056225bb62a45131f" + resolved "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz" integrity sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg== dependencies: no-case "^3.0.4" @@ -7932,7 +7663,7 @@ sentence-case@^3.0.4: set-function-length@^1.2.2: version "1.2.2" - resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + resolved "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz" integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== dependencies: define-data-property "^1.1.4" @@ -7944,7 +7675,7 @@ set-function-length@^1.2.2: set-function-name@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" + resolved "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz" integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== dependencies: define-data-property "^1.1.4" @@ -7954,7 +7685,7 @@ set-function-name@^2.0.2: sharp@^0.33.3: version "0.33.5" - resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.33.5.tgz#13e0e4130cc309d6a9497596715240b2ec0c594e" + resolved "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz" integrity sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw== dependencies: color "^4.2.3" @@ -7983,31 +7714,31 @@ sharp@^0.33.3: shebang-command@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz" integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== dependencies: shebang-regex "^1.0.0" shebang-command@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== dependencies: shebang-regex "^3.0.0" shebang-regex@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz" integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== shebang-regex@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -shiki@^0.14.3: +shiki@*, shiki@^0.14.3: version "0.14.7" - resolved "https://registry.yarnpkg.com/shiki/-/shiki-0.14.7.tgz#c3c9e1853e9737845f1d2ef81b31bcfb07056d4e" + resolved "https://registry.npmjs.org/shiki/-/shiki-0.14.7.tgz" integrity sha512-dNPAPrxSc87ua2sKJ3H5dQ/6ZaY8RNnaAqK+t0eG7p0Soi2ydiqbGOTaZCqaYvA/uZYfS1LJnemt3Q+mSfcPCg== dependencies: ansi-sequence-parser "^1.1.0" @@ -8017,7 +7748,7 @@ shiki@^0.14.3: side-channel-list@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.0.tgz#10cb5984263115d3b7a0e336591e290a830af8ad" + 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" @@ -8025,7 +7756,7 @@ side-channel-list@^1.0.0: side-channel-map@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/side-channel-map/-/side-channel-map-1.0.1.tgz#d6bb6b37902c6fef5174e5f533fab4c732a26f42" + 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" @@ -8035,7 +7766,7 @@ side-channel-map@^1.0.1: side-channel-weakmap@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz#11dda19d5368e40ce9ec2bdc1fb0ecbc0790ecea" + 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" @@ -8046,7 +7777,7 @@ side-channel-weakmap@^1.0.2: side-channel@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.0.tgz#c3fcff9c4da932784873335ec9765fa94ff66bc9" + resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz" integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== dependencies: es-errors "^1.3.0" @@ -8057,34 +7788,39 @@ side-channel@^1.1.0: signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== -signal-exit@^4.0.1, signal-exit@^4.1.0: +signal-exit@^4.0.1: version "4.1.0" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + +signal-exit@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== simple-swizzle@^0.2.2: version "0.2.2" - resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + resolved "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz" integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== dependencies: is-arrayish "^0.3.1" slash@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== slash@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" + resolved "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz" integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== snake-case@^3.0.4: version "3.0.4" - resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-3.0.4.tgz#4f2bbd568e9935abdfd593f34c691dadb49c452c" + resolved "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz" integrity sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg== dependencies: dot-case "^3.0.4" @@ -8092,54 +7828,68 @@ snake-case@^3.0.4: sort-keys@^5.0.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-5.1.0.tgz#50a3f3d1ad3c5a76d043e0aeeba7299241e9aa5c" + resolved "https://registry.npmjs.org/sort-keys/-/sort-keys-5.1.0.tgz" integrity sha512-aSbHV0DaBcr7u0PVHXzM6NbZNAtrr9sF6+Qfs9UUVG7Ll3jQ6hHi8F/xqIIcn2rvIVbr0v/2zyjSdwSV47AgLQ== dependencies: is-plain-obj "^4.0.0" -"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2, source-map-js@^1.2.1: +source-map-js@^1.0.2, source-map-js@^1.2.0, source-map-js@^1.2.1, "source-map-js@>=0.6.2 <2.0.0": version "1.2.1" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" + resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz" integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== -source-map@^0.6.1: +source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== source-map@^0.7.0: version "0.7.4" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz" integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== space-separated-tokens@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz#1ecd9d2350a3844572c3f4a312bceb018348859f" + resolved "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz" integrity sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q== sprintf-js@~1.0.2: version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== stable-hash@^0.0.4: version "0.0.4" - resolved "https://registry.yarnpkg.com/stable-hash/-/stable-hash-0.0.4.tgz#55ae7dadc13e4b3faed13601587cec41859b42f7" + resolved "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.4.tgz" integrity sha512-LjdcbuBeLcdETCrPn9i8AYAZ1eCtu4ECAWtP7UleOiZ9LzVxRzzUZEoZ8zB24nhkQnDWyET0I+3sWokSDS3E7g== stdin-discarder@^0.2.2: version "0.2.2" - resolved "https://registry.yarnpkg.com/stdin-discarder/-/stdin-discarder-0.2.2.tgz#390037f44c4ae1a1ae535c5fe38dc3aba8d997be" + resolved "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz" integrity sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ== +"storybook@^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0", storybook@^8.4.7: + version "8.6.4" + resolved "https://registry.npmjs.org/storybook/-/storybook-8.6.4.tgz" + integrity sha512-XXh1Acvf1r3BQX0BDLQw6yhZ7yUGvYxIcKOBuMdetnX7iXtczipJTfw0uyFwk0ltkKEE9PpJvivYmARF3u64VQ== + dependencies: + "@storybook/core" "8.6.4" + streamsearch@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" + resolved "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz" integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + "string-width-cjs@npm:string-width@^4.2.0": version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: emoji-regex "^8.0.0" @@ -8148,7 +7898,7 @@ streamsearch@^1.1.0: string-width@^4.1.0, string-width@^4.2.3: version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: emoji-regex "^8.0.0" @@ -8157,7 +7907,7 @@ string-width@^4.1.0, string-width@^4.2.3: string-width@^5.0.1, string-width@^5.1.2: version "5.1.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + resolved "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz" integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== dependencies: eastasianwidth "^0.2.0" @@ -8166,7 +7916,7 @@ string-width@^5.0.1, string-width@^5.1.2: string-width@^7.2.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-7.2.0.tgz#b5bb8e2165ce275d4d43476dd2700ad9091db6dc" + resolved "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz" integrity sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ== dependencies: emoji-regex "^10.3.0" @@ -8175,7 +7925,7 @@ string-width@^7.2.0: string.prototype.includes@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz#eceef21283640761a81dbe16d6c7171a4edf7d92" + resolved "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz" integrity sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg== dependencies: call-bind "^1.0.7" @@ -8184,7 +7934,7 @@ string.prototype.includes@^2.0.1: string.prototype.matchall@^4.0.12: version "4.0.12" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz#6c88740e49ad4956b1332a911e949583a275d4c0" + resolved "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz" integrity sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA== dependencies: call-bind "^1.0.8" @@ -8203,7 +7953,7 @@ string.prototype.matchall@^4.0.12: string.prototype.repeat@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz#e90872ee0308b29435aa26275f6e1b762daee01a" + resolved "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz" integrity sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w== dependencies: define-properties "^1.1.3" @@ -8211,7 +7961,7 @@ string.prototype.repeat@^1.0.0: string.prototype.trim@^1.2.10: version "1.2.10" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz#40b2dd5ee94c959b4dcfb1d65ce72e90da480c81" + resolved "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz" integrity sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA== dependencies: call-bind "^1.0.8" @@ -8224,7 +7974,7 @@ string.prototype.trim@^1.2.10: string.prototype.trimend@^1.0.8, string.prototype.trimend@^1.0.9: version "1.0.9" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz#62e2731272cd285041b36596054e9f66569b6942" + resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz" integrity sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ== dependencies: call-bind "^1.0.8" @@ -8234,23 +7984,16 @@ string.prototype.trimend@^1.0.8, string.prototype.trimend@^1.0.9: string.prototype.trimstart@^1.0.8: version "1.0.8" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" + resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz" integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== dependencies: call-bind "^1.0.7" define-properties "^1.2.1" es-object-atoms "^1.0.0" -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - stringify-entities@^4.0.0: version "4.0.4" - resolved "https://registry.yarnpkg.com/stringify-entities/-/stringify-entities-4.0.4.tgz#b3b79ef5f277cc4ac73caeb0236c5ba939b3a4f3" + resolved "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz" integrity sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg== dependencies: character-entities-html4 "^2.0.0" @@ -8258,7 +8001,7 @@ stringify-entities@^4.0.0: stringify-object@3.3.0: version "3.3.0" - resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" + resolved "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz" integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== dependencies: get-own-enumerable-property-symbols "^3.0.0" @@ -8267,86 +8010,93 @@ stringify-object@3.3.0: "strip-ansi-cjs@npm:strip-ansi@^6.0.1": version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" -strip-ansi@^7.0.1, strip-ansi@^7.1.0: +strip-ansi@^7.0.1: version "7.1.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== + dependencies: + ansi-regex "^6.0.1" + +strip-ansi@^7.1.0: + version "7.1.0" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz" integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== dependencies: ansi-regex "^6.0.1" strip-bom-string@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-bom-string/-/strip-bom-string-1.0.0.tgz#e5211e9224369fbb81d633a2f00044dc8cedad92" + resolved "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz" integrity sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g== strip-bom@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== strip-eof@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + resolved "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz" integrity sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q== strip-indent@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" + resolved "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz" integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== dependencies: min-indent "^1.0.0" strip-json-comments@^3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== style-mod@^4.0.0, style-mod@^4.1.0: version "4.1.2" - resolved "https://registry.yarnpkg.com/style-mod/-/style-mod-4.1.2.tgz#ca238a1ad4786520f7515a8539d5a63691d7bf67" + resolved "https://registry.npmjs.org/style-mod/-/style-mod-4.1.2.tgz" integrity sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw== style-to-object@^0.4.1: version "0.4.4" - resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.4.4.tgz#266e3dfd56391a7eefb7770423612d043c3f33ec" + resolved "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.4.tgz" integrity sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg== dependencies: inline-style-parser "0.1.1" style-to-object@^1.0.0: version "1.0.8" - resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-1.0.8.tgz#67a29bca47eaa587db18118d68f9d95955e81292" + resolved "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.8.tgz" integrity sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g== dependencies: inline-style-parser "0.2.4" styled-jsx@5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.1.1.tgz#839a1c3aaacc4e735fed0781b8619ea5d0009d1f" + resolved "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz" integrity sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw== dependencies: client-only "0.0.1" stylis@^4.1.3: version "4.3.4" - resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.3.4.tgz#ca5c6c4a35c4784e4e93a2a24dc4e9fa075250a4" + resolved "https://registry.npmjs.org/stylis/-/stylis-4.3.4.tgz" integrity sha512-osIBl6BGUmSfDkyH2mB7EFvCJntXDrLhKjHTRj/rK6xLH0yuPrHULDRQzKokSOD4VoorhtKpfcfW1GAntu8now== sucrase@^3.35.0: version "3.35.0" - resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.35.0.tgz#57f17a3d7e19b36d8995f06679d121be914ae263" + resolved "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz" integrity sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA== dependencies: "@jridgewell/gen-mapping" "^0.3.2" @@ -8359,26 +8109,26 @@ sucrase@^3.35.0: supports-color@^4.0.0: version "4.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz" integrity sha512-ycQR/UbvI9xIlEdQT1TQqwoXtEldExbCEAJgRo5YXlmSKjv6ThHnP9/vwGa1gr19Gfw+LkFd7KqYMhzrRC5JYw== dependencies: has-flag "^2.0.0" supports-color@^7.1.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== swr@^2.2.4: version "2.3.0" - resolved "https://registry.yarnpkg.com/swr/-/swr-2.3.0.tgz#66fa45023efd4199f4e7ce608c255709a135943d" + resolved "https://registry.npmjs.org/swr/-/swr-2.3.0.tgz" integrity sha512-NyZ76wA4yElZWBHzSgEJc28a0u6QZvhb6w0azeL2k7+Q1gAzVK+IqQYXhVOC/mzi+HZIozrZvBVeSeOZNR2bqA== dependencies: dequal "^2.0.3" @@ -8386,12 +8136,12 @@ swr@^2.2.4: tailwind-merge@^2.2.2, tailwind-merge@^2.3.0: version "2.6.0" - resolved "https://registry.yarnpkg.com/tailwind-merge/-/tailwind-merge-2.6.0.tgz#ac5fb7e227910c038d458f396b7400d93a3142d5" + resolved "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.6.0.tgz" integrity sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA== tailwindcss@^3.3.0: version "3.4.17" - resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.4.17.tgz#ae8406c0f96696a631c790768ff319d46d5e5a63" + resolved "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz" integrity sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og== dependencies: "@alloc/quick-lru" "^5.2.0" @@ -8419,53 +8169,58 @@ tailwindcss@^3.3.0: tapable@^2.2.0: version "2.2.1" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== text-table@^0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== thenify-all@^1.0.0: version "1.6.0" - resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" + resolved "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz" integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== dependencies: thenify ">= 3.1.0 < 4" "thenify@>= 3.1.0 < 4": version "3.3.1" - resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" + resolved "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz" integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== dependencies: any-promise "^1.0.0" third-party-capital@1.0.20: version "1.0.20" - resolved "https://registry.yarnpkg.com/third-party-capital/-/third-party-capital-1.0.20.tgz#e218a929a35bf4d2245da9addb8ab978d2f41685" + resolved "https://registry.npmjs.org/third-party-capital/-/third-party-capital-1.0.20.tgz" integrity sha512-oB7yIimd8SuGptespDAZnNkzIz+NWaJCu2RMsbs4Wmp9zSDUM8Nhi3s2OOcqYuv3mN4hitXc8DVx+LyUmbUDiA== +tiny-invariant@^1.3.3: + version "1.3.3" + resolved "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz" + integrity sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg== + tinyrainbow@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/tinyrainbow/-/tinyrainbow-1.2.0.tgz#5c57d2fc0fb3d1afd78465c33ca885d04f02abb5" + resolved "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz" integrity sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ== tinyspy@^3.0.0: version "3.0.2" - resolved "https://registry.yarnpkg.com/tinyspy/-/tinyspy-3.0.2.tgz#86dd3cf3d737b15adcf17d7887c84a75201df20a" + resolved "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz" integrity sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q== title-case@^3.0.3: version "3.0.3" - resolved "https://registry.yarnpkg.com/title-case/-/title-case-3.0.3.tgz#bc689b46f02e411f1d1e1d081f7c3deca0489982" + resolved "https://registry.npmjs.org/title-case/-/title-case-3.0.3.tgz" integrity sha512-e1zGYRvbffpcHIrnuqT0Dh+gEJtDaxDSoG4JAIpq4oDFyooziLBIiYQv0GBT4FUAnUop5uZ1hiIAj7oAF6sOCA== dependencies: tslib "^2.0.3" title@^3.5.3: version "3.5.3" - resolved "https://registry.yarnpkg.com/title/-/title-3.5.3.tgz#b338d701a3d949db6b49b2c86f409f9c2f36cd91" + resolved "https://registry.npmjs.org/title/-/title-3.5.3.tgz" integrity sha512-20JyowYglSEeCvZv3EZ0nZ046vLarO37prvV0mbtQV7C8DJPGgN967r8SJkqd3XK3K3lD3/Iyfp3avjfil8Q2Q== dependencies: arg "1.0.0" @@ -8475,56 +8230,56 @@ title@^3.5.3: titleize@1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/titleize/-/titleize-1.0.0.tgz#7d350722061830ba6617631e0cfd3ea08398d95a" + resolved "https://registry.npmjs.org/titleize/-/titleize-1.0.0.tgz" integrity sha512-TARUb7z1pGvlLxgPk++7wJ6aycXF3GJ0sNSBTAsTuJrQG5QuZlkUQP+zl+nbjAh4gMX9yDw9ZYklMd7vAfJKEw== tmp@^0.0.33: version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + resolved "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz" integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== dependencies: os-tmpdir "~1.0.2" to-regex-range@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: is-number "^7.0.0" tr46@~0.0.3: version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== trim-lines@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/trim-lines/-/trim-lines-3.0.1.tgz#d802e332a07df861c48802c04321017b1bd87338" + resolved "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz" integrity sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg== trough@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/trough/-/trough-2.2.0.tgz#94a60bd6bd375c152c1df911a4b11d5b0256f50f" + resolved "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz" integrity sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw== ts-api-utils@^1.0.1: version "1.4.3" - resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.4.3.tgz#bfc2215fe6528fecab2b0fba570a2e8a4263b064" + resolved "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz" integrity sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw== ts-dedent@^2.2.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/ts-dedent/-/ts-dedent-2.2.0.tgz#39e4bd297cd036292ae2394eb3412be63f563bb5" + resolved "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz" integrity sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ== ts-interface-checker@^0.1.9: version "0.1.13" - resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" + resolved "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz" integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== tsconfig-paths@^3.15.0: version "3.15.0" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" + resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz" integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== dependencies: "@types/json5" "^0.0.29" @@ -8532,41 +8287,41 @@ tsconfig-paths@^3.15.0: minimist "^1.2.6" strip-bom "^3.0.0" -tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.4.0, tslib@^2.8.0: +tslib@^2.0.0, tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.4.0: version "2.8.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz" integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== dependencies: prelude-ls "^1.2.1" type-fest@^0.20.2: version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== type-fest@^0.21.3: version "0.21.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== type-fest@^1.0.2: version "1.4.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.4.0.tgz#e9fb813fe3bf1744ec359d55d1affefa76f14be1" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz" integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA== type-fest@^2.19.0: version "2.19.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz" integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== typed-array-buffer@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz#a72395450a4869ec033fd549371b47af3a2ee536" + resolved "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz" integrity sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw== dependencies: call-bound "^1.0.3" @@ -8575,7 +8330,7 @@ typed-array-buffer@^1.0.3: typed-array-byte-length@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz#8407a04f7d78684f3d252aa1a143d2b77b4160ce" + resolved "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz" integrity sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg== dependencies: call-bind "^1.0.8" @@ -8586,7 +8341,7 @@ typed-array-byte-length@^1.0.3: typed-array-byte-offset@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz#ae3698b8ec91a8ab945016108aef00d5bff12355" + resolved "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz" integrity sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ== dependencies: available-typed-arrays "^1.0.7" @@ -8599,7 +8354,7 @@ typed-array-byte-offset@^1.0.4: typed-array-length@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.7.tgz#ee4deff984b64be1e118b0de8c9c877d5ce73d3d" + resolved "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz" integrity sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg== dependencies: call-bind "^1.0.7" @@ -8609,19 +8364,19 @@ typed-array-length@^1.0.7: possible-typed-array-names "^1.0.0" reflect.getprototypeof "^1.0.6" -typescript@^5: +typescript@*, typescript@^5, "typescript@>= 4.5.5 < 6", typescript@>=3.3.1, typescript@>=4.2.0: version "5.7.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.7.2.tgz#3169cf8c4c8a828cde53ba9ecb3d2b1d5dd67be6" + resolved "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz" integrity sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg== uglify-js@^3.1.4: version "3.19.3" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.19.3.tgz#82315e9bbc6f2b25888858acd1fff8441035b77f" + resolved "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz" integrity sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ== unbox-primitive@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.1.0.tgz#8d9d2c9edeea8460c7f35033a88867944934d1e2" + resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz" integrity sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw== dependencies: call-bound "^1.0.3" @@ -8631,22 +8386,17 @@ unbox-primitive@^1.1.0: unc-path-regex@^0.1.2: version "0.1.2" - resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" + resolved "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz" integrity sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg== undici-types@~6.19.2: version "6.19.8" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" + resolved "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz" integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== -undici-types@~6.20.0: - version "6.20.0" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.20.0.tgz#8171bf22c1f588d1554d55bf204bc624af388433" - integrity sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg== - unhead@^1.8.3: version "1.11.14" - resolved "https://registry.yarnpkg.com/unhead/-/unhead-1.11.14.tgz#9be7c432a74fa299462d7e87b2a2c0b0e9c48e01" + resolved "https://registry.npmjs.org/unhead/-/unhead-1.11.14.tgz" integrity sha512-XmXW0aZyX9kGk9ejCKCSvv/J4T3Rt4hoAe2EofM+nhG+zwZ7AArUMK/0F/fj6FTkfgY0u0/JryE00qUDULgygA== dependencies: "@unhead/dom" "1.11.14" @@ -8656,7 +8406,7 @@ unhead@^1.8.3: unified@^10.0.0: version "10.1.2" - resolved "https://registry.yarnpkg.com/unified/-/unified-10.1.2.tgz#b1d64e55dafe1f0b98bb6c719881103ecf6c86df" + resolved "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz" integrity sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q== dependencies: "@types/unist" "^2.0.0" @@ -8669,7 +8419,7 @@ unified@^10.0.0: unified@^11.0.0, unified@^11.0.4: version "11.0.5" - resolved "https://registry.yarnpkg.com/unified/-/unified-11.0.5.tgz#f66677610a5c0a9ee90cab2b8d4d66037026d9e1" + resolved "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz" integrity sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA== dependencies: "@types/unist" "^3.0.0" @@ -8682,7 +8432,7 @@ unified@^11.0.0, unified@^11.0.4: unist-util-find-after@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/unist-util-find-after/-/unist-util-find-after-5.0.0.tgz#3fccc1b086b56f34c8b798e1ff90b5c54468e896" + resolved "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-5.0.0.tgz" integrity sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ== dependencies: "@types/unist" "^3.0.0" @@ -8690,47 +8440,47 @@ unist-util-find-after@^5.0.0: unist-util-generated@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/unist-util-generated/-/unist-util-generated-2.0.1.tgz#e37c50af35d3ed185ac6ceacb6ca0afb28a85cae" + resolved "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-2.0.1.tgz" integrity sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A== unist-util-is@^5.0.0: version "5.2.1" - resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-5.2.1.tgz#b74960e145c18dcb6226bc57933597f5486deae9" + resolved "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz" integrity sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw== dependencies: "@types/unist" "^2.0.0" unist-util-is@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-6.0.0.tgz#b775956486aff107a9ded971d996c173374be424" + resolved "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz" integrity sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw== dependencies: "@types/unist" "^3.0.0" unist-util-position-from-estree@^1.0.0, unist-util-position-from-estree@^1.1.0: version "1.1.2" - resolved "https://registry.yarnpkg.com/unist-util-position-from-estree/-/unist-util-position-from-estree-1.1.2.tgz#8ac2480027229de76512079e377afbcabcfcce22" + resolved "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-1.1.2.tgz" integrity sha512-poZa0eXpS+/XpoQwGwl79UUdea4ol2ZuCYguVaJS4qzIOMDzbqz8a3erUCOmubSZkaOuGamb3tX790iwOIROww== dependencies: "@types/unist" "^2.0.0" unist-util-position@^4.0.0: version "4.0.4" - resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-4.0.4.tgz#93f6d8c7d6b373d9b825844645877c127455f037" + resolved "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz" integrity sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg== dependencies: "@types/unist" "^2.0.0" unist-util-position@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-5.0.0.tgz#678f20ab5ca1207a97d7ea8a388373c9cf896be4" + resolved "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz" integrity sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA== dependencies: "@types/unist" "^3.0.0" unist-util-remove-position@^4.0.0: version "4.0.2" - resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-4.0.2.tgz#a89be6ea72e23b1a402350832b02a91f6a9afe51" + resolved "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-4.0.2.tgz" integrity sha512-TkBb0HABNmxzAcfLf4qsIbFbaPDvMO6wa3b3j4VcEzFVaw1LBKwnW4/sRJ/atSLSzoIg41JWEdnE7N6DIhGDGQ== dependencies: "@types/unist" "^2.0.0" @@ -8738,7 +8488,7 @@ unist-util-remove-position@^4.0.0: unist-util-remove-position@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz#fea68a25658409c9460408bc6b4991b965b52163" + resolved "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz" integrity sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q== dependencies: "@types/unist" "^3.0.0" @@ -8746,7 +8496,7 @@ unist-util-remove-position@^5.0.0: unist-util-remove@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/unist-util-remove/-/unist-util-remove-4.0.0.tgz#94b7d6bbd24e42d2f841e947ed087be5c82b222e" + resolved "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-4.0.0.tgz" integrity sha512-b4gokeGId57UVRX/eVKej5gXqGlc9+trkORhFJpu9raqZkZhU0zm8Doi05+HaiBsMEIJowL+2WtQ5ItjsngPXg== dependencies: "@types/unist" "^3.0.0" @@ -8755,29 +8505,37 @@ unist-util-remove@^4.0.0: unist-util-stringify-position@^3.0.0: version "3.0.3" - resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz#03ad3348210c2d930772d64b489580c13a7db39d" + resolved "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz" integrity sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg== dependencies: "@types/unist" "^2.0.0" unist-util-stringify-position@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz#449c6e21a880e0855bf5aabadeb3a740314abac2" + resolved "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz" integrity sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ== dependencies: "@types/unist" "^3.0.0" unist-util-visit-parents@^4.0.0: version "4.1.1" - resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-4.1.1.tgz#e83559a4ad7e6048a46b1bdb22614f2f3f4724f2" + resolved "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-4.1.1.tgz" integrity sha512-1xAFJXAKpnnJl8G7K5KgU7FY55y3GcLIXqkzUj5QF/QVP7biUm0K0O2oqVkYsdjzJKifYeWn9+o6piAK2hGSHw== dependencies: "@types/unist" "^2.0.0" unist-util-is "^5.0.0" -unist-util-visit-parents@^5.0.0, unist-util-visit-parents@^5.1.1: +unist-util-visit-parents@^5.0.0: version "5.1.3" - resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz#b4520811b0ca34285633785045df7a8d6776cfeb" + resolved "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz" + integrity sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^5.0.0" + +unist-util-visit-parents@^5.1.1: + version "5.1.3" + resolved "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz" integrity sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg== dependencies: "@types/unist" "^2.0.0" @@ -8785,7 +8543,7 @@ unist-util-visit-parents@^5.0.0, unist-util-visit-parents@^5.1.1: unist-util-visit-parents@^6.0.0: version "6.0.1" - resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz#4d5f85755c3b8f0dc69e21eca5d6d82d22162815" + resolved "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz" integrity sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw== dependencies: "@types/unist" "^3.0.0" @@ -8793,7 +8551,7 @@ unist-util-visit-parents@^6.0.0: unist-util-visit@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-3.1.0.tgz#9420d285e1aee938c7d9acbafc8e160186dbaf7b" + resolved "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-3.1.0.tgz" integrity sha512-Szoh+R/Ll68QWAyQyZZpQzZQm2UPbxibDvaY8Xc9SUtYgPsDzx5AWSk++UUt2hJuow8mvwR+rG+LQLw+KsuAKA== dependencies: "@types/unist" "^2.0.0" @@ -8802,7 +8560,7 @@ unist-util-visit@^3.1.0: unist-util-visit@^4.0.0: version "4.1.2" - resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-4.1.2.tgz#125a42d1eb876283715a3cb5cceaa531828c72e2" + resolved "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz" integrity sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg== dependencies: "@types/unist" "^2.0.0" @@ -8811,7 +8569,7 @@ unist-util-visit@^4.0.0: unist-util-visit@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-5.0.0.tgz#a7de1f31f72ffd3519ea71814cccf5fd6a9217d6" + resolved "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz" integrity sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg== dependencies: "@types/unist" "^3.0.0" @@ -8820,7 +8578,7 @@ unist-util-visit@^5.0.0: update-browserslist-db@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz#80846fba1d79e82547fb661f8d141e0945755fe5" + resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz" integrity sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A== dependencies: escalade "^3.2.0" @@ -8828,35 +8586,35 @@ update-browserslist-db@^1.1.1: upper-case-first@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/upper-case-first/-/upper-case-first-2.0.2.tgz#992c3273f882abd19d1e02894cc147117f844324" + resolved "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz" integrity sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg== dependencies: tslib "^2.0.3" upper-case@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-2.0.2.tgz#d89810823faab1df1549b7d97a76f8662bae6f7a" + resolved "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz" integrity sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg== dependencies: tslib "^2.0.3" uri-js@^4.2.2: version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== dependencies: punycode "^2.1.0" use-callback-ref@^1.3.3: version "1.3.3" - resolved "https://registry.yarnpkg.com/use-callback-ref/-/use-callback-ref-1.3.3.tgz#98d9fab067075841c5b2c6852090d5d0feabe2bf" + resolved "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz" integrity sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg== dependencies: tslib "^2.0.0" use-sidecar@^1.1.2: version "1.1.3" - resolved "https://registry.yarnpkg.com/use-sidecar/-/use-sidecar-1.1.3.tgz#10e7fd897d130b896e2c546c63a5e8233d00efdb" + resolved "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz" integrity sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ== dependencies: detect-node-es "^1.1.0" @@ -8864,29 +8622,40 @@ use-sidecar@^1.1.2: use-sync-external-store@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.4.0.tgz#adbc795d8eeb47029963016cefdf89dc799fcebc" + resolved "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.4.0.tgz" integrity sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw== util-deprecate@^1.0.1, util-deprecate@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== util@^0.10.3: version "0.10.4" - resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901" + resolved "https://registry.npmjs.org/util/-/util-0.10.4.tgz" integrity sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A== dependencies: inherits "2.0.3" +util@^0.12.5: + version "0.12.5" + resolved "https://registry.npmjs.org/util/-/util-0.12.5.tgz" + integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA== + dependencies: + inherits "^2.0.3" + is-arguments "^1.0.4" + is-generator-function "^1.0.7" + is-typed-array "^1.1.3" + which-typed-array "^1.1.2" + uuid@^9.0.0: version "9.0.1" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" + resolved "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz" integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== uvu@^0.5.0: version "0.5.6" - resolved "https://registry.yarnpkg.com/uvu/-/uvu-0.5.6.tgz#2754ca20bcb0bb59b64e9985e84d2e81058502df" + resolved "https://registry.npmjs.org/uvu/-/uvu-0.5.6.tgz" integrity sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA== dependencies: dequal "^2.0.0" @@ -8896,12 +8665,12 @@ uvu@^0.5.0: v8flags@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-4.0.1.tgz#98fe6c4308317c5f394d85a435eb192490f7e132" + resolved "https://registry.npmjs.org/v8flags/-/v8flags-4.0.1.tgz" integrity sha512-fcRLaS4H/hrZk9hYwbdRM35D0U8IYMfEClhXxCivOojl+yTRAZH3Zy2sSy6qVCiGbV9YAtPssP6jaChqC9vPCg== vfile-location@^5.0.0: version "5.0.3" - resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-5.0.3.tgz#cb9eacd20f2b6426d19451e0eafa3d0a846225c3" + resolved "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz" integrity sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg== dependencies: "@types/unist" "^3.0.0" @@ -8909,7 +8678,7 @@ vfile-location@^5.0.0: vfile-matter@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/vfile-matter/-/vfile-matter-3.0.1.tgz#85e26088e43aa85c04d42ffa3693635fa2bc5624" + resolved "https://registry.npmjs.org/vfile-matter/-/vfile-matter-3.0.1.tgz" integrity sha512-CAAIDwnh6ZdtrqAuxdElUqQRQDQgbbIrYtDYI8gCjXS1qQ+1XdLoK8FIZWxJwn0/I+BkSSZpar3SOgjemQz4fg== dependencies: "@types/js-yaml" "^4.0.0" @@ -8918,7 +8687,7 @@ vfile-matter@^3.0.1: vfile-message@^3.0.0: version "3.1.4" - resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-3.1.4.tgz#15a50816ae7d7c2d1fa87090a7f9f96612b59dea" + resolved "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz" integrity sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw== dependencies: "@types/unist" "^2.0.0" @@ -8926,15 +8695,25 @@ vfile-message@^3.0.0: vfile-message@^4.0.0: version "4.0.2" - resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-4.0.2.tgz#c883c9f677c72c166362fd635f21fc165a7d1181" + resolved "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz" integrity sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw== dependencies: "@types/unist" "^3.0.0" unist-util-stringify-position "^4.0.0" -vfile@^5.0.0, vfile@^5.3.0: +vfile@^5.0.0: version "5.3.7" - resolved "https://registry.yarnpkg.com/vfile/-/vfile-5.3.7.tgz#de0677e6683e3380fafc46544cfe603118826ab7" + resolved "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz" + integrity sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g== + dependencies: + "@types/unist" "^2.0.0" + is-buffer "^2.0.0" + unist-util-stringify-position "^3.0.0" + vfile-message "^3.0.0" + +vfile@^5.3.0: + version "5.3.7" + resolved "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz" integrity sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g== dependencies: "@types/unist" "^2.0.0" @@ -8944,7 +8723,7 @@ vfile@^5.0.0, vfile@^5.3.0: vfile@^6.0.0: version "6.0.3" - resolved "https://registry.yarnpkg.com/vfile/-/vfile-6.0.3.tgz#3652ab1c496531852bf55a6bac57af981ebc38ab" + resolved "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz" integrity sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q== dependencies: "@types/unist" "^3.0.0" @@ -8952,7 +8731,7 @@ vfile@^6.0.0: vite@^5.1.6: version "5.4.11" - resolved "https://registry.yarnpkg.com/vite/-/vite-5.4.11.tgz#3b415cd4aed781a356c1de5a9ebafb837715f6e5" + resolved "https://registry.npmjs.org/vite/-/vite-5.4.11.tgz" integrity sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q== dependencies: esbuild "^0.21.3" @@ -8963,54 +8742,75 @@ vite@^5.1.6: vscode-oniguruma@^1.7.0: version "1.7.0" - resolved "https://registry.yarnpkg.com/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz#439bfad8fe71abd7798338d1cd3dc53a8beea94b" + resolved "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz" integrity sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA== vscode-textmate@^8.0.0: version "8.0.0" - resolved "https://registry.yarnpkg.com/vscode-textmate/-/vscode-textmate-8.0.0.tgz#2c7a3b1163ef0441097e0b5d6389cd5504b59e5d" + resolved "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz" integrity sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg== vue-demi@>=0.13.0, vue-demi@>=0.14.8: version "0.14.10" - resolved "https://registry.yarnpkg.com/vue-demi/-/vue-demi-0.14.10.tgz#afc78de3d6f9e11bf78c55e8510ee12814522f04" + resolved "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz" integrity sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg== +vue-sonner@^1.0.3: + version "1.3.0" + resolved "https://registry.npmjs.org/vue-sonner/-/vue-sonner-1.3.0.tgz" + integrity sha512-jAodBy4Mri8rQjVZGQAPs4ZYymc1ywPiwfa81qU0fFl+Suk7U8NaOxIDdI1oBGLeQJqRZi/oxNIuhCLqsBmOwg== + +"vue@^2.7.0 || ^3.0.0", "vue@^3.0.0-0 || ^2.6.0", vue@^3.2.0, vue@^3.3.0, vue@3.5.13: + version "3.5.13" + resolved "https://registry.npmjs.org/vue/-/vue-3.5.13.tgz" + integrity sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ== + dependencies: + "@vue/compiler-dom" "3.5.13" + "@vue/compiler-sfc" "3.5.13" + "@vue/runtime-dom" "3.5.13" + "@vue/server-renderer" "3.5.13" + "@vue/shared" "3.5.13" + w3c-keyname@^2.2.4: version "2.2.8" - resolved "https://registry.yarnpkg.com/w3c-keyname/-/w3c-keyname-2.2.8.tgz#7b17c8c6883d4e8b86ac8aba79d39e880f8869c5" + resolved "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz" integrity sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ== wcwidth@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + resolved "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz" integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== dependencies: defaults "^1.0.3" web-namespaces@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-2.0.1.tgz#1010ff7c650eccb2592cebeeaf9a1b253fd40692" + resolved "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz" integrity sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ== web-streams-polyfill@4.0.0-beta.3: version "4.0.0-beta.3" - resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz#2898486b74f5156095e473efe989dcf185047a38" + resolved "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz" integrity sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug== +web-vitals@^4.2.0: + version "4.2.4" + resolved "https://registry.npmjs.org/web-vitals/-/web-vitals-4.2.4.tgz" + integrity sha512-r4DIlprAGwJ7YM11VZp4R884m0Vmgr6EAKe3P+kO0PPj3Unqyvv59rczf6UiGcb9Z8QxZVcqKNwv/g0WNdWwsw== + web-worker@^1.2.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/web-worker/-/web-worker-1.3.0.tgz#e5f2df5c7fe356755a5fb8f8410d4312627e6776" + resolved "https://registry.npmjs.org/web-worker/-/web-worker-1.3.0.tgz" integrity sha512-BSR9wyRsy/KOValMgd5kMyr3JzpdeoR9KVId8u5GVlTTAtNChlsE4yTxeY7zMdNSyOmoKBv8NH2qeRY9Tg+IaA== webidl-conversions@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== whatwg-url@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== dependencies: tr46 "~0.0.3" @@ -9018,7 +8818,7 @@ whatwg-url@^5.0.0: which-boxed-primitive@^1.1.0, which-boxed-primitive@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz#d76ec27df7fa165f18d5808374a5fe23c29b176e" + resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz" integrity sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA== dependencies: is-bigint "^1.1.0" @@ -9029,7 +8829,7 @@ which-boxed-primitive@^1.1.0, which-boxed-primitive@^1.1.1: which-builtin-type@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.2.1.tgz#89183da1b4907ab089a6b02029cc5d8d6574270e" + resolved "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz" integrity sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q== dependencies: call-bound "^1.0.2" @@ -9048,7 +8848,7 @@ which-builtin-type@^1.2.1: which-collection@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0" + resolved "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz" integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== dependencies: is-map "^2.0.3" @@ -9056,9 +8856,9 @@ which-collection@^1.0.2: is-weakmap "^2.0.2" is-weakset "^2.0.3" -which-typed-array@^1.1.16, which-typed-array@^1.1.18: +which-typed-array@^1.1.16, which-typed-array@^1.1.18, which-typed-array@^1.1.2: version "1.1.18" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.18.tgz#df2389ebf3fbb246a71390e90730a9edb6ce17ad" + resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.18.tgz" integrity sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA== dependencies: available-typed-arrays "^1.0.7" @@ -9070,31 +8870,31 @@ which-typed-array@^1.1.16, which-typed-array@^1.1.18: which@^1.2.14, which@^1.2.9: version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== dependencies: isexe "^2.0.0" which@^2.0.1: version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" word-wrap@^1.2.5: version "1.2.5" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz" integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== wordwrap@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + resolved "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz" integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== dependencies: ansi-styles "^4.0.0" @@ -9103,7 +8903,7 @@ wordwrap@^1.0.0: wrap-ansi@^6.2.0: version "6.2.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz" integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== dependencies: ansi-styles "^4.0.0" @@ -9112,7 +8912,7 @@ wrap-ansi@^6.2.0: wrap-ansi@^8.1.0: version "8.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz" integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== dependencies: ansi-styles "^6.1.0" @@ -9121,47 +8921,59 @@ wrap-ansi@^8.1.0: wrappy@1: version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== +ws@^8.2.3: + version "8.18.1" + resolved "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz" + integrity sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w== + y-codemirror.next@^0.3.2: version "0.3.5" - resolved "https://registry.yarnpkg.com/y-codemirror.next/-/y-codemirror.next-0.3.5.tgz#4bb5c94c09cab17b6fd300e5db1d29c65e51e345" + resolved "https://registry.npmjs.org/y-codemirror.next/-/y-codemirror.next-0.3.5.tgz" integrity sha512-VluNu3e5HfEXybnypnsGwKAj+fKLd4iAnR7JuX1Sfyydmn1jCBS5wwEL/uS04Ch2ib0DnMAOF6ZRR/8kK3wyGw== dependencies: lib0 "^0.2.42" yallist@^2.1.2: version "2.1.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + resolved "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz" integrity sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A== yaml@^2.3.4, yaml@^2.4.1: version "2.7.0" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.7.0.tgz#aef9bb617a64c937a9a748803786ad8d3ffe1e98" + resolved "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz" integrity sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA== +yjs@^13.5.6, yjs@^13.6.0: + version "13.6.24" + resolved "https://registry.npmjs.org/yjs/-/yjs-13.6.24.tgz" + integrity sha512-xn/pYLTZa3uD1uDG8lpxfLRo5SR/rp0frdASOl2a71aYNvUXdWcLtVL91s2y7j+Q8ppmjZ9H3jsGVgoFMbT2VA== + dependencies: + lib0 "^0.2.99" + yocto-queue@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== yoctocolors-cjs@^2.1.2: version "2.1.2" - resolved "https://registry.yarnpkg.com/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz#f4b905a840a37506813a7acaa28febe97767a242" + resolved "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz" integrity sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA== zhead@^2.2.4: version "2.2.4" - resolved "https://registry.yarnpkg.com/zhead/-/zhead-2.2.4.tgz#87cd1e2c3d2f465fa9f43b8db23f9716dfe6bed7" + resolved "https://registry.npmjs.org/zhead/-/zhead-2.2.4.tgz" integrity sha512-8F0OI5dpWIA5IGG5NHUg9staDwz/ZPxZtvGVf01j7vHqSyZ0raHY+78atOVxRqb73AotX22uV1pXt3gYSstGag== zod@^3.22.3: version "3.24.1" - resolved "https://registry.yarnpkg.com/zod/-/zod-3.24.1.tgz#27445c912738c8ad1e9de1bea0359fa44d9d35ee" + resolved "https://registry.npmjs.org/zod/-/zod-3.24.1.tgz" integrity sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A== zwitch@^2.0.0, zwitch@^2.0.4: version "2.0.4" - resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-2.0.4.tgz#c827d4b0acb76fc3e685a4c6ec2902d51070e9d7" + resolved "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz" integrity sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A== diff --git a/electron/.eslintrc.js b/electron/.eslintrc.js index 8b270b52e..20e79804f 100644 --- a/electron/.eslintrc.js +++ b/electron/.eslintrc.js @@ -35,5 +35,12 @@ module.exports = { { name: 'Link', linkAttribute: 'to' }, ], }, - ignorePatterns: ['build', 'renderer', 'node_modules', '@global', 'playwright-report'], + ignorePatterns: [ + 'build', + 'renderer', + 'node_modules', + '@global', + 'playwright-report', + 'test-data', + ], } diff --git a/electron/handlers/native.ts b/electron/handlers/native.ts index 81a2fc7f5..f8f70c302 100644 --- a/electron/handlers/native.ts +++ b/electron/handlers/native.ts @@ -1,4 +1,5 @@ import { app, ipcMain, dialog, shell, nativeTheme } from 'electron' +import { autoUpdater } from 'electron-updater' import { join } from 'path' import { windowManager } from '../managers/window' import { @@ -28,6 +29,10 @@ export function handleAppIPCs() { shell.openPath(getJanDataFolderPath()) }) + ipcMain.handle(NativeRoute.appUpdateDownload, async (_event) => { + autoUpdater.downloadUpdate() + }) + /** * Handles the "setNativeThemeLight" IPC message by setting the native theme source to "light". * This will change the appearance of the app to the light theme. @@ -312,4 +317,11 @@ export function handleAppIPCs() { const { stopServer } = require('@janhq/server') return stopServer() }) + + /** + * Handles the "appToken" IPC message to generate a random app ID. + */ + ipcMain.handle(NativeRoute.appToken, async (_event): Promise => { + return process.env.appToken ?? 'cortex.cpp' + }) } diff --git a/electron/handlers/update.ts b/electron/handlers/update.ts index 5e2200e51..5dcbda582 100644 --- a/electron/handlers/update.ts +++ b/electron/handlers/update.ts @@ -16,15 +16,13 @@ export function handleAppUpdates() { if (!app.isPackaged) { return } + /* New Update Available */ autoUpdater.on('update-available', async (_info: UpdateInfo) => { - const action = await dialog.showMessageBox({ - title: 'Update Available', - message: 'Would you like to download and install it now?', - buttons: ['Download', 'Later'], - }) - - if (action.response === 0) await autoUpdater.downloadUpdate() + windowManager.mainWindow?.webContents.send( + AppEvent.onAppUpdateAvailable, + {} + ) }) /* App Update Completion Message */ diff --git a/electron/icons/icon.ico b/electron/icons/icon.ico index 40c76171d..5d18719e8 100644 Binary files a/electron/icons/icon.ico and b/electron/icons/icon.ico differ diff --git a/electron/icons_dev/jan-beta-512x512.png b/electron/icons_dev/jan-beta-512x512.png new file mode 100644 index 000000000..4b715494d Binary files /dev/null and b/electron/icons_dev/jan-beta-512x512.png differ diff --git a/electron/icons_dev/jan-beta-tray.png b/electron/icons_dev/jan-beta-tray.png new file mode 100644 index 000000000..eaca9ad9a Binary files /dev/null and b/electron/icons_dev/jan-beta-tray.png differ diff --git a/electron/icons_dev/jan-beta-tray@2x.png b/electron/icons_dev/jan-beta-tray@2x.png new file mode 100644 index 000000000..deb83aace Binary files /dev/null and b/electron/icons_dev/jan-beta-tray@2x.png differ diff --git a/electron/icons_dev/jan-beta.ico b/electron/icons_dev/jan-beta.ico new file mode 100644 index 000000000..85cf0c1b4 Binary files /dev/null and b/electron/icons_dev/jan-beta.ico differ diff --git a/electron/icons_dev/jan-beta.png b/electron/icons_dev/jan-beta.png new file mode 100644 index 000000000..4b715494d Binary files /dev/null and b/electron/icons_dev/jan-beta.png differ diff --git a/electron/icons_dev/jan-nightly-512x512.png b/electron/icons_dev/jan-nightly-512x512.png new file mode 100644 index 000000000..23f532947 Binary files /dev/null and b/electron/icons_dev/jan-nightly-512x512.png differ diff --git a/electron/icons_dev/jan-nightly-tray.png b/electron/icons_dev/jan-nightly-tray.png new file mode 100644 index 000000000..bf164a0a6 Binary files /dev/null and b/electron/icons_dev/jan-nightly-tray.png differ diff --git a/electron/icons_dev/jan-nightly-tray@2x.png b/electron/icons_dev/jan-nightly-tray@2x.png new file mode 100644 index 000000000..3cab5709d Binary files /dev/null and b/electron/icons_dev/jan-nightly-tray@2x.png differ diff --git a/electron/icons_dev/jan-nightly.ico b/electron/icons_dev/jan-nightly.ico new file mode 100644 index 000000000..8e64ba8b1 Binary files /dev/null and b/electron/icons_dev/jan-nightly.ico differ diff --git a/electron/icons_dev/jan-nightly.png b/electron/icons_dev/jan-nightly.png new file mode 100644 index 000000000..23f532947 Binary files /dev/null and b/electron/icons_dev/jan-nightly.png differ diff --git a/electron/main.ts b/electron/main.ts index 42d16bb74..59e72ca24 100644 --- a/electron/main.ts +++ b/electron/main.ts @@ -29,8 +29,10 @@ import { trayManager } from './managers/tray' import { logSystemInfo } from './utils/system' import { registerGlobalShortcuts } from './utils/shortcut' import { registerLogger } from './utils/logger' +import { randomBytes } from 'crypto' const preloadPath = join(__dirname, 'preload.js') +const preloadQuickAskPath = join(__dirname, 'preload.quickask.js') const rendererPath = join(__dirname, '..', 'renderer') const quickAskPath = join(rendererPath, 'search.html') const mainPath = join(rendererPath, 'index.html') @@ -55,6 +57,10 @@ const createMainWindow = () => { windowManager.createMainWindow(preloadPath, startUrl) } +// Generate a random token for the app +// This token is used for authentication when making request to cortex.cpp server +process.env.appToken = randomBytes(16).toString('hex') + app .whenReady() .then(() => { @@ -85,9 +91,9 @@ app .then(setupExtensions) .then(setupMenu) .then(handleIPCs) - .then(handleAppUpdates) .then(() => process.env.CI !== 'e2e' && createQuickAskWindow()) .then(createMainWindow) + .then(handleAppUpdates) .then(registerGlobalShortcuts) .then(() => { if (!app.isPackaged) { @@ -133,7 +139,7 @@ function createQuickAskWindow() { // Feature Toggle for Quick Ask if (!getAppConfigurations().quick_ask) return const startUrl = app.isPackaged ? `file://${quickAskPath}` : quickAskUrl - windowManager.createQuickAskWindow(preloadPath, startUrl) + windowManager.createQuickAskWindow(preloadQuickAskPath, startUrl) } /** diff --git a/electron/managers/quickAskWindowConfig.ts b/electron/managers/quickAskWindowConfig.ts index eb30e8ebc..93180dd07 100644 --- a/electron/managers/quickAskWindowConfig.ts +++ b/electron/managers/quickAskWindowConfig.ts @@ -13,10 +13,10 @@ export const quickAskWindowConfig: Electron.BrowserWindowConstructorOptions = { fullscreenable: false, resizable: false, center: true, - movable: false, + movable: true, maximizable: false, focusable: true, - transparent: true, + transparent: false, frame: false, type: 'panel', } diff --git a/electron/managers/window.ts b/electron/managers/window.ts index 918036365..dbb3a5101 100644 --- a/electron/managers/window.ts +++ b/electron/managers/window.ts @@ -141,6 +141,9 @@ class WindowManager { return this._quickAskWindow?.isDestroyed() ?? true } + /** + * Expand the quick ask window + */ expandQuickAskWindow(heightOffset: number): void { const width = quickAskWindowConfig.width! const height = quickAskWindowConfig.height! + heightOffset @@ -148,6 +151,9 @@ class WindowManager { this._quickAskWindow?.setSize(width, height, true) } + /** + * Send the selected text to the quick ask window. + */ sendQuickAskSelectedText(selectedText: string): void { this._quickAskWindow?.webContents.send( AppEvent.onSelectedText, @@ -180,6 +186,9 @@ class WindowManager { } } + /** + * Clean up all windows. + */ cleanUp(): void { if (!this.mainWindow?.isDestroyed()) { this.mainWindow?.close() diff --git a/electron/package.json b/electron/package.json index 59761623c..660a5e264 100644 --- a/electron/package.json +++ b/electron/package.json @@ -1,6 +1,6 @@ { "name": "jan", - "version": "0.1.1737985524", + "version": "0.1.1740752217", "main": "./build/main.js", "author": "Jan ", "license": "MIT", @@ -113,7 +113,6 @@ "electron-store": "^8.1.0", "electron-updater": "^6.1.7", "fs-extra": "^11.2.0", - "node-fetch": "2", "pacote": "^21.0.0", "request": "^2.88.2", "request-progress": "^3.0.0", diff --git a/electron/preload.quickask.ts b/electron/preload.quickask.ts new file mode 100644 index 000000000..7c2cadeb6 --- /dev/null +++ b/electron/preload.quickask.ts @@ -0,0 +1,32 @@ +/** + * Exposes a set of APIs to the renderer process via the contextBridge object. + * @module preload + */ + +import { APIEvents, APIRoutes } from '@janhq/core/node' +import { contextBridge, ipcRenderer } from 'electron' + +const interfaces: { [key: string]: (...args: any[]) => any } = {} + +// Loop over each route in APIRoutes +APIRoutes.forEach((method) => { + // For each method, create a function on the interfaces object + // This function invokes the method on the ipcRenderer with any provided arguments + + interfaces[method] = (...args: any[]) => ipcRenderer.invoke(method, ...args) +}) + +// Loop over each method in APIEvents +APIEvents.forEach((method) => { + // For each method, create a function on the interfaces object + // This function sets up an event listener on the ipcRenderer for the method + // The handler for the event is provided as an argument to the function + interfaces[method] = (handler: any) => ipcRenderer.on(method, handler) +}) + +// Expose the 'interfaces' object in the main world under the name 'electronAPI' +// This allows the renderer process to access these methods directly +contextBridge.exposeInMainWorld('electronAPI', { + ...interfaces, + isQuickAsk: () => true, +}) diff --git a/electron/preload.ts b/electron/preload.ts index 05f48d37a..dbfcd1f1e 100644 --- a/electron/preload.ts +++ b/electron/preload.ts @@ -3,7 +3,7 @@ * @module preload */ -import { APIEvents, APIRoutes, AppConfiguration, getAppConfigurations, updateAppConfiguration } from '@janhq/core/node' +import { APIEvents, APIRoutes, AppConfiguration } from '@janhq/core/node' import { contextBridge, ipcRenderer } from 'electron' import { readdirSync } from 'fs' @@ -13,9 +13,8 @@ const interfaces: { [key: string]: (...args: any[]) => any } = {} APIRoutes.forEach((method) => { // For each method, create a function on the interfaces object // This function invokes the method on the ipcRenderer with any provided arguments - + interfaces[method] = (...args: any[]) => ipcRenderer.invoke(method, ...args) - }) // Loop over each method in APIEvents @@ -26,20 +25,21 @@ APIEvents.forEach((method) => { interfaces[method] = (handler: any) => ipcRenderer.on(method, handler) }) - -interfaces['changeDataFolder'] = async path => { - const appConfiguration: AppConfiguration = await ipcRenderer.invoke('getAppConfigurations') +interfaces['changeDataFolder'] = async (path) => { + const appConfiguration: AppConfiguration = await ipcRenderer.invoke( + 'getAppConfigurations' + ) const currentJanDataFolder = appConfiguration.data_folder appConfiguration.data_folder = path const reflect = require('@alumna/reflect') const { err } = await reflect({ - src: currentJanDataFolder, - dest: path, - recursive: true, - delete: false, - overwrite: true, - errorOnExist: false, - }) + src: currentJanDataFolder, + dest: path, + recursive: true, + delete: false, + overwrite: true, + errorOnExist: false, + }) if (err) { console.error(err) throw err @@ -47,7 +47,7 @@ interfaces['changeDataFolder'] = async path => { await ipcRenderer.invoke('updateAppConfiguration', appConfiguration) } -interfaces['isDirectoryEmpty'] = async path => { +interfaces['isDirectoryEmpty'] = async (path) => { const dirChildren = await readdirSync(path) return dirChildren.filter((x) => x !== '.DS_Store').length === 0 } @@ -56,4 +56,5 @@ interfaces['isDirectoryEmpty'] = async path => { // This allows the renderer process to access these methods directly contextBridge.exposeInMainWorld('electronAPI', { ...interfaces, + isQuickAsk: () => false, }) diff --git a/electron/tests/e2e/hub.e2e.spec.ts b/electron/tests/e2e/hub.e2e.spec.ts index ef305e9c3..58d6a0854 100644 --- a/electron/tests/e2e/hub.e2e.spec.ts +++ b/electron/tests/e2e/hub.e2e.spec.ts @@ -17,7 +17,7 @@ test('explores hub', async ({ hubPage }) => { await hubPage.navigateByMenu() await hubPage.verifyContainerVisible() await hubPage.scrollToBottom() - const useModelBtn = page.getByTestId(/^use-model-btn-.*/).first() + const useModelBtn = page.getByTestId(/^setup-btn/).first() await expect(useModelBtn).toBeVisible({ timeout: TIMEOUT, diff --git a/electron/tests/e2e/thread.e2e.spec.ts b/electron/tests/e2e/thread.e2e.spec.ts index 312cb1f46..41efc8437 100644 --- a/electron/tests/e2e/thread.e2e.spec.ts +++ b/electron/tests/e2e/thread.e2e.spec.ts @@ -1,33 +1,18 @@ import { expect } from '@playwright/test' import { page, test, TIMEOUT } from '../config/fixtures' -test('Select GPT model from Hub and Chat with Invalid API Key', async ({ - hubPage, -}) => { - await hubPage.navigateByMenu() - await hubPage.verifyContainerVisible() - - // Select the first GPT model - await page - .locator('[data-testid^="use-model-btn"][data-testid*="gpt"]') - .first() - .click() - - await page.getByTestId('txt-input-chat').fill('dummy value') - +test('show onboarding screen without any threads created or models downloaded', async () => { + await page.getByTestId('Thread').first().click({ + timeout: TIMEOUT, + }) const denyButton = page.locator('[data-testid="btn-deny-product-analytics"]') if ((await denyButton.count()) > 0) { await denyButton.click({ force: true }) - } else { - await page.getByTestId('btn-send-chat').click({ force: true }) } - await page.waitForFunction( - () => { - const loaders = document.querySelectorAll('[data-testid$="loader"]') - return !loaders.length - }, - { timeout: TIMEOUT } - ) + const onboardScreen = page.getByTestId('onboard-screen') + await expect(onboardScreen).toBeVisible({ + timeout: TIMEOUT, + }) }) diff --git a/electron/tsconfig.json b/electron/tsconfig.json index 11c9d8577..5116f0e88 100644 --- a/electron/tsconfig.json +++ b/electron/tsconfig.json @@ -19,5 +19,5 @@ "esm": true }, "include": ["./**/*.ts"], - "exclude": ["core", "build", "dist", "tests", "node_modules"] + "exclude": ["core", "build", "dist", "tests", "node_modules", "test-data"] } diff --git a/electron/utils/menu.ts b/electron/utils/menu.ts index 553412faf..bab70da79 100644 --- a/electron/utils/menu.ts +++ b/electron/utils/menu.ts @@ -28,9 +28,10 @@ const template: (Electron.MenuItemConstructorOptions | Electron.MenuItem)[] = [ !updateCheckResult?.updateInfo || updateCheckResult?.updateInfo.version === app.getVersion() ) { - dialog.showMessageBox({ - message: `No updates available.`, - }) + windowManager.mainWindow?.webContents.send( + AppEvent.onAppUpdateNotAvailable, + {} + ) return } }) diff --git a/extensions/assistant-extension/rolldown.config.mjs b/extensions/assistant-extension/rolldown.config.mjs index c8fdefd7d..e549ea7d9 100644 --- a/extensions/assistant-extension/rolldown.config.mjs +++ b/extensions/assistant-extension/rolldown.config.mjs @@ -26,6 +26,9 @@ export default defineConfig([ resolve: { extensions: ['.js', '.ts'], }, + define: { + CORTEX_API_URL: JSON.stringify(`http://127.0.0.1:${process.env.CORTEX_API_PORT ?? "39291"}`), + }, platform: 'node', }, ]) diff --git a/extensions/assistant-extension/src/@types/global.d.ts b/extensions/assistant-extension/src/@types/global.d.ts index 2ca4a4080..b724db8d0 100644 --- a/extensions/assistant-extension/src/@types/global.d.ts +++ b/extensions/assistant-extension/src/@types/global.d.ts @@ -1,2 +1,3 @@ declare const NODE: string declare const VERSION: string +declare const CORTEX_API_URL: string diff --git a/extensions/assistant-extension/src/node/retrieval.ts b/extensions/assistant-extension/src/node/retrieval.ts index 5804ff763..05fa67d54 100644 --- a/extensions/assistant-extension/src/node/retrieval.ts +++ b/extensions/assistant-extension/src/node/retrieval.ts @@ -23,12 +23,17 @@ export class Retrieval { constructor(chunkSize: number = 4000, chunkOverlap: number = 200) { this.updateTextSplitter(chunkSize, chunkOverlap) + this.initialize() + } + + private async initialize() { + const apiKey = await window.core?.api.appToken() ?? 'cortex.cpp' // declare time-weighted retriever and storage this.timeWeightedVectorStore = new MemoryVectorStore( new OpenAIEmbeddings( - { openAIApiKey: 'cortex-embedding' }, - { basePath: 'http://127.0.0.1:39291/v1' } + { openAIApiKey: apiKey }, + { basePath: `${CORTEX_API_URL}/v1` } ) ) this.timeWeightedretriever = new TimeWeightedVectorStoreRetriever({ @@ -47,11 +52,12 @@ export class Retrieval { }) } - public updateEmbeddingEngine(model: string, engine: string): void { + public async updateEmbeddingEngine(model: string, engine: string) { + const apiKey = await window.core?.api.appToken() ?? 'cortex.cpp' this.embeddingModel = new OpenAIEmbeddings( - { openAIApiKey: 'cortex-embedding', model }, + { openAIApiKey: apiKey, model }, // TODO: Raw settings - { basePath: 'http://127.0.0.1:39291/v1' } + { basePath: `${CORTEX_API_URL}/v1` } ) // update time-weighted embedding model diff --git a/extensions/conversational-extension/rolldown.config.mjs b/extensions/conversational-extension/rolldown.config.mjs index 4645021a8..6d396f611 100644 --- a/extensions/conversational-extension/rolldown.config.mjs +++ b/extensions/conversational-extension/rolldown.config.mjs @@ -8,7 +8,6 @@ export default defineConfig({ }, platform: 'browser', define: { - API_URL: JSON.stringify('http://127.0.0.1:39291'), - SOCKET_URL: JSON.stringify('ws://127.0.0.1:39291'), + API_URL: JSON.stringify(`http://127.0.0.1:${process.env.CORTEX_API_PORT ?? "39291"}`), }, }) diff --git a/extensions/conversational-extension/src/@types/global.d.ts b/extensions/conversational-extension/src/@types/global.d.ts index 813a893f4..abe60d318 100644 --- a/extensions/conversational-extension/src/@types/global.d.ts +++ b/extensions/conversational-extension/src/@types/global.d.ts @@ -1,5 +1,4 @@ declare const API_URL: string -declare const SOCKET_URL: string interface Core { api: APIFunctions diff --git a/extensions/conversational-extension/src/index.ts b/extensions/conversational-extension/src/index.ts index eeb4fcf38..791385fc9 100644 --- a/extensions/conversational-extension/src/index.ts +++ b/extensions/conversational-extension/src/index.ts @@ -4,7 +4,7 @@ import { ThreadAssistantInfo, ThreadMessage, } from '@janhq/core' -import ky from 'ky' +import ky, { KyInstance } from 'ky' import PQueue from 'p-queue' type ThreadList = { @@ -22,6 +22,22 @@ type MessageList = { export default class CortexConversationalExtension extends ConversationalExtension { queue = new PQueue({ concurrency: 1 }) + api?: KyInstance + /** + * Get the API instance + * @returns + */ + async apiInstance(): Promise { + if(this.api) return this.api + const apiKey = (await window.core?.api.appToken()) ?? 'cortex.cpp' + this.api = ky.extend({ + prefixUrl: API_URL, + headers: { + Authorization: `Bearer ${apiKey}`, + }, + }) + return this.api + } /** * Called when the extension is loaded. */ @@ -39,10 +55,12 @@ export default class CortexConversationalExtension extends ConversationalExtensi */ async listThreads(): Promise { return this.queue.add(() => - ky - .get(`${API_URL}/v1/threads?limit=-1`) - .json() - .then((e) => e.data) + this.apiInstance().then((api) => + api + .get('v1/threads?limit=-1') + .json() + .then((e) => e.data) + ) ) as Promise } @@ -52,7 +70,9 @@ export default class CortexConversationalExtension extends ConversationalExtensi */ async createThread(thread: Thread): Promise { return this.queue.add(() => - ky.post(`${API_URL}/v1/threads`, { json: thread }).json() + this.apiInstance().then((api) => + api.post('v1/threads', { json: thread }).json() + ) ) as Promise } @@ -63,7 +83,9 @@ export default class CortexConversationalExtension extends ConversationalExtensi async modifyThread(thread: Thread): Promise { return this.queue .add(() => - ky.patch(`${API_URL}/v1/threads/${thread.id}`, { json: thread }) + this.apiInstance().then((api) => + api.patch(`v1/threads/${thread.id}`, { json: thread }) + ) ) .then() } @@ -74,7 +96,9 @@ export default class CortexConversationalExtension extends ConversationalExtensi */ async deleteThread(threadId: string): Promise { return this.queue - .add(() => ky.delete(`${API_URL}/v1/threads/${threadId}`)) + .add(() => + this.apiInstance().then((api) => api.delete(`v1/threads/${threadId}`)) + ) .then() } @@ -85,11 +109,13 @@ export default class CortexConversationalExtension extends ConversationalExtensi */ async createMessage(message: ThreadMessage): Promise { return this.queue.add(() => - ky - .post(`${API_URL}/v1/threads/${message.thread_id}/messages`, { - json: message, - }) - .json() + this.apiInstance().then((api) => + api + .post(`v1/threads/${message.thread_id}/messages`, { + json: message, + }) + .json() + ) ) as Promise } @@ -100,14 +126,13 @@ export default class CortexConversationalExtension extends ConversationalExtensi */ async modifyMessage(message: ThreadMessage): Promise { return this.queue.add(() => - ky - .patch( - `${API_URL}/v1/threads/${message.thread_id}/messages/${message.id}`, - { + this.apiInstance().then((api) => + api + .patch(`v1/threads/${message.thread_id}/messages/${message.id}`, { json: message, - } - ) - .json() + }) + .json() + ) ) as Promise } @@ -120,7 +145,9 @@ export default class CortexConversationalExtension extends ConversationalExtensi async deleteMessage(threadId: string, messageId: string): Promise { return this.queue .add(() => - ky.delete(`${API_URL}/v1/threads/${threadId}/messages/${messageId}`) + this.apiInstance().then((api) => + api.delete(`v1/threads/${threadId}/messages/${messageId}`) + ) ) .then() } @@ -132,10 +159,12 @@ export default class CortexConversationalExtension extends ConversationalExtensi */ async listMessages(threadId: string): Promise { return this.queue.add(() => - ky - .get(`${API_URL}/v1/threads/${threadId}/messages?order=asc&limit=-1`) - .json() - .then((e) => e.data) + this.apiInstance().then((api) => + api + .get(`v1/threads/${threadId}/messages?order=asc&limit=-1`) + .json() + .then((e) => e.data) + ) ) as Promise } @@ -147,9 +176,11 @@ export default class CortexConversationalExtension extends ConversationalExtensi */ async getThreadAssistant(threadId: string): Promise { return this.queue.add(() => - ky - .get(`${API_URL}/v1/assistants/${threadId}?limit=-1`) - .json() + this.apiInstance().then((api) => + api + .get(`v1/assistants/${threadId}?limit=-1`) + .json() + ) ) as Promise } /** @@ -163,9 +194,11 @@ export default class CortexConversationalExtension extends ConversationalExtensi assistant: ThreadAssistantInfo ): Promise { return this.queue.add(() => - ky - .post(`${API_URL}/v1/assistants/${threadId}`, { json: assistant }) - .json() + this.apiInstance().then((api) => + api + .post(`v1/assistants/${threadId}`, { json: assistant }) + .json() + ) ) as Promise } @@ -180,9 +213,11 @@ export default class CortexConversationalExtension extends ConversationalExtensi assistant: ThreadAssistantInfo ): Promise { return this.queue.add(() => - ky - .patch(`${API_URL}/v1/assistants/${threadId}`, { json: assistant }) - .json() + this.apiInstance().then((api) => + api + .patch(`v1/assistants/${threadId}`, { json: assistant }) + .json() + ) ) as Promise } @@ -191,10 +226,12 @@ export default class CortexConversationalExtension extends ConversationalExtensi * @returns */ async healthz(): Promise { - return ky - .get(`${API_URL}/healthz`, { - retry: { limit: 20, delay: () => 500, methods: ['get'] }, - }) + return this.apiInstance() + .then((api) => + api.get('healthz', { + retry: { limit: 20, delay: () => 500, methods: ['get'] }, + }) + ) .then(() => {}) } } diff --git a/extensions/engine-management-extension/models/anthropic.json b/extensions/engine-management-extension/models/anthropic.json index 0212ce1da..2b3d7d683 100644 --- a/extensions/engine-management-extension/models/anthropic.json +++ b/extensions/engine-management-extension/models/anthropic.json @@ -40,5 +40,19 @@ "stream": true }, "engine": "anthropic" + }, + { + "model": "claude-3-7-sonnet-latest", + "object": "model", + "name": "Claude 3.7 Sonnet Latest", + "version": "1.0", + "description": "Claude 3.7 Sonnet is the first hybrid reasoning model on the market. It is the most intelligent model yet. It is faster, more cost effective, and more capable than any other model in its class.", + "inference_params": { + "max_tokens": 8192, + "temperature": 0.7, + "max_temperature": 1.0, + "stream": true + }, + "engine": "anthropic" } ] diff --git a/extensions/engine-management-extension/models/cohere.json b/extensions/engine-management-extension/models/cohere.json index 96a830637..f78498b93 100644 --- a/extensions/engine-management-extension/models/cohere.json +++ b/extensions/engine-management-extension/models/cohere.json @@ -9,7 +9,7 @@ "max_tokens": 4096, "temperature": 0.7, "max_temperature": 1.0, - "stream": false + "stream": true }, "engine": "cohere" }, @@ -23,7 +23,7 @@ "max_tokens": 4096, "temperature": 0.7, "max_temperature": 1.0, - "stream": false + "stream": true }, "engine": "cohere" } diff --git a/extensions/engine-management-extension/models/openai.json b/extensions/engine-management-extension/models/openai.json index 5c1e70b5a..b2314ec0b 100644 --- a/extensions/engine-management-extension/models/openai.json +++ b/extensions/engine-management-extension/models/openai.json @@ -1,4 +1,22 @@ [ + { + "model": "gpt-4.5-preview", + "object": "model", + "name": "OpenAI GPT 4.5 Preview", + "version": "1.2", + "description": "OpenAI GPT 4.5 Preview is a research preview of GPT-4.5, our largest and most capable GPT model yet", + "format": "api", + "inference_params": { + "max_tokens": 16384, + "temperature": 0.7, + "top_p": 0.95, + "stream": true, + "stop": [], + "frequency_penalty": 0, + "presence_penalty": 0 + }, + "engine": "openai" + }, { "model": "gpt-4-turbo", "object": "model", diff --git a/extensions/engine-management-extension/package.json b/extensions/engine-management-extension/package.json index 571a3852b..d08998ba8 100644 --- a/extensions/engine-management-extension/package.json +++ b/extensions/engine-management-extension/package.json @@ -1,14 +1,14 @@ { "name": "@janhq/engine-management-extension", "productName": "Engine Management", - "version": "1.0.0", + "version": "1.0.3", "description": "Manages AI engines and their configurations.", "main": "dist/index.js", "node": "dist/node/index.cjs.js", "author": "Jan ", "license": "MIT", "scripts": { - "test": "jest", + "test": "vitest run", "build": "rolldown -c rolldown.config.mjs", "codesign:darwin": "../../.github/scripts/auto-sign.sh", "codesign:win32:linux": "echo 'No codesigning required'", @@ -25,7 +25,8 @@ "rolldown": "^1.0.0-beta.1", "run-script-os": "^1.1.6", "ts-loader": "^9.5.0", - "typescript": "^5.3.3" + "typescript": "^5.3.3", + "vitest": "^3.0.6" }, "dependencies": { "@janhq/core": "../../core/package.tgz", diff --git a/extensions/engine-management-extension/resources/anthropic.json b/extensions/engine-management-extension/resources/anthropic.json index 4172bcd0b..f8ba74e2b 100644 --- a/extensions/engine-management-extension/resources/anthropic.json +++ b/extensions/engine-management-extension/resources/anthropic.json @@ -15,7 +15,7 @@ }, "transform_resp": { "chat_completions": { - "template": "{% if input_request.stream %} {\"object\": \"chat.completion.chunk\", \"model\": \"{{ input_request.model }}\", \"choices\": [{\"index\": 0, \"delta\": { {% if input_request.type == \"message_start\" %} \"role\": \"assistant\", \"content\": null {% else if input_request.type == \"ping\" %} \"role\": \"assistant\", \"content\": null {% else if input_request.type == \"content_block_delta\" %} \"role\": \"assistant\", \"content\": \"{{ input_request.delta.text }}\" {% else if input_request.type == \"content_block_stop\" %} \"role\": \"assistant\", \"content\": null {% else if input_request.type == \"content_block_stop\" %} \"role\": \"assistant\", \"content\": null {% endif %} }, {% if input_request.type == \"content_block_stop\" %} \"finish_reason\": \"stop\" {% else %} \"finish_reason\": null {% endif %} }]} {% else %} {{tojson(input_request)}} {% endif %}" + "template": "{% if input_request.stream %} {\"object\": \"chat.completion.chunk\", \"model\": \"{{ input_request.model }}\", \"choices\": [{\"index\": 0, \"delta\": { {% if input_request.type == \"message_start\" %} \"role\": \"assistant\", \"content\": null {% else if input_request.type == \"ping\" %} \"role\": \"assistant\", \"content\": null {% else if input_request.type == \"content_block_delta\" %} \"role\": \"assistant\", \"content\": {{ tojson(input_request.delta.text) }} {% else if input_request.type == \"content_block_stop\" %} \"role\": \"assistant\", \"content\": null {% else if input_request.type == \"content_block_stop\" %} \"role\": \"assistant\", \"content\": null {% endif %} }, {% if input_request.type == \"content_block_stop\" %} \"finish_reason\": \"stop\" {% else %} \"finish_reason\": null {% endif %} }]} {% else %} {{tojson(input_request)}} {% endif %}" } }, "explore_models_url": "https://docs.anthropic.com/en/docs/about-claude/models" diff --git a/extensions/engine-management-extension/resources/cohere.json b/extensions/engine-management-extension/resources/cohere.json index 43cd0da5b..02f1cc625 100644 --- a/extensions/engine-management-extension/resources/cohere.json +++ b/extensions/engine-management-extension/resources/cohere.json @@ -10,12 +10,12 @@ "transform_req": { "chat_completions": { "url": "https://api.cohere.ai/v1/chat", - "template": "{ {% for key, value in input_request %} {% if key == \"messages\" %} {% if input_request.messages.0.role == \"system\" %} \"preamble\": {{ tojson(input_request.messages.0.content) }}, {% if length(input_request.messages) > 2 %} \"chatHistory\": [{% for message in input_request.messages %} {% if not loop.is_first and not loop.is_last %} {\"role\": {% if message.role == \"user\" %} \"USER\" {% else %} \"CHATBOT\" {% endif %}, \"content\": \"{{ message.content }}\" } {% if loop.index < length(input_request.messages) - 2 %},{% endif %} {% endif %} {% endfor %}], {% endif %} \"message\": \"{{ last(input_request.messages).content }}\" {% else %} {% if length(input_request.messages) > 2 %} \"chatHistory\": [{% for message in input_request.messages %} {% if not loop.is_last %} { \"role\": {% if message.role == \"user\" %} \"USER\" {% else %} \"CHATBOT\" {% endif %}, \"content\": \"{{ message.content }}\" } {% if loop.index < length(input_request.messages) - 2 %},{% endif %} {% endif %} {% endfor %}],{% endif %}\"message\": \"{{ last(input_request.messages).content }}\" {% endif %}{% if not loop.is_last %},{% endif %} {% else if key == \"system\" or key == \"model\" or key == \"temperature\" or key == \"store\" or key == \"max_tokens\" or key == \"stream\" or key == \"presence_penalty\" or key == \"metadata\" or key == \"frequency_penalty\" or key == \"tools\" or key == \"tool_choice\" or key == \"logprobs\" or key == \"top_logprobs\" or key == \"logit_bias\" or key == \"n\" or key == \"modalities\" or key == \"prediction\" or key == \"response_format\" or key == \"service_tier\" or key == \"seed\" or key == \"stop\" or key == \"stream_options\" or key == \"top_p\" or key == \"parallel_tool_calls\" or key == \"user\" %} \"{{ key }}\": {{ tojson(value) }} {% if not loop.is_last %},{% endif %} {% endif %} {% endfor %} }" + "template": "{ {% for key, value in input_request %} {% if key == \"messages\" %} {% if input_request.messages.0.role == \"system\" %} \"preamble\": {{ tojson(input_request.messages.0.content) }}, {% if length(input_request.messages) > 2 %} \"chatHistory\": [{% for message in input_request.messages %} {% if not loop.is_first and not loop.is_last %} {\"role\": {% if message.role == \"user\" %} \"USER\" {% else %} \"CHATBOT\" {% endif %}, \"content\": {{ tojson(message.content) }} } {% if loop.index < length(input_request.messages) - 2 %},{% endif %} {% endif %} {% endfor %}], {% endif %} \"message\": {{ tojson(last(input_request.messages).content) }} {% else %} {% if length(input_request.messages) > 2 %} \"chatHistory\": [{% for message in input_request.messages %} {% if not loop.is_last %} { \"role\": {% if message.role == \"user\" %} \"USER\" {% else %} \"CHATBOT\" {% endif %}, \"content\": {{ tojson(message.content) }} } {% if loop.index < length(input_request.messages) - 2 %},{% endif %} {% endif %} {% endfor %}],{% endif %}\"message\": {{ tojson(last(input_request.messages).content) }} {% endif %}{% if not loop.is_last %},{% endif %} {% else if key == \"system\" or key == \"model\" or key == \"temperature\" or key == \"store\" or key == \"max_tokens\" or key == \"stream\" or key == \"presence_penalty\" or key == \"metadata\" or key == \"frequency_penalty\" or key == \"tools\" or key == \"tool_choice\" or key == \"logprobs\" or key == \"top_logprobs\" or key == \"logit_bias\" or key == \"n\" or key == \"modalities\" or key == \"prediction\" or key == \"response_format\" or key == \"service_tier\" or key == \"seed\" or key == \"stop\" or key == \"stream_options\" or key == \"top_p\" or key == \"parallel_tool_calls\" or key == \"user\" %} \"{{ key }}\": {{ tojson(value) }} {% if not loop.is_last %},{% endif %} {% endif %} {% endfor %} }" } }, "transform_resp": { "chat_completions": { - "template": "{% if input_request.stream %} {\"object\": \"chat.completion.chunk\", \"model\": \"{{ input_request.model }}\", \"choices\": [{\"index\": 0, \"delta\": { {% if input_request.event_type == \"text-generation\" %} \"role\": \"assistant\", \"content\": \"{{ input_request.text }}\" {% else %} \"role\": \"assistant\", \"content\": null {% endif %} }, {% if input_request.event_type == \"stream-end\" %} \"finish_reason\": \"{{ input_request.finish_reason }}\" {% else %} \"finish_reason\": null {% endif %} }]} {% else %} {\"id\": \"{{ input_request.generation_id }}\", \"created\": null, \"object\": \"chat.completion\", \"model\": {% if input_request.model %} \"{{ input_request.model }}\" {% else %} \"command-r-plus-08-2024\" {% endif %}, \"choices\": [{ \"index\": 0, \"message\": { \"role\": \"assistant\", \"content\": {% if not input_request.text %} null {% else %} \"{{ input_request.text }}\" {% endif %}, \"refusal\": null }, \"logprobs\": null, \"finish_reason\": \"{{ input_request.finish_reason }}\" } ], \"usage\": { \"prompt_tokens\": {{ input_request.meta.tokens.input_tokens }}, \"completion_tokens\": {{ input_request.meta.tokens.output_tokens }},\"total_tokens\": {{ input_request.meta.tokens.input_tokens + input_request.meta.tokens.output_tokens }}, \"prompt_tokens_details\": { \"cached_tokens\": 0 },\"completion_tokens_details\": { \"reasoning_tokens\": 0, \"accepted_prediction_tokens\": 0, \"rejected_prediction_tokens\": 0 } }, \"system_fingerprint\": \"fp_6b68a8204b\"} {% endif %}" + "template": "{% if input_request.stream %} {\"object\": \"chat.completion.chunk\", \"model\": \"{{ input_request.model }}\", \"choices\": [{\"index\": 0, \"delta\": { {% if input_request.event_type == \"text-generation\" %} \"role\": \"assistant\", \"content\": {{ tojson(input_request.text) }} {% else %} \"role\": \"assistant\", \"content\": null {% endif %} }, {% if input_request.event_type == \"stream-end\" %} \"finish_reason\": \"{{ input_request.finish_reason }}\" {% else %} \"finish_reason\": null {% endif %} }]} {% else %} {\"id\": \"{{ input_request.generation_id }}\", \"created\": null, \"object\": \"chat.completion\", \"model\": {% if input_request.model %} \"{{ input_request.model }}\" {% else %} \"command-r-plus-08-2024\" {% endif %}, \"choices\": [{ \"index\": 0, \"message\": { \"role\": \"assistant\", \"content\": {% if not input_request.text %} null {% else %} {{ tojson(input_request.text) }} {% endif %}, \"refusal\": null }, \"logprobs\": null, \"finish_reason\": \"{{ input_request.finish_reason }}\" } ], \"usage\": { \"prompt_tokens\": {{ input_request.meta.tokens.input_tokens }}, \"completion_tokens\": {{ input_request.meta.tokens.output_tokens }},\"total_tokens\": {{ input_request.meta.tokens.input_tokens + input_request.meta.tokens.output_tokens }}, \"prompt_tokens_details\": { \"cached_tokens\": 0 },\"completion_tokens_details\": { \"reasoning_tokens\": 0, \"accepted_prediction_tokens\": 0, \"rejected_prediction_tokens\": 0 } }, \"system_fingerprint\": \"fp_6b68a8204b\"} {% endif %}" } }, "explore_models_url": "https://docs.cohere.com/v2/docs/models" diff --git a/extensions/engine-management-extension/resources/openai.json b/extensions/engine-management-extension/resources/openai.json index 42f421072..f178a1a6f 100644 --- a/extensions/engine-management-extension/resources/openai.json +++ b/extensions/engine-management-extension/resources/openai.json @@ -10,7 +10,7 @@ "transform_req": { "chat_completions": { "url": "https://api.openai.com/v1/chat/completions", - "template": "{ {% set first = true %} {% for key, value in input_request %} {% if key == \"model\" or key == \"temperature\" or key == \"store\" or key == \"messages\" or key == \"stream\" or key == \"presence_penalty\" or key == \"metadata\" or key == \"frequency_penalty\" or key == \"tools\" or key == \"tool_choice\" or key == \"logprobs\" or key == \"top_logprobs\" or key == \"logit_bias\" or key == \"n\" or key == \"modalities\" or key == \"prediction\" or key == \"response_format\" or key == \"service_tier\" or key == \"seed\" or key == \"stream_options\" or key == \"top_p\" or key == \"parallel_tool_calls\" or key == \"user\" or key == \"max_tokens\" or ((input_request.model == \"o1\" or input_request.model == \"o1-preview\" or input_request.model == \"o1-mini\" or input_request.model == \"o3\" or input_request.model == \"o3-mini\") and (key == \"stop\")) %} {% if not first %} , {% endif %} {% if key == \"messages\" and (input_request.model == \"o1\" or input_request.model == \"o1-preview\" or input_request.model == \"o1-mini\") and input_request.messages.0.role == \"system\" %} \"messages\": [{% for message in input_request.messages %} {% if not loop.is_first %} { \"role\": \"{{ message.role }}\", \"content\": \"{{ message.content }}\" } {% if not loop.is_last %} , {% endif %} {% endif %} {% endfor %}] {% else if key == \"max_tokens\" and (input_request.model == \"o1\" or input_request.model == \"o1-preview\" or input_request.model == \"o1-mini\" or input_request.model == \"o3\" or input_request.model == \"o3-mini\") %} \"max_completion_tokens\": {{ tojson(value) }} {% set first = false %} {% else %} \"{{ key }}\": {{ tojson(value) }} {% set first = false %} {% endif %} {% endif %} {% endfor %} }" + "template": "{ {% set first = true %} {% for key, value in input_request %} {% if key == \"model\" or key == \"temperature\" or key == \"store\" or key == \"messages\" or key == \"stream\" or key == \"presence_penalty\" or key == \"metadata\" or key == \"frequency_penalty\" or key == \"tools\" or key == \"tool_choice\" or key == \"logprobs\" or key == \"top_logprobs\" or key == \"logit_bias\" or key == \"n\" or key == \"modalities\" or key == \"prediction\" or key == \"response_format\" or key == \"service_tier\" or key == \"seed\" or key == \"stream_options\" or key == \"top_p\" or key == \"parallel_tool_calls\" or key == \"user\" or key == \"max_tokens\" or key == \"stop\" %} {% if not first %}, {% endif %} {% if key == \"messages\" and (input_request.model == \"o1\" or input_request.model == \"o1-preview\" or input_request.model == \"o1-mini\") and input_request.messages.0.role == \"system\" %} \"messages\": [ {% for message in input_request.messages %} {% if not loop.is_first %} { \"role\": \"{{ message.role }}\", \"content\": \"{{ message.content }}\" } {% if not loop.is_last %}, {% endif %} {% endif %} {% endfor %} ] {% else if key == \"stop\" and (input_request.model == \"o1\" or input_request.model == \"o1-preview\" or input_request.model == \"o1-mini\" or input_request.model == \"o3\" or input_request.model == \"o3-mini\") %} {% set first = false %} {% else if key == \"max_tokens\" and (input_request.model == \"o1\" or input_request.model == \"o1-preview\" or input_request.model == \"o1-mini\" or input_request.model == \"o3\" or input_request.model == \"o3-mini\") %} \"max_completion_tokens\": {{ tojson(value) }} {% set first = false %} {% else %} \"{{ key }}\": {{ tojson(value) }} {% set first = false %} {% endif %} {% endif %} {% endfor %} }" } }, "transform_resp": { diff --git a/extensions/engine-management-extension/rolldown.config.mjs b/extensions/engine-management-extension/rolldown.config.mjs index d89fd9bfa..02b84b363 100644 --- a/extensions/engine-management-extension/rolldown.config.mjs +++ b/extensions/engine-management-extension/rolldown.config.mjs @@ -11,10 +11,11 @@ export default defineConfig([ }, define: { NODE: JSON.stringify(`${pkgJson.name}/${pkgJson.node}`), - API_URL: JSON.stringify('http://127.0.0.1:39291'), - SOCKET_URL: JSON.stringify('ws://127.0.0.1:39291'), + API_URL: JSON.stringify( + `http://127.0.0.1:${process.env.CORTEX_API_PORT ?? '39291'}` + ), PLATFORM: JSON.stringify(process.platform), - CORTEX_ENGINE_VERSION: JSON.stringify('v0.1.49'), + CORTEX_ENGINE_VERSION: JSON.stringify('v0.1.55'), DEFAULT_REMOTE_ENGINES: JSON.stringify(engines), DEFAULT_REMOTE_MODELS: JSON.stringify(models), DEFAULT_REQUEST_PAYLOAD_TRANSFORM: JSON.stringify( @@ -26,6 +27,7 @@ export default defineConfig([ DEFAULT_REQUEST_HEADERS_TRANSFORM: JSON.stringify( 'Authorization: Bearer {{api_key}}' ), + VERSION: JSON.stringify(pkgJson.version ?? '0.0.0'), }, }, { @@ -36,7 +38,7 @@ export default defineConfig([ file: 'dist/node/index.cjs.js', }, define: { - CORTEX_ENGINE_VERSION: JSON.stringify('v0.1.49'), + CORTEX_ENGINE_VERSION: JSON.stringify('v0.1.55'), }, }, ]) diff --git a/extensions/engine-management-extension/src/@types/global.d.ts b/extensions/engine-management-extension/src/@types/global.d.ts index 55874ea9a..0dbed3806 100644 --- a/extensions/engine-management-extension/src/@types/global.d.ts +++ b/extensions/engine-management-extension/src/@types/global.d.ts @@ -1,11 +1,11 @@ declare const API_URL: string declare const CORTEX_ENGINE_VERSION: string declare const PLATFORM: string -declare const SOCKET_URL: string declare const NODE: string declare const DEFAULT_REQUEST_PAYLOAD_TRANSFORM: string declare const DEFAULT_RESPONSE_BODY_TRANSFORM: string declare const DEFAULT_REQUEST_HEADERS_TRANSFORM: string +declare const VERSION: string declare const DEFAULT_REMOTE_ENGINES: ({ id: string diff --git a/extensions/engine-management-extension/src/api.test.ts b/extensions/engine-management-extension/src/api.test.ts new file mode 100644 index 000000000..ab72f8127 --- /dev/null +++ b/extensions/engine-management-extension/src/api.test.ts @@ -0,0 +1,199 @@ +import { describe, beforeEach, it, expect, vi } from 'vitest' +import JanEngineManagementExtension from './index' +import { InferenceEngine } from '@janhq/core' + +describe('API methods', () => { + let extension: JanEngineManagementExtension + + beforeEach(() => { + // @ts-ignore + extension = new JanEngineManagementExtension() + vi.resetAllMocks() + }) + + describe('getReleasedEnginesByVersion', () => { + it('should return engines filtered by platform if provided', async () => { + const mockEngines = [ + { + name: 'windows-amd64-avx2', + version: '1.0.0', + }, + { + name: 'linux-amd64-avx2', + version: '1.0.0', + }, + ] + + vi.mock('ky', () => ({ + default: { + get: () => ({ + json: () => Promise.resolve(mockEngines), + }), + }, + })) + + const mock = vi.spyOn(extension, 'getReleasedEnginesByVersion') + mock.mockImplementation(async (name, version, platform) => { + const result = await Promise.resolve(mockEngines) + return platform ? result.filter(r => r.name.includes(platform)) : result + }) + + const result = await extension.getReleasedEnginesByVersion( + InferenceEngine.cortex_llamacpp, + '1.0.0', + 'windows' + ) + + expect(result).toHaveLength(1) + expect(result[0].name).toBe('windows-amd64-avx2') + }) + + it('should return all engines if platform is not provided', async () => { + const mockEngines = [ + { + name: 'windows-amd64-avx2', + version: '1.0.0', + }, + { + name: 'linux-amd64-avx2', + version: '1.0.0', + }, + ] + + vi.mock('ky', () => ({ + default: { + get: () => ({ + json: () => Promise.resolve(mockEngines), + }), + }, + })) + + const mock = vi.spyOn(extension, 'getReleasedEnginesByVersion') + mock.mockImplementation(async (name, version, platform) => { + const result = await Promise.resolve(mockEngines) + return platform ? result.filter(r => r.name.includes(platform)) : result + }) + + const result = await extension.getReleasedEnginesByVersion( + InferenceEngine.cortex_llamacpp, + '1.0.0' + ) + + expect(result).toHaveLength(2) + }) + }) + + describe('getLatestReleasedEngine', () => { + it('should return engines filtered by platform if provided', async () => { + const mockEngines = [ + { + name: 'windows-amd64-avx2', + version: '1.0.0', + }, + { + name: 'linux-amd64-avx2', + version: '1.0.0', + }, + ] + + vi.mock('ky', () => ({ + default: { + get: () => ({ + json: () => Promise.resolve(mockEngines), + }), + }, + })) + + const mock = vi.spyOn(extension, 'getLatestReleasedEngine') + mock.mockImplementation(async (name, platform) => { + const result = await Promise.resolve(mockEngines) + return platform ? result.filter(r => r.name.includes(platform)) : result + }) + + const result = await extension.getLatestReleasedEngine( + InferenceEngine.cortex_llamacpp, + 'linux' + ) + + expect(result).toHaveLength(1) + expect(result[0].name).toBe('linux-amd64-avx2') + }) + }) + + describe('installEngine', () => { + it('should send install request with correct parameters', async () => { + const mockEngineConfig = { + variant: 'windows-amd64-avx2', + version: '1.0.0', + } + + vi.mock('ky', () => ({ + default: { + post: (url, options) => { + expect(url).toBe(`${API_URL}/v1/engines/${InferenceEngine.cortex_llamacpp}/install`) + expect(options.json).toEqual(mockEngineConfig) + return Promise.resolve({ messages: 'OK' }) + }, + }, + })) + + const result = await extension.installEngine( + InferenceEngine.cortex_llamacpp, + mockEngineConfig + ) + + expect(result).toEqual({ messages: 'OK' }) + }) + }) + + describe('uninstallEngine', () => { + it('should send uninstall request with correct parameters', async () => { + const mockEngineConfig = { + variant: 'windows-amd64-avx2', + version: '1.0.0', + } + + vi.mock('ky', () => ({ + default: { + delete: (url, options) => { + expect(url).toBe(`${API_URL}/v1/engines/${InferenceEngine.cortex_llamacpp}/install`) + expect(options.json).toEqual(mockEngineConfig) + return Promise.resolve({ messages: 'OK' }) + }, + }, + })) + + const result = await extension.uninstallEngine( + InferenceEngine.cortex_llamacpp, + mockEngineConfig + ) + + expect(result).toEqual({ messages: 'OK' }) + }) + }) + + describe('addRemoteModel', () => { + it('should send add model request with correct parameters', async () => { + const mockModel = { + id: 'gpt-4', + name: 'GPT-4', + engine: InferenceEngine.openai, + } + + vi.mock('ky', () => ({ + default: { + post: (url, options) => { + expect(url).toBe(`${API_URL}/v1/models/add`) + expect(options.json).toHaveProperty('id', 'gpt-4') + expect(options.json).toHaveProperty('engine', InferenceEngine.openai) + expect(options.json).toHaveProperty('inference_params') + return Promise.resolve() + }, + }, + })) + + await extension.addRemoteModel(mockModel) + // Success is implied by no thrown exceptions + }) + }) +}) \ No newline at end of file diff --git a/extensions/engine-management-extension/src/error.test.ts b/extensions/engine-management-extension/src/error.test.ts new file mode 100644 index 000000000..87389c50c --- /dev/null +++ b/extensions/engine-management-extension/src/error.test.ts @@ -0,0 +1,19 @@ +import { describe, it, expect } from 'vitest' +import { EngineError } from './error' + +describe('EngineError', () => { + it('should create an error with the correct message', () => { + const errorMessage = 'Test error message' + const error = new EngineError(errorMessage) + + expect(error).toBeInstanceOf(Error) + expect(error.message).toBe(errorMessage) + expect(error.name).toBe('EngineError') + }) + + it('should create an error with default message if none provided', () => { + const error = new EngineError() + + expect(error.message).toBe('Engine error occurred') + }) +}) \ No newline at end of file diff --git a/extensions/engine-management-extension/src/index.test.ts b/extensions/engine-management-extension/src/index.test.ts new file mode 100644 index 000000000..174992f3b --- /dev/null +++ b/extensions/engine-management-extension/src/index.test.ts @@ -0,0 +1,449 @@ +import { describe, beforeEach, it, expect, vi } from 'vitest' +import JanEngineManagementExtension from './index' +import { Engines, InferenceEngine } from '@janhq/core' +import { EngineError } from './error' +import { HTTPError } from 'ky' + +vi.stubGlobal('API_URL', 'http://localhost:3000') + +const mockEngines: Engines = [ + { + name: 'variant1', + version: '1.0.0', + type: 'local', + engine: InferenceEngine.cortex_llamacpp, + }, +] + +const mockRemoteEngines: Engines = [ + { + name: 'openai', + version: '1.0.0', + type: 'remote', + engine: InferenceEngine.openai, + }, +] + +const mockRemoteModels = { + data: [ + { + id: 'gpt-4', + name: 'GPT-4', + engine: InferenceEngine.openai, + }, + ], +} + +vi.stubGlobal('DEFAULT_REMOTE_ENGINES', mockEngines) +vi.stubGlobal('DEFAULT_REMOTE_MODELS', mockRemoteModels.data) + +describe('migrate engine settings', () => { + let extension: JanEngineManagementExtension + + beforeEach(() => { + // @ts-ignore + extension = new JanEngineManagementExtension() + vi.resetAllMocks() + }) + + it('engines should be migrated', async () => { + vi.stubGlobal('VERSION', '2.0.0') + + vi.spyOn(extension, 'getEngines').mockResolvedValue([]) + const mockUpdateEngines = vi + .spyOn(extension, 'updateEngine') + .mockReturnThis() + + mockUpdateEngines.mockResolvedValue({ + messages: 'OK', + }) + + await extension.migrate() + + // Assert that the returned value is equal to the mockEngines object + expect(mockUpdateEngines).toBeCalled() + }) + + it('should not migrate when extension version is not updated', async () => { + vi.stubGlobal('VERSION', '0.0.0') + vi.spyOn(extension, 'getEngines').mockResolvedValue([]) + const mockUpdateEngines = vi + .spyOn(extension, 'updateEngine') + .mockReturnThis() + + mockUpdateEngines.mockResolvedValue({ + messages: 'OK', + }) + + await extension.migrate() + + // Assert that the returned value is equal to the mockEngines object + expect(mockUpdateEngines).not.toBeCalled() + }) +}) + +describe('getEngines', () => { + let extension: JanEngineManagementExtension + + beforeEach(() => { + // @ts-ignore + extension = new JanEngineManagementExtension() + vi.resetAllMocks() + }) + + it('should return a list of engines', async () => { + const mockKyGet = vi.spyOn(extension, 'getEngines') + mockKyGet.mockResolvedValue(mockEngines) + + const engines = await extension.getEngines() + + expect(engines).toEqual(mockEngines) + }) +}) + +describe('getRemoteModels', () => { + let extension: JanEngineManagementExtension + + beforeEach(() => { + // @ts-ignore + extension = new JanEngineManagementExtension() + vi.resetAllMocks() + }) + + it('should return a list of remote models', async () => { + vi.mock('ky', () => ({ + default: { + get: () => ({ + json: () => Promise.resolve(mockRemoteModels), + }), + }, + })) + + const models = await extension.getRemoteModels('openai') + expect(models).toEqual(mockRemoteModels) + }) + + it('should return empty data array when request fails', async () => { + vi.mock('ky', () => ({ + default: { + get: () => ({ + json: () => Promise.reject(new Error('Failed to fetch')), + }), + }, + })) + + const models = await extension.getRemoteModels('openai') + expect(models).toEqual({ data: [] }) + }) +}) + +describe('getInstalledEngines', () => { + let extension: JanEngineManagementExtension + + beforeEach(() => { + // @ts-ignore + extension = new JanEngineManagementExtension() + vi.resetAllMocks() + }) + + it('should return a list of installed engines', async () => { + const mockEngineVariants = [ + { + name: 'windows-amd64-noavx', + version: '1.0.0', + }, + ] + + vi.mock('ky', () => ({ + default: { + get: () => ({ + json: () => Promise.resolve(mockEngineVariants), + }), + }, + })) + + const mock = vi.spyOn(extension, 'getInstalledEngines') + mock.mockResolvedValue(mockEngineVariants) + + const engines = await extension.getInstalledEngines(InferenceEngine.cortex_llamacpp) + expect(engines).toEqual(mockEngineVariants) + }) +}) + +describe('healthz', () => { + let extension: JanEngineManagementExtension + + beforeEach(() => { + // @ts-ignore + extension = new JanEngineManagementExtension() + vi.resetAllMocks() + }) + + it('should perform health check successfully', async () => { + vi.mock('ky', () => ({ + default: { + get: () => Promise.resolve(), + }, + })) + + await extension.healthz() + expect(extension.queue.concurrency).toBe(Infinity) + }) +}) + +describe('updateDefaultEngine', () => { + let extension: JanEngineManagementExtension + + beforeEach(() => { + // @ts-ignore + extension = new JanEngineManagementExtension() + vi.resetAllMocks() + }) + + it('should set default engine variant if not installed', async () => { + vi.stubGlobal('PLATFORM', 'win32') + vi.stubGlobal('CORTEX_ENGINE_VERSION', '1.0.0') + + const mockGetDefaultEngineVariant = vi.spyOn( + extension, + 'getDefaultEngineVariant' + ) + mockGetDefaultEngineVariant.mockResolvedValue({ + variant: 'variant1', + version: '1.0.0', + }) + + const mockGetInstalledEngines = vi.spyOn(extension, 'getInstalledEngines') + mockGetInstalledEngines.mockResolvedValue([]) + + const mockSetDefaultEngineVariant = vi.spyOn( + extension, + 'setDefaultEngineVariant' + ) + mockSetDefaultEngineVariant.mockResolvedValue({ messages: 'OK' }) + + vi.mock('@janhq/core', async (importOriginal) => { + const actual = (await importOriginal()) as any + return { + ...actual, + systemInformation: vi.fn().mockResolvedValue({ gpuSetting: 'high' }), + } + }) + + vi.mock('./utils', async (importOriginal) => { + const actual = (await importOriginal()) as any + return { + ...actual, + engineVariant: vi.fn().mockResolvedValue('windows-amd64-noavx'), + } + }) + + await extension.updateDefaultEngine() + + expect(mockSetDefaultEngineVariant).toHaveBeenCalledWith('llama-cpp', { + variant: 'windows-amd64-noavx', + version: '1.0.0', + }) + }) + + it('should not reset default engine variant if installed', async () => { + vi.stubGlobal('PLATFORM', 'win32') + vi.stubGlobal('CORTEX_ENGINE_VERSION', '1.0.0') + + const mockGetDefaultEngineVariant = vi.spyOn( + extension, + 'getDefaultEngineVariant' + ) + mockGetDefaultEngineVariant.mockResolvedValue({ + variant: 'windows-amd64-noavx', + version: '1.0.0', + }) + + const mockGetInstalledEngines = vi.spyOn(extension, 'getInstalledEngines') + mockGetInstalledEngines.mockResolvedValue([ + { + name: 'windows-amd64-noavx', + version: '1.0.0', + type: 'local', + engine: InferenceEngine.cortex_llamacpp, + }, + ]) + + const mockSetDefaultEngineVariant = vi.spyOn( + extension, + 'setDefaultEngineVariant' + ) + mockSetDefaultEngineVariant.mockResolvedValue({ messages: 'OK' }) + + vi.mock('@janhq/core', async (importOriginal) => { + const actual = (await importOriginal()) as any + return { + ...actual, + systemInformation: vi.fn().mockResolvedValue({ gpuSetting: 'high' }), + } + }) + + vi.mock('./utils', async (importOriginal) => { + const actual = (await importOriginal()) as any + return { + ...actual, + engineVariant: vi.fn().mockResolvedValue('windows-amd64-noavx'), + } + }) + + await extension.updateDefaultEngine() + + expect(mockSetDefaultEngineVariant).not.toBeCalled() + }) + + it('should handle HTTPError when getting default engine variant', async () => { + vi.stubGlobal('PLATFORM', 'win32') + vi.stubGlobal('CORTEX_ENGINE_VERSION', '1.0.0') + + const httpError = new Error('HTTP Error') as HTTPError + httpError.response = { status: 400 } as Response + + const mockGetDefaultEngineVariant = vi.spyOn( + extension, + 'getDefaultEngineVariant' + ) + mockGetDefaultEngineVariant.mockRejectedValue(httpError) + + const mockSetDefaultEngineVariant = vi.spyOn( + extension, + 'setDefaultEngineVariant' + ) + mockSetDefaultEngineVariant.mockResolvedValue({ messages: 'OK' }) + + vi.mock('@janhq/core', async (importOriginal) => { + const actual = (await importOriginal()) as any + return { + ...actual, + systemInformation: vi.fn().mockResolvedValue({ gpuSetting: 'high' }), + } + }) + + vi.mock('./utils', async (importOriginal) => { + const actual = (await importOriginal()) as any + return { + ...actual, + engineVariant: vi.fn().mockResolvedValue('windows-amd64-noavx'), + } + }) + + await extension.updateDefaultEngine() + + expect(mockSetDefaultEngineVariant).toHaveBeenCalledWith('llama-cpp', { + variant: 'windows-amd64-noavx', + version: '1.0.0', + }) + }) + + it('should handle EngineError when getting default engine variant', async () => { + vi.stubGlobal('PLATFORM', 'win32') + vi.stubGlobal('CORTEX_ENGINE_VERSION', '1.0.0') + + const mockGetDefaultEngineVariant = vi.spyOn( + extension, + 'getDefaultEngineVariant' + ) + mockGetDefaultEngineVariant.mockRejectedValue(new EngineError('Test error')) + + const mockSetDefaultEngineVariant = vi.spyOn( + extension, + 'setDefaultEngineVariant' + ) + mockSetDefaultEngineVariant.mockResolvedValue({ messages: 'OK' }) + + vi.mock('@janhq/core', async (importOriginal) => { + const actual = (await importOriginal()) as any + return { + ...actual, + systemInformation: vi.fn().mockResolvedValue({ gpuSetting: 'high' }), + } + }) + + vi.mock('./utils', async (importOriginal) => { + const actual = (await importOriginal()) as any + return { + ...actual, + engineVariant: vi.fn().mockResolvedValue('windows-amd64-noavx'), + } + }) + + await extension.updateDefaultEngine() + + expect(mockSetDefaultEngineVariant).toHaveBeenCalledWith('llama-cpp', { + variant: 'windows-amd64-noavx', + version: '1.0.0', + }) + }) + + it('should handle unexpected errors gracefully', async () => { + vi.stubGlobal('PLATFORM', 'win32') + + const mockGetDefaultEngineVariant = vi.spyOn( + extension, + 'getDefaultEngineVariant' + ) + mockGetDefaultEngineVariant.mockRejectedValue(new Error('Unexpected error')) + + const consoleSpy = vi.spyOn(console, 'error').mockImplementation(() => {}) + + await extension.updateDefaultEngine() + + expect(consoleSpy).toHaveBeenCalled() + }) +}) + +describe('populateDefaultRemoteEngines', () => { + let extension: JanEngineManagementExtension + + beforeEach(() => { + // @ts-ignore + extension = new JanEngineManagementExtension() + vi.resetAllMocks() + }) + + it('should not add default remote engines if remote engines already exist', async () => { + const mockGetEngines = vi.spyOn(extension, 'getEngines') + mockGetEngines.mockResolvedValue(mockRemoteEngines) + + const mockAddRemoteEngine = vi.spyOn(extension, 'addRemoteEngine') + + await extension.populateDefaultRemoteEngines() + + expect(mockAddRemoteEngine).not.toBeCalled() + }) + + it('should add default remote engines if no remote engines exist', async () => { + const mockGetEngines = vi.spyOn(extension, 'getEngines') + mockGetEngines.mockResolvedValue([]) + + const mockAddRemoteEngine = vi.spyOn(extension, 'addRemoteEngine') + mockAddRemoteEngine.mockResolvedValue({ messages: 'OK' }) + + const mockAddRemoteModel = vi.spyOn(extension, 'addRemoteModel') + mockAddRemoteModel.mockResolvedValue(undefined) + + vi.mock('@janhq/core', async (importOriginal) => { + const actual = (await importOriginal()) as any + return { + ...actual, + events: { + emit: vi.fn(), + }, + joinPath: vi.fn().mockResolvedValue('/path/to/settings.json'), + getJanDataFolderPath: vi.fn().mockResolvedValue('/path/to/data'), + fs: { + existsSync: vi.fn().mockResolvedValue(false), + }, + } + }) + + await extension.populateDefaultRemoteEngines() + + expect(mockAddRemoteEngine).toHaveBeenCalled() + expect(mockAddRemoteModel).toHaveBeenCalled() + }) +}) diff --git a/extensions/engine-management-extension/src/index.ts b/extensions/engine-management-extension/src/index.ts index e2730cc71..7d0c9f9c4 100644 --- a/extensions/engine-management-extension/src/index.ts +++ b/extensions/engine-management-extension/src/index.ts @@ -15,7 +15,7 @@ import { ModelEvent, EngineEvent, } from '@janhq/core' -import ky, { HTTPError } from 'ky' +import ky, { HTTPError, KyInstance } from 'ky' import PQueue from 'p-queue' import { EngineError } from './error' import { getJanDataFolderPath } from '@janhq/core' @@ -31,6 +31,22 @@ interface ModelList { export default class JanEngineManagementExtension extends EngineManagementExtension { queue = new PQueue({ concurrency: 1 }) + api?: KyInstance + /** + * Get the API instance + * @returns + */ + async apiInstance(): Promise { + if(this.api) return this.api + const apiKey = (await window.core?.api.appToken()) ?? 'cortex.cpp' + this.api = ky.extend({ + prefixUrl: API_URL, + headers: { + Authorization: `Bearer ${apiKey}`, + }, + }) + return this.api + } /** * Called when the extension is loaded. */ @@ -44,6 +60,9 @@ export default class JanEngineManagementExtension extends EngineManagementExtens // Populate default remote engines this.populateDefaultRemoteEngines() + + // Migrate + this.migrate() } /** @@ -56,10 +75,12 @@ export default class JanEngineManagementExtension extends EngineManagementExtens */ async getEngines(): Promise { return this.queue.add(() => - ky - .get(`${API_URL}/v1/engines`) - .json() - .then((e) => e) + this.apiInstance().then((api) => + api + .get('v1/engines') + .json() + .then((e) => e) + ) ) as Promise } @@ -67,12 +88,15 @@ export default class JanEngineManagementExtension extends EngineManagementExtens * @returns A Promise that resolves to an object of list engines. */ async getRemoteModels(name: string): Promise { - return ky - .get(`${API_URL}/v1/models/remote/${name}`) - .json() - .catch(() => ({ - data: [], - })) as Promise + return this.apiInstance().then( + (api) => + api + .get(`v1/models/remote/${name}`) + .json() + .catch(() => ({ + data: [], + })) as Promise + ) } /** @@ -81,10 +105,12 @@ export default class JanEngineManagementExtension extends EngineManagementExtens */ async getInstalledEngines(name: InferenceEngine): Promise { return this.queue.add(() => - ky - .get(`${API_URL}/v1/engines/${name}`) - .json() - .then((e) => e) + this.apiInstance().then((api) => + api + .get(`v1/engines/${name}`) + .json() + .then((e) => e) + ) ) as Promise } @@ -100,12 +126,14 @@ export default class JanEngineManagementExtension extends EngineManagementExtens platform?: string ) { return this.queue.add(() => - ky - .get(`${API_URL}/v1/engines/${name}/releases/${version}`) - .json() - .then((e) => - platform ? e.filter((r) => r.name.includes(platform)) : e - ) + this.apiInstance().then((api) => + api + .get(`v1/engines/${name}/releases/${version}`) + .json() + .then((e) => + platform ? e.filter((r) => r.name.includes(platform)) : e + ) + ) ) as Promise } @@ -116,12 +144,14 @@ export default class JanEngineManagementExtension extends EngineManagementExtens */ async getLatestReleasedEngine(name: InferenceEngine, platform?: string) { return this.queue.add(() => - ky - .get(`${API_URL}/v1/engines/${name}/releases/latest`) - .json() - .then((e) => - platform ? e.filter((r) => r.name.includes(platform)) : e - ) + this.apiInstance().then((api) => + api + .get(`v1/engines/${name}/releases/latest`) + .json() + .then((e) => + platform ? e.filter((r) => r.name.includes(platform)) : e + ) + ) ) as Promise } @@ -131,9 +161,11 @@ export default class JanEngineManagementExtension extends EngineManagementExtens */ async installEngine(name: string, engineConfig: EngineConfig) { return this.queue.add(() => - ky - .post(`${API_URL}/v1/engines/${name}/install`, { json: engineConfig }) - .then((e) => e) + this.apiInstance().then((api) => + api + .post(`v1/engines/${name}/install`, { json: engineConfig }) + .then((e) => e) + ) ) as Promise<{ messages: string }> } @@ -164,15 +196,17 @@ export default class JanEngineManagementExtension extends EngineManagementExtens engineConfig.metadata.header_template = DEFAULT_REQUEST_HEADERS_TRANSFORM return this.queue.add(() => - ky.post(`${API_URL}/v1/engines`, { json: engineConfig }).then((e) => { - if (persistModels && engineConfig.metadata?.get_models_url) { - // Pull /models from remote models endpoint - return this.populateRemoteModels(engineConfig) - .then(() => e) - .catch(() => e) - } - return e - }) + this.apiInstance().then((api) => + api.post('v1/engines', { json: engineConfig }).then((e) => { + if (persistModels && engineConfig.metadata?.get_models_url) { + // Pull /models from remote models endpoint + return this.populateRemoteModels(engineConfig) + .then(() => e) + .catch(() => e) + } + return e + }) + ) ) as Promise<{ messages: string }> } @@ -182,9 +216,11 @@ export default class JanEngineManagementExtension extends EngineManagementExtens */ async uninstallEngine(name: InferenceEngine, engineConfig: EngineConfig) { return this.queue.add(() => - ky - .delete(`${API_URL}/v1/engines/${name}/install`, { json: engineConfig }) - .then((e) => e) + this.apiInstance().then((api) => + api + .delete(`v1/engines/${name}/install`, { json: engineConfig }) + .then((e) => e) + ) ) as Promise<{ messages: string }> } @@ -193,25 +229,27 @@ export default class JanEngineManagementExtension extends EngineManagementExtens * @param model - Remote model object. */ async addRemoteModel(model: Model) { - return this.queue - .add(() => - ky - .post(`${API_URL}/v1/models/add`, { - json: { - inference_params: { - max_tokens: 4096, - temperature: 0.7, - top_p: 0.95, - stream: true, - frequency_penalty: 0, - presence_penalty: 0, + return this.queue.add(() => + this.apiInstance() + .then((api) => + api + .post('v1/models/add', { + json: { + inference_params: { + max_tokens: 4096, + temperature: 0.7, + top_p: 0.95, + stream: true, + frequency_penalty: 0, + presence_penalty: 0, + }, + ...model, }, - ...model, - }, - }) - .then((e) => e) - ) - .then(() => {}) + }) + .then((e) => e) + ) + .then(() => {}) + ) } /** @@ -220,10 +258,12 @@ export default class JanEngineManagementExtension extends EngineManagementExtens */ async getDefaultEngineVariant(name: InferenceEngine) { return this.queue.add(() => - ky - .get(`${API_URL}/v1/engines/${name}/default`) - .json<{ messages: string }>() - .then((e) => e) + this.apiInstance().then((api) => + api + .get(`v1/engines/${name}/default`) + .json<{ messages: string }>() + .then((e) => e) + ) ) as Promise } @@ -237,9 +277,11 @@ export default class JanEngineManagementExtension extends EngineManagementExtens engineConfig: EngineConfig ) { return this.queue.add(() => - ky - .post(`${API_URL}/v1/engines/${name}/default`, { json: engineConfig }) - .then((e) => e) + this.apiInstance().then((api) => + api + .post(`v1/engines/${name}/default`, { json: engineConfig }) + .then((e) => e) + ) ) as Promise<{ messages: string }> } @@ -248,9 +290,11 @@ export default class JanEngineManagementExtension extends EngineManagementExtens */ async updateEngine(name: InferenceEngine, engineConfig?: EngineConfig) { return this.queue.add(() => - ky - .post(`${API_URL}/v1/engines/${name}/update`, { json: engineConfig }) - .then((e) => e) + this.apiInstance().then((api) => + api + .post(`v1/engines/${name}/update`, { json: engineConfig }) + .then((e) => e) + ) ) as Promise<{ messages: string }> } @@ -259,11 +303,15 @@ export default class JanEngineManagementExtension extends EngineManagementExtens * @returns */ async healthz(): Promise { - return ky - .get(`${API_URL}/healthz`, { - retry: { limit: 20, delay: () => 500, methods: ['get'] }, + return this.apiInstance() + .then((api) => + api.get('healthz', { + retry: { limit: 20, delay: () => 500, methods: ['get'] }, + }) + ) + .then(() => { + this.queue.concurrency = Infinity }) - .then(() => {}) } /** @@ -281,7 +329,8 @@ export default class JanEngineManagementExtension extends EngineManagementExtens if ( !installedEngines.some( (e) => e.name === variant.variant && e.version === variant.version - ) + ) || + variant.version < CORTEX_ENGINE_VERSION ) { throw new EngineError( 'Default engine is not available, use bundled version.' @@ -373,4 +422,37 @@ export default class JanEngineManagementExtension extends EngineManagementExtens }) .catch(console.info) } + + /** + * Update engine settings to the latest version + */ + migrate = async () => { + // Ensure health check is done + await this.queue.onEmpty() + + const version = await this.getSetting('version', '0.0.0') + const engines = await this.getEngines() + if (version < VERSION) { + console.log('Migrating engine settings...') + // Migrate engine settings + await Promise.all( + DEFAULT_REMOTE_ENGINES.map((engine) => { + const { id, ...data } = engine + + data.api_key = engines[id]?.api_key + return this.updateEngine(id, { + ...data, + }).catch(console.error) + }) + ) + await this.updateSettings([ + { + key: 'version', + controllerProps: { + value: VERSION, + }, + }, + ]) + } + } } diff --git a/extensions/engine-management-extension/src/node/index.test.ts b/extensions/engine-management-extension/src/node/index.test.ts deleted file mode 100644 index aa2ac8be8..000000000 --- a/extensions/engine-management-extension/src/node/index.test.ts +++ /dev/null @@ -1,378 +0,0 @@ -import { describe, expect, it } from '@jest/globals' -import engine from './index' -import { GpuSetting } from '@janhq/core' -import { fork } from 'child_process' - -let testSettings: GpuSetting = { - run_mode: 'cpu', - vulkan: false, - cuda: { - exist: false, - version: '11', - }, - gpu_highest_vram: '0', - gpus: [], - gpus_in_use: [], - is_initial: false, - notify: true, - nvidia_driver: { - exist: false, - version: '11', - }, -} -const originalPlatform = process.platform - - - -jest.mock('@janhq/core', () => ({ - appResourcePath: () => '.', - log: jest.fn(), -})) - -describe('test executable cortex file', () => { - afterAll(function () { - Object.defineProperty(process, 'platform', { - value: originalPlatform, - }) - }) - - it('executes on MacOS', () => { - - Object.defineProperty(process, 'platform', { - value: 'darwin', - }) - Object.defineProperty(process, 'arch', { - value: 'arm64', - }) - - - expect(engine.engineVariant(testSettings)).resolves.toEqual('mac-arm64') - }) - - it('executes on MacOS', () => { - Object.defineProperty(process, 'platform', { - value: 'darwin', - }) - Object.defineProperty(process, 'arch', { - value: 'arm64', - }) - - const mockProcess = { - on: jest.fn((event, callback) => { - if (event === 'message') { - callback('noavx') - } - }), - send: jest.fn(), - } - - Object.defineProperty(process, 'arch', { - value: 'x64', - }) - - expect(engine.engineVariant(testSettings)).resolves.toEqual('mac-amd64') - }) - - it('executes on Windows CPU', () => { - Object.defineProperty(process, 'platform', { - value: 'win32', - }) - const settings: GpuSetting = { - ...testSettings, - run_mode: 'cpu', - } - const mockProcess = { - on: jest.fn((event, callback) => { - if (event === 'message') { - callback('avx') - } - }), - send: jest.fn(), - } - - expect(engine.engineVariant()).resolves.toEqual('windows-amd64-avx') - }) - - it('executes on Windows Cuda 11', () => { - Object.defineProperty(process, 'platform', { - value: 'win32', - }) - const settings: GpuSetting = { - ...testSettings, - run_mode: 'gpu', - cuda: { - exist: true, - version: '11', - }, - nvidia_driver: { - exist: true, - version: '12', - }, - gpus_in_use: ['0'], - gpus: [ - { - id: '0', - name: 'NVIDIA GeForce GTX 1080', - vram: '80000000', - }, - ], - } - - const mockProcess = { - on: jest.fn((event, callback) => { - if (event === 'message') { - callback('avx2') - } - }), - send: jest.fn(), - } - - expect(engine.engineVariant(settings)).resolves.toEqual( - 'windows-amd64-avx2-cuda-11-7' - ) - }) - - it('executes on Windows Cuda 12', () => { - Object.defineProperty(process, 'platform', { - value: 'win32', - }) - const settings: GpuSetting = { - ...testSettings, - run_mode: 'gpu', - cuda: { - exist: true, - version: '12', - }, - nvidia_driver: { - exist: true, - version: '12', - }, - gpus_in_use: ['0'], - gpus: [ - { - id: '0', - name: 'NVIDIA GeForce GTX 1080', - vram: '80000000', - }, - ], - } - - expect(engine.engineVariant(settings)).resolves.toEqual( - 'windows-amd64-noavx-cuda-12-0' - ) - - expect(engine.engineVariant(settings)).resolves.toEqual( - 'windows-amd64-avx2-cuda-12-0' - ) - }) - - it('executes on Linux CPU', () => { - Object.defineProperty(process, 'platform', { - value: 'linux', - }) - const settings: GpuSetting = { - ...testSettings, - run_mode: 'cpu', - } - - expect(engine.engineVariant()).resolves.toEqual('linux-amd64-noavx') - }) - - it('executes on Linux Cuda 11', () => { - Object.defineProperty(process, 'platform', { - value: 'linux', - }) - const settings: GpuSetting = { - ...testSettings, - run_mode: 'gpu', - cuda: { - exist: true, - version: '11', - }, - nvidia_driver: { - exist: true, - version: '12', - }, - gpus_in_use: ['0'], - gpus: [ - { - id: '0', - name: 'NVIDIA GeForce GTX 1080', - vram: '80000000', - }, - ], - } - expect(engine.engineVariant(settings)).resolves.toBe( - 'linux-amd64-avx2-cuda-11-7' - ) - }) - - it('executes on Linux Cuda 12', () => { - Object.defineProperty(process, 'platform', { - value: 'linux', - }) - const settings: GpuSetting = { - ...testSettings, - run_mode: 'gpu', - cuda: { - exist: true, - version: '12', - }, - nvidia_driver: { - exist: true, - version: '12', - }, - gpus_in_use: ['0'], - gpus: [ - { - id: '0', - name: 'NVIDIA GeForce GTX 1080', - vram: '80000000', - }, - ], - } - - - expect(engine.engineVariant(settings)).resolves.toEqual( - 'linux-amd64-avx2-cuda-12-0' - ) - }) - - // Generate test for different cpu instructions on Linux - it(`executes on Linux CPU with different instructions`, () => { - Object.defineProperty(process, 'platform', { - value: 'linux', - }) - const settings: GpuSetting = { - ...testSettings, - run_mode: 'cpu', - } - - const cpuInstructions = ['avx512', 'avx2', 'avx', 'noavx'] - cpuInstructions.forEach((instruction) => { - expect(engine.engineVariant(settings)).resolves.toEqual( - `linux-amd64-${instruction}` - ) - }) - }) - // Generate test for different cpu instructions on Windows - it(`executes on Windows CPU with different instructions`, () => { - Object.defineProperty(process, 'platform', { - value: 'win32', - }) - const settings: GpuSetting = { - ...testSettings, - run_mode: 'cpu', - } - const cpuInstructions = ['avx512', 'avx2', 'avx', 'noavx'] - cpuInstructions.forEach((instruction) => { - - expect(engine.engineVariant(settings)).resolves.toEqual( - `windows-amd64-${instruction}` - ) - }) - }) - - // Generate test for different cpu instructions on Windows - it(`executes on Windows GPU with different instructions`, () => { - Object.defineProperty(process, 'platform', { - value: 'win32', - }) - const settings: GpuSetting = { - ...testSettings, - run_mode: 'gpu', - cuda: { - exist: true, - version: '12', - }, - nvidia_driver: { - exist: true, - version: '12', - }, - gpus_in_use: ['0'], - gpus: [ - { - id: '0', - name: 'NVIDIA GeForce GTX 1080', - vram: '80000000', - }, - ], - } - const cpuInstructions = ['avx512', 'avx2', 'avx', 'noavx'] - cpuInstructions.forEach((instruction) => { - - expect(engine.engineVariant(settings)).resolves.toEqual( - `windows-amd64-${instruction === 'avx512' || instruction === 'avx2' ? 'avx2' : 'noavx'}-cuda-12-0` - ) - }) - }) - - // Generate test for different cpu instructions on Linux - it(`executes on Linux GPU with different instructions`, () => { - Object.defineProperty(process, 'platform', { - value: 'linux', - }) - const cpuInstructions = ['avx512', 'avx2', 'avx', 'noavx'] - const settings: GpuSetting = { - ...testSettings, - run_mode: 'gpu', - cuda: { - exist: true, - version: '12', - }, - nvidia_driver: { - exist: true, - version: '12', - }, - gpus_in_use: ['0'], - gpus: [ - { - id: '0', - name: 'NVIDIA GeForce GTX 1080', - vram: '80000000', - }, - ], - } - cpuInstructions.forEach((instruction) => { - - expect(engine.engineVariant(settings)).resolves.toEqual( - `linux-amd64-${instruction === 'avx512' || instruction === 'avx2' ? 'avx2' : 'noavx'}-cuda-12-0` - ) - }) - }) - - // Generate test for different cpu instructions on Linux - it(`executes on Linux Vulkan should not have CPU instructions included`, () => { - Object.defineProperty(process, 'platform', { - value: 'linux', - }) - const cpuInstructions = ['avx512', 'avx2', 'avx', 'noavx'] - const settings: GpuSetting = { - ...testSettings, - run_mode: 'gpu', - vulkan: true, - cuda: { - exist: true, - version: '12', - }, - nvidia_driver: { - exist: true, - version: '12', - }, - gpus_in_use: ['0'], - gpus: [ - { - id: '0', - name: 'NVIDIA GeForce GTX 1080', - vram: '80000000', - }, - ], - } - cpuInstructions.forEach((instruction) => { - - expect(engine.engineVariant(settings)).resolves.toEqual( - `linux-amd64-vulkan` - ) - }) - }) -}) diff --git a/extensions/engine-management-extension/src/node/index.ts b/extensions/engine-management-extension/src/node/index.ts index 4c1daf998..ae1934b25 100644 --- a/extensions/engine-management-extension/src/node/index.ts +++ b/extensions/engine-management-extension/src/node/index.ts @@ -4,11 +4,12 @@ import { getJanDataFolderPath, log, } from '@janhq/core/node' -import { mkdir, readdir, symlink } from 'fs/promises' - +import { mkdir, readdir, symlink, cp } from 'fs/promises' +import { existsSync } from 'fs' /** * Create symlink to each variant for the default bundled version + * If running in AppImage environment, copy files instead of creating symlinks */ const symlinkEngines = async () => { const sourceEnginePath = path.join( @@ -23,6 +24,8 @@ const symlinkEngines = async () => { 'cortex.llamacpp' ) const variantFolders = await readdir(sourceEnginePath) + const isStandalone = process.platform === 'linux' + for (const variant of variantFolders) { const targetVariantPath = path.join( sourceEnginePath, @@ -39,10 +42,25 @@ const symlinkEngines = async () => { recursive: true, }).catch((error) => log(JSON.stringify(error))) - await symlink(targetVariantPath, symlinkVariantPath, 'junction').catch( - (error) => log(JSON.stringify(error)) - ) - console.log(`Symlink created: ${targetVariantPath} -> ${symlinkEnginePath}`) + // Skip if already exists + if (existsSync(symlinkVariantPath)) { + console.log(`Target already exists: ${symlinkVariantPath}`) + continue + } + + if (isStandalone) { + // Copy files for AppImage environments instead of symlinking + await cp(targetVariantPath, symlinkVariantPath, { recursive: true }).catch( + (error) => log(JSON.stringify(error)) + ) + console.log(`Files copied: ${targetVariantPath} -> ${symlinkVariantPath}`) + } else { + // Create symlink for other environments + await symlink(targetVariantPath, symlinkVariantPath, 'junction').catch( + (error) => log(JSON.stringify(error)) + ) + console.log(`Symlink created: ${targetVariantPath} -> ${symlinkVariantPath}`) + } } } diff --git a/extensions/engine-management-extension/src/populateRemoteModels.test.ts b/extensions/engine-management-extension/src/populateRemoteModels.test.ts new file mode 100644 index 000000000..225db26cc --- /dev/null +++ b/extensions/engine-management-extension/src/populateRemoteModels.test.ts @@ -0,0 +1,139 @@ +import { describe, beforeEach, it, expect, vi } from 'vitest' +import JanEngineManagementExtension from './index' +import { InferenceEngine } from '@janhq/core' + +describe('populateRemoteModels', () => { + let extension: JanEngineManagementExtension + + beforeEach(() => { + // @ts-ignore + extension = new JanEngineManagementExtension() + vi.resetAllMocks() + }) + + it('should populate remote models successfully', async () => { + const mockEngineConfig = { + engine: InferenceEngine.openai, + } + + const mockRemoteModels = { + data: [ + { + id: 'gpt-4', + name: 'GPT-4', + }, + ], + } + + const mockGetRemoteModels = vi.spyOn(extension, 'getRemoteModels') + mockGetRemoteModels.mockResolvedValue(mockRemoteModels) + + const mockAddRemoteModel = vi.spyOn(extension, 'addRemoteModel') + mockAddRemoteModel.mockResolvedValue(undefined) + + vi.mock('@janhq/core', async (importOriginal) => { + const actual = (await importOriginal()) as any + return { + ...actual, + events: { + emit: vi.fn(), + }, + } + }) + + // Use the private method through index.ts + // @ts-ignore - Accessing private method for testing + await extension.populateRemoteModels(mockEngineConfig) + + expect(mockGetRemoteModels).toHaveBeenCalledWith(mockEngineConfig.engine) + expect(mockAddRemoteModel).toHaveBeenCalledWith({ + ...mockRemoteModels.data[0], + engine: mockEngineConfig.engine, + model: 'gpt-4', + }) + }) + + it('should handle empty data from remote models', async () => { + const mockEngineConfig = { + engine: InferenceEngine.openai, + } + + const mockGetRemoteModels = vi.spyOn(extension, 'getRemoteModels') + mockGetRemoteModels.mockResolvedValue({ data: [] }) + + const mockAddRemoteModel = vi.spyOn(extension, 'addRemoteModel') + + vi.mock('@janhq/core', async (importOriginal) => { + const actual = (await importOriginal()) as any + return { + ...actual, + events: { + emit: vi.fn(), + }, + } + }) + + // @ts-ignore - Accessing private method for testing + await extension.populateRemoteModels(mockEngineConfig) + + expect(mockGetRemoteModels).toHaveBeenCalledWith(mockEngineConfig.engine) + expect(mockAddRemoteModel).not.toHaveBeenCalled() + }) + + it('should handle errors when getting remote models', async () => { + const mockEngineConfig = { + engine: InferenceEngine.openai, + } + + const mockGetRemoteModels = vi.spyOn(extension, 'getRemoteModels') + mockGetRemoteModels.mockRejectedValue(new Error('Failed to fetch models')) + + const consoleSpy = vi.spyOn(console, 'info').mockImplementation(() => {}) + + // @ts-ignore - Accessing private method for testing + await extension.populateRemoteModels(mockEngineConfig) + + expect(mockGetRemoteModels).toHaveBeenCalledWith(mockEngineConfig.engine) + expect(consoleSpy).toHaveBeenCalled() + }) + + it('should handle errors when adding remote models', async () => { + const mockEngineConfig = { + engine: InferenceEngine.openai, + } + + const mockRemoteModels = { + data: [ + { + id: 'gpt-4', + name: 'GPT-4', + }, + ], + } + + const mockGetRemoteModels = vi.spyOn(extension, 'getRemoteModels') + mockGetRemoteModels.mockResolvedValue(mockRemoteModels) + + const mockAddRemoteModel = vi.spyOn(extension, 'addRemoteModel') + mockAddRemoteModel.mockRejectedValue(new Error('Failed to add model')) + + const consoleSpy = vi.spyOn(console, 'info').mockImplementation(() => {}) + + vi.mock('@janhq/core', async (importOriginal) => { + const actual = (await importOriginal()) as any + return { + ...actual, + events: { + emit: vi.fn(), + }, + } + }) + + // @ts-ignore - Accessing private method for testing + await extension.populateRemoteModels(mockEngineConfig) + + expect(mockGetRemoteModels).toHaveBeenCalledWith(mockEngineConfig.engine) + expect(mockAddRemoteModel).toHaveBeenCalled() + expect(consoleSpy).toHaveBeenCalled() + }) +}) \ No newline at end of file diff --git a/extensions/engine-management-extension/src/utils.test.ts b/extensions/engine-management-extension/src/utils.test.ts new file mode 100644 index 000000000..e453f58cb --- /dev/null +++ b/extensions/engine-management-extension/src/utils.test.ts @@ -0,0 +1,90 @@ +import { describe, it, expect, vi } from 'vitest' +import { engineVariant } from './utils' + +vi.mock('@janhq/core', () => { + return { + log: () => {}, + } +}) + +describe('engineVariant', () => { + it('should return mac-arm64 when platform is darwin and arch is arm64', async () => { + vi.stubGlobal('PLATFORM', 'darwin') + const result = await engineVariant({ + cpu: { arch: 'arm64', instructions: '' }, + gpus: [], + vulkan: false, + }) + expect(result).toBe('mac-arm64') + }) + + it('should return mac-amd64 when platform is darwin and arch is not arm64', async () => { + vi.stubGlobal('PLATFORM', 'darwin') + const result = await engineVariant({ + cpu: { arch: 'x64', instructions: [] }, + gpus: [], + vulkan: false, + }) + expect(result).toBe('mac-amd64') + }) + + it('should return windows-amd64-noavx-cuda-12-0 when platform is win32, cuda is enabled, and cuda version is 12', async () => { + vi.stubGlobal('PLATFORM', 'win32') + const result = await engineVariant({ + cpu: { arch: 'x64', instructions: ['avx2'] }, + gpus: [ + { + activated: true, + version: '12', + additional_information: { driver_version: '1.0' }, + }, + ], + vulkan: false, + }) + expect(result).toBe('windows-amd64-avx2-cuda-12-0') + }) + + it('should return linux-amd64-noavx-cuda-11-7 when platform is linux, cuda is enabled, and cuda version is 11', async () => { + vi.stubGlobal('PLATFORM', 'linux') + const result = await engineVariant({ + cpu: { arch: 'x64', instructions: [] }, + gpus: [ + { + activated: true, + version: '11', + additional_information: { driver_version: '1.0' }, + }, + ], + vulkan: false, + }) + expect(result).toBe('linux-amd64-noavx-cuda-11-7') + }) + + it('should return windows-amd64-vulkan when platform is win32 and vulkan is enabled', async () => { + vi.stubGlobal('PLATFORM', 'win32') + const result = await engineVariant({ + cpu: { arch: 'x64', instructions: [] }, + gpus: [{ activated: true, version: '12' }], + vulkan: true, + }) + expect(result).toBe('windows-amd64-vulkan') + }) + + it('should return windows-amd64-avx512 when platform is win32, no gpu detected and avx512 cpu instruction is supported', async () => { + vi.stubGlobal('PLATFORM', 'win32') + const result = await engineVariant({ + cpu: { arch: 'x64', instructions: ['avx512'] }, + gpus: [{ activated: true, version: '12' }], + }) + expect(result).toBe('windows-amd64-avx512') + }) + + it('should return windows-amd64-avx512 when platform is win32, no gpu detected and no accelerated cpu instructions are supported', async () => { + vi.stubGlobal('PLATFORM', 'win32') + const result = await engineVariant({ + cpu: { arch: 'x64', instructions: [''] }, + gpus: [{ activated: true, version: '12' }], + }) + expect(result).toBe('windows-amd64-noavx') + }) +}) diff --git a/extensions/engine-management-extension/src/utils.ts b/extensions/engine-management-extension/src/utils.ts index 30d482313..5e3f01ef7 100644 --- a/extensions/engine-management-extension/src/utils.ts +++ b/extensions/engine-management-extension/src/utils.ts @@ -1,20 +1,29 @@ import { GpuSetting, log } from '@janhq/core' +// Supported run modes +enum RunMode { + Cuda = 'cuda', + CPU = 'cpu', +} + +// Supported instruction sets +const instructionBinaryNames = ['noavx', 'avx', 'avx2', 'avx512'] + /** * The GPU runMode that will be set - either 'vulkan', 'cuda', or empty for cpu. * @param settings * @returns */ -const gpuRunMode = (settings?: GpuSetting): string => { +const gpuRunMode = (settings?: GpuSetting): RunMode => { return settings.gpus?.some( (gpu) => - gpu.activated === true && + gpu.activated && gpu.additional_information && gpu.additional_information.driver_version ) - ? 'cuda' - : '' + ? RunMode.Cuda + : RunMode.CPU } /** @@ -37,13 +46,6 @@ const os = (settings?: GpuSetting): string => { * @returns */ const cudaVersion = (settings?: GpuSetting): '12-0' | '11-7' | undefined => { - const isUsingCuda = - settings?.vulkan !== true && - settings?.gpus?.some((gpu) => (gpu.activated === true ? 'gpu' : 'cpu')) && - !os().includes('mac') - - if (!isUsingCuda) return undefined - // return settings?.cuda?.version === '11' ? '11-7' : '12-0' return settings.gpus?.some((gpu) => gpu.version.includes('12')) ? '12-0' : '11-7' @@ -65,19 +67,32 @@ export const engineVariant = async ( // There is no need to append the variant extension for mac if (platform.startsWith('mac')) return platform + const runMode = gpuRunMode(gpuSetting) + // Only Nvidia GPUs have addition_information set and activated by default let engineVariant = - gpuSetting?.vulkan || gpuSetting.gpus.some((e) => !e.additional_information) - ? [platform, 'vulkan'] - : [ + !gpuSetting?.vulkan || + !gpuSetting.gpus?.length || + gpuSetting.gpus.some((e) => e.additional_information && e.activated) + ? [ platform, - gpuRunMode(gpuSetting) === 'cuda' && - (gpuSetting.cpu.instructions.includes('avx2') || - gpuSetting.cpu.instructions.includes('avx512')) - ? 'avx2' - : 'noavx', - gpuRunMode(gpuSetting), - cudaVersion(gpuSetting), - ].filter(Boolean) // Remove any falsy values + ...(runMode === RunMode.Cuda + ? // For cuda we only need to check if the cpu supports avx2 or noavx - since other binaries are not shipped with the extension + [ + gpuSetting.cpu?.instructions.includes('avx2') || + gpuSetting.cpu?.instructions.includes('avx512') + ? 'avx2' + : 'noavx', + runMode, + cudaVersion(gpuSetting), + ] + : // For cpu only we need to check all available supported instructions + [ + (gpuSetting.cpu?.instructions ?? ['noavx']).find((e) => + instructionBinaryNames.includes(e.toLowerCase()) + ) ?? 'noavx', + ]), + ].filter(Boolean) + : [platform, 'vulkan'] let engineVariantString = engineVariant.join('-') diff --git a/extensions/hardware-management-extension/package.json b/extensions/hardware-management-extension/package.json index ec98c7440..396404df9 100644 --- a/extensions/hardware-management-extension/package.json +++ b/extensions/hardware-management-extension/package.json @@ -29,12 +29,10 @@ }, "dependencies": { "@janhq/core": "../../core/package.tgz", - "cpu-instructions": "^0.0.13", "ky": "^1.7.2", "p-queue": "^8.0.1" }, "bundledDependencies": [ - "cpu-instructions", "@janhq/core" ], "hardwares": { diff --git a/extensions/hardware-management-extension/rolldown.config.mjs b/extensions/hardware-management-extension/rolldown.config.mjs index 7982ca555..1a9c34ba0 100644 --- a/extensions/hardware-management-extension/rolldown.config.mjs +++ b/extensions/hardware-management-extension/rolldown.config.mjs @@ -10,8 +10,7 @@ export default defineConfig([ }, define: { NODE: JSON.stringify(`${pkgJson.name}/${pkgJson.node}`), - API_URL: JSON.stringify('http://127.0.0.1:39291'), - SOCKET_URL: JSON.stringify('ws://127.0.0.1:39291'), + API_URL: JSON.stringify(`http://127.0.0.1:${process.env.CORTEX_API_PORT ?? "39291"}`), }, }, ]) diff --git a/extensions/hardware-management-extension/src/@types/global.d.ts b/extensions/hardware-management-extension/src/@types/global.d.ts index 6639b9cbb..a412681e8 100644 --- a/extensions/hardware-management-extension/src/@types/global.d.ts +++ b/extensions/hardware-management-extension/src/@types/global.d.ts @@ -1,5 +1,4 @@ declare const API_URL: string -declare const SOCKET_URL: string declare const NODE: string interface Core { diff --git a/extensions/hardware-management-extension/src/index.ts b/extensions/hardware-management-extension/src/index.ts index c2edc6159..edd98a7ae 100644 --- a/extensions/hardware-management-extension/src/index.ts +++ b/extensions/hardware-management-extension/src/index.ts @@ -1,9 +1,5 @@ -import { - executeOnMain, - HardwareManagementExtension, - HardwareInformation, -} from '@janhq/core' -import ky from 'ky' +import { HardwareManagementExtension, HardwareInformation } from '@janhq/core' +import ky, { KyInstance } from 'ky' import PQueue from 'p-queue' /** @@ -21,6 +17,23 @@ export default class JSONHardwareManagementExtension extends HardwareManagementE this.queue.add(() => this.healthz()) } + api?: KyInstance + /** + * Get the API instance + * @returns + */ + async apiInstance(): Promise { + if(this.api) return this.api + const apiKey = (await window.core?.api.appToken()) ?? 'cortex.cpp' + this.api = ky.extend({ + prefixUrl: API_URL, + headers: { + Authorization: `Bearer ${apiKey}`, + }, + }) + return this.api + } + /** * Called when the extension is unloaded. */ @@ -31,11 +44,13 @@ export default class JSONHardwareManagementExtension extends HardwareManagementE * @returns */ async healthz(): Promise { - return ky - .get(`${API_URL}/healthz`, { - retry: { limit: 20, delay: () => 500, methods: ['get'] }, - }) - .then(() => {}) + return this.apiInstance().then((api) => + api + .get('healthz', { + retry: { limit: 20, delay: () => 500, methods: ['get'] }, + }) + .then(() => {}) + ) } /** @@ -43,10 +58,12 @@ export default class JSONHardwareManagementExtension extends HardwareManagementE */ async getHardware(): Promise { return this.queue.add(() => - ky - .get(`${API_URL}/v1/hardware`) - .json() - .then((e) => e) + this.apiInstance().then((api) => + api + .get('v1/hardware') + .json() + .then((e) => e) + ) ) as Promise } @@ -58,7 +75,9 @@ export default class JSONHardwareManagementExtension extends HardwareManagementE activated_gpus: number[] }> { return this.queue.add(() => - ky.post(`${API_URL}/v1/hardware/activate`, { json: data }).then((e) => e) + this.apiInstance().then((api) => + api.post('v1/hardware/activate', { json: data }).then((e) => e) + ) ) as Promise<{ message: string activated_gpus: number[] diff --git a/extensions/inference-cortex-extension/bin/version.txt b/extensions/inference-cortex-extension/bin/version.txt index 7ee7020b3..492b167a6 100644 --- a/extensions/inference-cortex-extension/bin/version.txt +++ b/extensions/inference-cortex-extension/bin/version.txt @@ -1 +1 @@ -1.0.10 +1.0.12 \ No newline at end of file diff --git a/extensions/inference-cortex-extension/download.bat b/extensions/inference-cortex-extension/download.bat index fd20e8c8d..ca2930bdd 100644 --- a/extensions/inference-cortex-extension/download.bat +++ b/extensions/inference-cortex-extension/download.bat @@ -2,14 +2,14 @@ set BIN_PATH=./bin set SHARED_PATH=./../../electron/shared set /p CORTEX_VERSION=<./bin/version.txt -set ENGINE_VERSION=0.1.49 +set ENGINE_VERSION=0.1.55 @REM Download cortex.llamacpp binaries -set DOWNLOAD_URL=https://github.com/janhq/cortex.llamacpp/releases/download/v%ENGINE_VERSION%/cortex.llamacpp-%ENGINE_VERSION%-windows-amd64 -set CUDA_DOWNLOAD_URL=https://github.com/janhq/cortex.llamacpp/releases/download/v%ENGINE_VERSION% +set DOWNLOAD_URL=https://github.com/menloresearch/cortex.llamacpp/releases/download/v%ENGINE_VERSION%/cortex.llamacpp-%ENGINE_VERSION%-windows-amd64 +set CUDA_DOWNLOAD_URL=https://github.com/menloresearch/cortex.llamacpp/releases/download/v%ENGINE_VERSION% set SUBFOLDERS=windows-amd64-noavx-cuda-12-0 windows-amd64-noavx-cuda-11-7 windows-amd64-avx2-cuda-12-0 windows-amd64-avx2-cuda-11-7 windows-amd64-noavx windows-amd64-avx windows-amd64-avx2 windows-amd64-avx512 windows-amd64-vulkan -call .\node_modules\.bin\download -e --strip 1 -o %BIN_PATH% https://github.com/janhq/cortex.cpp/releases/download/v%CORTEX_VERSION%/cortex-%CORTEX_VERSION%-windows-amd64.tar.gz +call .\node_modules\.bin\download -e --strip 1 -o %BIN_PATH% https://github.com/menloresearch/cortex.cpp/releases/download/v%CORTEX_VERSION%/cortex-%CORTEX_VERSION%-windows-amd64.tar.gz call .\node_modules\.bin\download %DOWNLOAD_URL%-avx2-cuda-12-0.tar.gz -e --strip 1 -o %SHARED_PATH%/engines/cortex.llamacpp/windows-amd64-avx2-cuda-12-0/v%ENGINE_VERSION% call .\node_modules\.bin\download %DOWNLOAD_URL%-avx2-cuda-11-7.tar.gz -e --strip 1 -o %SHARED_PATH%/engines/cortex.llamacpp/windows-amd64-avx2-cuda-11-7/v%ENGINE_VERSION% call .\node_modules\.bin\download %DOWNLOAD_URL%-noavx-cuda-12-0.tar.gz -e --strip 1 -o %SHARED_PATH%/engines/cortex.llamacpp/windows-amd64-noavx-cuda-12-0/v%ENGINE_VERSION% diff --git a/extensions/inference-cortex-extension/download.sh b/extensions/inference-cortex-extension/download.sh index c32160184..3476708bb 100755 --- a/extensions/inference-cortex-extension/download.sh +++ b/extensions/inference-cortex-extension/download.sh @@ -2,10 +2,10 @@ # Read CORTEX_VERSION CORTEX_VERSION=$(cat ./bin/version.txt) -ENGINE_VERSION=0.1.49 -CORTEX_RELEASE_URL="https://github.com/janhq/cortex.cpp/releases/download" -ENGINE_DOWNLOAD_URL="https://github.com/janhq/cortex.llamacpp/releases/download/v${ENGINE_VERSION}/cortex.llamacpp-${ENGINE_VERSION}" -CUDA_DOWNLOAD_URL="https://github.com/janhq/cortex.llamacpp/releases/download/v${ENGINE_VERSION}" +ENGINE_VERSION=0.1.55 +CORTEX_RELEASE_URL="https://github.com/menloresearch/cortex.cpp/releases/download" +ENGINE_DOWNLOAD_URL="https://github.com/menloresearch/cortex.llamacpp/releases/download/v${ENGINE_VERSION}/cortex.llamacpp-${ENGINE_VERSION}" +CUDA_DOWNLOAD_URL="https://github.com/menloresearch/cortex.llamacpp/releases/download/v${ENGINE_VERSION}" BIN_PATH=./bin SHARED_PATH="../../electron/shared" # Detect platform diff --git a/extensions/inference-cortex-extension/jest.config.js b/extensions/inference-cortex-extension/jest.config.js deleted file mode 100644 index b413e106d..000000000 --- a/extensions/inference-cortex-extension/jest.config.js +++ /dev/null @@ -1,5 +0,0 @@ -/** @type {import('ts-jest').JestConfigWithTsJest} */ -module.exports = { - preset: 'ts-jest', - testEnvironment: 'node', -}; \ No newline at end of file diff --git a/extensions/inference-cortex-extension/package.json b/extensions/inference-cortex-extension/package.json index a4558dc8f..00e7c346e 100644 --- a/extensions/inference-cortex-extension/package.json +++ b/extensions/inference-cortex-extension/package.json @@ -8,7 +8,7 @@ "author": "Jan ", "license": "AGPL-3.0", "scripts": { - "test": "jest", + "test": "vitest run", "build": "rolldown -c rolldown.config.mjs", "downloadcortex:linux:darwin": "./download.sh", "downloadcortex:win32": "download.bat", @@ -35,17 +35,15 @@ "rolldown": "1.0.0-beta.1", "run-script-os": "^1.1.6", "ts-jest": "^29.1.2", - "typescript": "^5.3.3" + "typescript": "^5.3.3", + "vitest": "^3.0.8" }, "dependencies": { "@janhq/core": "../../core/package.tgz", - "decompress": "^4.2.1", "fetch-retry": "^5.0.6", "ky": "^1.7.2", "p-queue": "^8.0.1", "rxjs": "^7.8.1", - "tcp-port-used": "^1.0.2", - "terminate": "2.6.1", "ulidx": "^2.3.0" }, "engines": { diff --git a/extensions/inference-cortex-extension/resources/models/aya-23-35b/model.json b/extensions/inference-cortex-extension/resources/models/aya-23-35b/model.json deleted file mode 100644 index f6e3d08e9..000000000 --- a/extensions/inference-cortex-extension/resources/models/aya-23-35b/model.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "sources": [ - { - "filename": "aya-23-35B-Q4_K_M.gguf", - "url": "https://huggingface.co/bartowski/aya-23-35B-GGUF/resolve/main/aya-23-35B-Q4_K_M.gguf" - } - ], - "id": "aya-23-35b", - "object": "model", - "name": "Aya 23 35B Q4", - "version": "1.1", - "description": "Aya 23 can talk upto 23 languages fluently.", - "format": "gguf", - "settings": { - "ctx_len": 8192, - "prompt_template": "<|START_OF_TURN_TOKEN|><|SYSTEM_TOKEN|>{system_prompt}<|END_OF_TURN_TOKEN|><|START_OF_TURN_TOKEN|><|USER_TOKEN|>{prompt}<|END_OF_TURN_TOKEN|><|START_OF_TURN_TOKEN|><|CHATBOT_TOKEN|>", - "llama_model_path": "aya-23-35B-Q4_K_M.gguf", - "ngl": 41 - }, - "parameters": { - "temperature": 0.7, - "top_p": 0.95, - "stream": true, - "max_tokens": 8192, - "frequency_penalty": 0, - "presence_penalty": 0, - "stop": ["<|END_OF_TURN_TOKEN|>"] - }, - "metadata": { - "author": "CohereForAI", - "tags": ["34B", "Finetuned"], - "size": 21556982144 - }, - "engine": "llama-cpp" -} diff --git a/extensions/inference-cortex-extension/resources/models/aya-23-8b/model.json b/extensions/inference-cortex-extension/resources/models/aya-23-8b/model.json deleted file mode 100644 index 463f7eec7..000000000 --- a/extensions/inference-cortex-extension/resources/models/aya-23-8b/model.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "sources": [ - { - "filename": "aya-23-8B-Q4_K_M.gguf", - "url": "https://huggingface.co/bartowski/aya-23-8B-GGUF/resolve/main/aya-23-8B-Q4_K_M.gguf" - } - ], - "id": "aya-23-8b", - "object": "model", - "name": "Aya 23 8B Q4", - "version": "1.2", - "description": "Aya 23 can talk upto 23 languages fluently.", - "format": "gguf", - "settings": { - "ctx_len": 8192, - "prompt_template": "<|START_OF_TURN_TOKEN|><|SYSTEM_TOKEN|>{system_prompt}<|END_OF_TURN_TOKEN|><|START_OF_TURN_TOKEN|><|USER_TOKEN|>{prompt}<|END_OF_TURN_TOKEN|><|START_OF_TURN_TOKEN|><|CHATBOT_TOKEN|>", - "llama_model_path": "aya-23-8B-Q4_K_M.gguf", - "ngl": 33 - }, - "parameters": { - "temperature": 0.7, - "top_p": 0.95, - "stream": true, - "max_tokens": 8192, - "frequency_penalty": 0, - "presence_penalty": 0, - "stop": ["<|END_OF_TURN_TOKEN|>"] - }, - "metadata": { - "author": "CohereForAI", - "tags": ["7B", "Finetuned"], - "size": 5056982144 - }, - "engine": "llama-cpp" -} diff --git a/extensions/inference-cortex-extension/resources/models/bakllava-1/model.json b/extensions/inference-cortex-extension/resources/models/bakllava-1/model.json deleted file mode 100644 index ccc8f693f..000000000 --- a/extensions/inference-cortex-extension/resources/models/bakllava-1/model.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "sources": [ - { - "filename": "ggml-model-q5_k.gguf", - "url": "https://huggingface.co/mys/ggml_bakllava-1/resolve/main/ggml-model-q5_k.gguf" - }, - { - "filename": "mmproj-model-f16.gguf", - "url": "https://huggingface.co/mys/ggml_bakllava-1/resolve/main/mmproj-model-f16.gguf" - } - ], - "id": "bakllava-1", - "object": "model", - "name": "BakLlava 1", - "version": "1.0", - "description": "BakLlava 1 can bring vision understanding to Jan", - "format": "gguf", - "settings": { - "vision_model": true, - "text_model": false, - "ctx_len": 4096, - "prompt_template": "\n### Instruction:\n{prompt}\n### Response:\n", - "llama_model_path": "ggml-model-q5_k.gguf", - "mmproj": "mmproj-model-f16.gguf", - "ngl": 33 - }, - "parameters": { - "max_tokens": 4096 - }, - "metadata": { - "author": "Mys", - "tags": ["Vision"], - "size": 5750000000 - }, - "engine": "llama-cpp" -} diff --git a/extensions/inference-cortex-extension/resources/models/codeninja-1.0-7b/model.json b/extensions/inference-cortex-extension/resources/models/codeninja-1.0-7b/model.json deleted file mode 100644 index 7bd5bf3a4..000000000 --- a/extensions/inference-cortex-extension/resources/models/codeninja-1.0-7b/model.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "sources": [ - { - "filename": "codeninja-1.0-openchat-7b.Q4_K_M.gguf", - "url": "https://huggingface.co/beowolx/CodeNinja-1.0-OpenChat-7B-GGUF/resolve/main/codeninja-1.0-openchat-7b.Q4_K_M.gguf" - } - ], - "id": "codeninja-1.0-7b", - "object": "model", - "name": "CodeNinja 7B Q4", - "version": "1.2", - "description": "CodeNinja is good for coding tasks and can handle various languages including Python, C, C++, Rust, Java, JavaScript, and more.", - "format": "gguf", - "settings": { - "ctx_len": 8192, - "prompt_template": "GPT4 Correct User: {prompt}<|end_of_turn|>GPT4 Correct Assistant:", - "llama_model_path": "codeninja-1.0-openchat-7b.Q4_K_M.gguf", - "ngl": 33 - }, - "parameters": { - "temperature": 0.7, - "top_p": 0.95, - "stream": true, - "max_tokens": 8192, - "frequency_penalty": 0, - "presence_penalty": 0 - }, - "metadata": { - "author": "Beowolx", - "tags": ["7B", "Finetuned"], - "size": 4370000000 - }, - "engine": "llama-cpp" -} diff --git a/extensions/inference-cortex-extension/resources/models/codestral-22b/model.json b/extensions/inference-cortex-extension/resources/models/codestral-22b/model.json deleted file mode 100644 index 2cce063e6..000000000 --- a/extensions/inference-cortex-extension/resources/models/codestral-22b/model.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "sources": [ - { - "filename": "Codestral-22B-v0.1-Q4_K_M.gguf", - "url": "https://huggingface.co/bartowski/Codestral-22B-v0.1-GGUF/resolve/main/Codestral-22B-v0.1-Q4_K_M.gguf" - } - ], - "id": "codestral-22b", - "object": "model", - "name": "Codestral 22B Q4", - "version": "1.1", - "description": "Latest model from MistralAI optimized for code generation tasks.", - "format": "gguf", - "settings": { - "ctx_len": 32000, - "prompt_template": "{system_message} [INST] {prompt} [/INST]", - "llama_model_path": "Codestral-22B-v0.1-Q4_K_M.gguf", - "ngl": 57 - }, - "parameters": { - "temperature": 0.7, - "top_p": 0.95, - "stream": true, - "max_tokens": 32000, - "stop": [", [/INST]"], - "frequency_penalty": 0, - "presence_penalty": 0 - }, - "metadata": { - "author": "MistralAI", - "tags": ["22B", "Finetuned", "Featured"], - "size": 13341237440 - }, - "engine": "llama-cpp" - } - diff --git a/extensions/inference-cortex-extension/resources/models/command-r-34b/model.json b/extensions/inference-cortex-extension/resources/models/command-r-34b/model.json deleted file mode 100644 index 13518604c..000000000 --- a/extensions/inference-cortex-extension/resources/models/command-r-34b/model.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "sources": [ - { - "filename": "c4ai-command-r-v01-Q4_K_M.gguf", - "url": "https://huggingface.co/andrewcanis/c4ai-command-r-v01-GGUF/resolve/main/c4ai-command-r-v01-Q4_K_M.gguf" - } - ], - "id": "command-r-34b", - "object": "model", - "name": "Command-R v01 34B Q4", - "version": "1.6", - "description": "C4AI Command-R developed by CohereAI is optimized for a variety of use cases including reasoning, summarization, and question answering.", - "format": "gguf", - "settings": { - "ctx_len": 131072, - "prompt_template": "<|START_OF_TURN_TOKEN|><|USER_TOKEN|>{prompt}<|END_OF_TURN_TOKEN|><|START_OF_TURN_TOKEN|><|CHATBOT_TOKEN|>", - "llama_model_path": "c4ai-command-r-v01-Q4_K_M.gguf", - "ngl": 41 - }, - "parameters": { - "temperature": 0.7, - "top_p": 0.95, - "stream": true, - "max_tokens": 131072, - "stop": [], - "frequency_penalty": 0, - "presence_penalty": 0 - }, - "metadata": { - "author": "CohereAI", - "tags": ["34B", "Finetuned"], - "size": 21500000000 - }, - "engine": "llama-cpp" - } - diff --git a/extensions/inference-cortex-extension/resources/models/deepseek-coder-1.3b/model.json b/extensions/inference-cortex-extension/resources/models/deepseek-coder-1.3b/model.json deleted file mode 100644 index 6722d253d..000000000 --- a/extensions/inference-cortex-extension/resources/models/deepseek-coder-1.3b/model.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "sources": [ - { - "filename": "deepseek-coder-1.3b-instruct.Q8_0.gguf", - "url": "https://huggingface.co/TheBloke/deepseek-coder-1.3b-instruct-GGUF/resolve/main/deepseek-coder-1.3b-instruct.Q8_0.gguf" - } - ], - "id": "deepseek-coder-1.3b", - "object": "model", - "name": "Deepseek Coder 1.3B Instruct Q8", - "version": "1.4", - "description": "Deepseek Coder excelled in project-level code completion with advanced capabilities across multiple programming languages.", - "format": "gguf", - "settings": { - "ctx_len": 16384, - "prompt_template": "### Instruction:\n{prompt}\n### Response:", - "llama_model_path": "deepseek-coder-1.3b-instruct.Q8_0.gguf", - "ngl": 25 - }, - "parameters": { - "temperature": 0.7, - "top_p": 0.95, - "stream": true, - "max_tokens": 16384, - "stop": ["<|EOT|>"], - "frequency_penalty": 0, - "presence_penalty": 0 - }, - "metadata": { - "author": "Deepseek, The Bloke", - "tags": ["Tiny"], - "size": 1430000000 - }, - "engine": "llama-cpp" -} diff --git a/extensions/inference-cortex-extension/resources/models/deepseek-coder-34b/model.json b/extensions/inference-cortex-extension/resources/models/deepseek-coder-34b/model.json deleted file mode 100644 index 8a2e271cd..000000000 --- a/extensions/inference-cortex-extension/resources/models/deepseek-coder-34b/model.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "sources": [ - { - "filename": "deepseek-coder-33b-instruct.Q4_K_M.gguf", - "url": "https://huggingface.co/mradermacher/deepseek-coder-33b-instruct-GGUF/resolve/main/deepseek-coder-33b-instruct.Q4_K_M.gguf" - } - ], - "id": "deepseek-coder-34b", - "object": "model", - "name": "Deepseek Coder 33B Instruct Q4", - "version": "1.4", - "description": "Deepseek Coder excelled in project-level code completion with advanced capabilities across multiple programming languages.", - "format": "gguf", - "settings": { - "ctx_len": 16384, - "prompt_template": "### Instruction:\n{prompt}\n### Response:", - "llama_model_path": "deepseek-coder-33b-instruct.Q4_K_M.gguf", - "ngl": 63 - }, - "parameters": { - "temperature": 0.7, - "top_p": 0.95, - "stream": true, - "max_tokens": 16384, - "stop": ["<|EOT|>"], - "frequency_penalty": 0, - "presence_penalty": 0 - }, - "metadata": { - "author": "Deepseek", - "tags": ["33B"], - "size": 19940000000 - }, - "engine": "llama-cpp" -} diff --git a/extensions/inference-cortex-extension/resources/models/deepseek-r1-distill-llama-70b/model.json b/extensions/inference-cortex-extension/resources/models/deepseek-r1-distill-llama-70b/model.json deleted file mode 100644 index 7f98b07a1..000000000 --- a/extensions/inference-cortex-extension/resources/models/deepseek-r1-distill-llama-70b/model.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "sources": [ - { - "filename": "DeepSeek-R1-Distill-Llama-70B-Q4_K_M.gguf", - "url": "https://huggingface.co/unsloth/DeepSeek-R1-Distill-Llama-70B-GGUF/resolve/main/DeepSeek-R1-Distill-Llama-70B-Q4_K_M.gguf" - } - ], - "id": "deepseek-r1-distill-llama-70b", - "object": "model", - "name": "DeepSeek R1 Distill Llama 70B Q4", - "version": "1.0", - "description": "DeepSeek-R1 is a cheaper and open-source model that excels at agentic reasoning, superior multilingual capabilities, large context windows, and generalization across domains.", - "format": "gguf", - "settings": { - "ctx_len": 131072, - "prompt_template": "<|User|> {prompt} <|Assistant|>", - "llama_model_path": "DeepSeek-R1-Distill-Llama-70B-Q4_K_M.gguf", - "ngl": 81 - }, - "parameters": { - "temperature": 0.6, - "top_p": 0.95, - "stream": true, - "max_tokens": 131072, - "stop": [], - "frequency_penalty": 0, - "presence_penalty": 0 - }, - "metadata": { - "author": "DeepSeek", - "tags": ["70B", "Featured"], - "size": 42500000000 - }, - "engine": "llama-cpp" -} diff --git a/extensions/inference-cortex-extension/resources/models/deepseek-r1-distill-llama-8b/model.json b/extensions/inference-cortex-extension/resources/models/deepseek-r1-distill-llama-8b/model.json deleted file mode 100644 index a3a075888..000000000 --- a/extensions/inference-cortex-extension/resources/models/deepseek-r1-distill-llama-8b/model.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "sources": [ - { - "filename": "DeepSeek-R1-Distill-Llama-8B-Q5_K_M.gguf", - "url": "https://huggingface.co/unsloth/DeepSeek-R1-Distill-Llama-8B-GGUF/resolve/main/DeepSeek-R1-Distill-Llama-8B-Q5_K_M.gguf" - } - ], - "id": "deepseek-r1-distill-llama-8b", - "object": "model", - "name": "DeepSeek R1 Distill Llama 8B Q5", - "version": "1.0", - "description": "DeepSeek-R1 is a cheaper and open-source model that excels at agentic reasoning, superior multilingual capabilities, large context windows, and generalization across domains.", - "format": "gguf", - "settings": { - "ctx_len": 131072, - "prompt_template": "<|User|> {prompt} <|Assistant|>", - "llama_model_path": "DeepSeek-R1-Distill-Llama-8B-Q5_K_M.gguf", - "ngl": 33 - }, - "parameters": { - "temperature": 0.6, - "top_p": 0.95, - "stream": true, - "max_tokens": 131072, - "stop": [], - "frequency_penalty": 0, - "presence_penalty": 0 - }, - "metadata": { - "author": "DeepSeek", - "tags": ["8B", "Featured"], - "size": 5730000000 - }, - "engine": "llama-cpp" -} diff --git a/extensions/inference-cortex-extension/resources/models/deepseek-r1-distill-qwen-1.5b/model.json b/extensions/inference-cortex-extension/resources/models/deepseek-r1-distill-qwen-1.5b/model.json deleted file mode 100644 index 74b3dfc54..000000000 --- a/extensions/inference-cortex-extension/resources/models/deepseek-r1-distill-qwen-1.5b/model.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "sources": [ - { - "filename": "DeepSeek-R1-Distill-Qwen-1.5B-Q5_K_M.gguf", - "url": "https://huggingface.co/unsloth/DeepSeek-R1-Distill-Qwen-1.5B-GGUF/resolve/main/DeepSeek-R1-Distill-Qwen-1.5B-Q5_K_M.gguf" - } - ], - "id": "deepseek-r1-distill-qwen-1.5b", - "object": "model", - "name": "DeepSeek R1 Distill Qwen 1.5B Q5", - "version": "1.0", - "description": "DeepSeek-R1 is a cheaper and open-source model that excels at agentic reasoning, superior multilingual capabilities, large context windows, and generalization across domains.", - "format": "gguf", - "settings": { - "ctx_len": 131072, - "prompt_template": "<|User|> {prompt} <|Assistant|>", - "llama_model_path": "DeepSeek-R1-Distill-Qwen-1.5B-Q5_K_M.gguf", - "ngl": 29 - }, - "parameters": { - "temperature": 0.6, - "top_p": 0.95, - "stream": true, - "max_tokens": 131072, - "stop": [], - "frequency_penalty": 0, - "presence_penalty": 0 - }, - "metadata": { - "author": "DeepSeek", - "tags": ["1.5B", "Featured"], - "size": 1290000000 - }, - "engine": "llama-cpp" -} diff --git a/extensions/inference-cortex-extension/resources/models/deepseek-r1-distill-qwen-14b/model.json b/extensions/inference-cortex-extension/resources/models/deepseek-r1-distill-qwen-14b/model.json deleted file mode 100644 index 594ba6e41..000000000 --- a/extensions/inference-cortex-extension/resources/models/deepseek-r1-distill-qwen-14b/model.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "sources": [ - { - "filename": "DeepSeek-R1-Distill-Qwen-14B-Q4_K_M.gguf", - "url": "https://huggingface.co/unsloth/DeepSeek-R1-Distill-Qwen-14B-GGUF/resolve/main/DeepSeek-R1-Distill-Qwen-14B-Q4_K_M.gguf" - } - ], - "id": "deepseek-r1-distill-qwen-14b", - "object": "model", - "name": "DeepSeek R1 Distill Qwen 14B Q4", - "version": "1.0", - "description": "DeepSeek-R1 is a cheaper and open-source model that excels at agentic reasoning, superior multilingual capabilities, large context windows, and generalization across domains.", - "format": "gguf", - "settings": { - "ctx_len": 131072, - "prompt_template": "<|User|> {prompt} <|Assistant|>", - "llama_model_path": "DeepSeek-R1-Distill-Qwen-14B-Q4_K_M.gguf", - "ngl": 49 - }, - "parameters": { - "temperature": 0.6, - "top_p": 0.95, - "stream": true, - "max_tokens": 131072, - "stop": [], - "frequency_penalty": 0, - "presence_penalty": 0 - }, - "metadata": { - "author": "DeepSeek", - "tags": ["14B", "Featured"], - "size": 8990000000 - }, - "engine": "llama-cpp" -} diff --git a/extensions/inference-cortex-extension/resources/models/deepseek-r1-distill-qwen-32b/model.json b/extensions/inference-cortex-extension/resources/models/deepseek-r1-distill-qwen-32b/model.json deleted file mode 100644 index 6d7f5accf..000000000 --- a/extensions/inference-cortex-extension/resources/models/deepseek-r1-distill-qwen-32b/model.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "sources": [ - { - "filename": "DeepSeek-R1-Distill-Qwen-32B-Q4_K_M.gguf", - "url": "https://huggingface.co/unsloth/DeepSeek-R1-Distill-Qwen-32B-GGUF/resolve/main/DeepSeek-R1-Distill-Qwen-32B-Q4_K_M.gguf" - } - ], - "id": "deepseek-r1-distill-qwen-32b", - "object": "model", - "name": "DeepSeek R1 Distill Qwen 32B Q4", - "version": "1.0", - "description": "DeepSeek-R1 is a cheaper and open-source model that excels at agentic reasoning, superior multilingual capabilities, large context windows, and generalization across domains.", - "format": "gguf", - "settings": { - "ctx_len": 131072, - "prompt_template": "<|User|> {prompt} <|Assistant|>", - "llama_model_path": "DeepSeek-R1-Distill-Qwen-32B-Q4_K_M.gguf", - "ngl": 65 - }, - "parameters": { - "temperature": 0.6, - "top_p": 0.95, - "stream": true, - "max_tokens": 131072, - "stop": [], - "frequency_penalty": 0, - "presence_penalty": 0 - }, - "metadata": { - "author": "DeepSeek", - "tags": ["32B", "Featured"], - "size": 19900000000 - }, - "engine": "llama-cpp" -} diff --git a/extensions/inference-cortex-extension/resources/models/deepseek-r1-distill-qwen-7b/model.json b/extensions/inference-cortex-extension/resources/models/deepseek-r1-distill-qwen-7b/model.json deleted file mode 100644 index eae53cf0e..000000000 --- a/extensions/inference-cortex-extension/resources/models/deepseek-r1-distill-qwen-7b/model.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "sources": [ - { - "filename": "DeepSeek-R1-Distill-Qwen-7B-Q5_K_M.gguf", - "url": "https://huggingface.co/unsloth/DeepSeek-R1-Distill-Qwen-7B-GGUF/resolve/main/DeepSeek-R1-Distill-Qwen-7B-Q5_K_M.gguf" - } - ], - "id": "deepseek-r1-distill-qwen-7b", - "object": "model", - "name": "DeepSeek R1 Distill Qwen 7B Q5", - "version": "1.0", - "description": "DeepSeek-R1 is a cheaper and open-source model that excels at agentic reasoning, superior multilingual capabilities, large context windows, and generalization across domains.", - "format": "gguf", - "settings": { - "ctx_len": 131072, - "prompt_template": "<|User|> {prompt} <|Assistant|>", - "llama_model_path": "DeepSeek-R1-Distill-Qwen-7B-Q5_K_M.gguf", - "ngl": 29 - }, - "parameters": { - "temperature": 0.6, - "top_p": 0.95, - "stream": true, - "max_tokens": 131072, - "stop": [], - "frequency_penalty": 0, - "presence_penalty": 0 - }, - "metadata": { - "author": "DeepSeek", - "tags": ["7B", "Featured"], - "size": 5440000000 - }, - "engine": "llama-cpp" -} diff --git a/extensions/inference-cortex-extension/resources/models/gemma-1.1-2b/model.json b/extensions/inference-cortex-extension/resources/models/gemma-1.1-2b/model.json deleted file mode 100644 index 3278c9a81..000000000 --- a/extensions/inference-cortex-extension/resources/models/gemma-1.1-2b/model.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "sources": [ - { - "filename": "gemma-1.1-2b-it-Q4_K_M.gguf", - "url": "https://huggingface.co/bartowski/gemma-1.1-2b-it-GGUF/resolve/main/gemma-1.1-2b-it-Q4_K_M.gguf" - } - ], - "id": "gemma-1.1-2b-it", - "object": "model", - "name": "Gemma 1.1 2B Q4", - "version": "1.3", - "description": "Gemma is built from the same technology with Google's Gemini.", - "format": "gguf", - "settings": { - "ctx_len": 8192, - "prompt_template": "user\n{prompt}\nmodel", - "llama_model_path": "gemma-1.1-2b-it-Q4_K_M.gguf", - "ngl": 19 - }, - "parameters": { - "temperature": 0.7, - "top_p": 0.95, - "stream": true, - "max_tokens": 8192, - "stop": [""], - "frequency_penalty": 0, - "presence_penalty": 0 - }, - "metadata": { - "author": "Google", - "tags": ["2B", "Finetuned", "Tiny"], - "size": 1630000000 - }, - "engine": "llama-cpp" -} diff --git a/extensions/inference-cortex-extension/resources/models/gemma-1.1-7b/model.json b/extensions/inference-cortex-extension/resources/models/gemma-1.1-7b/model.json deleted file mode 100644 index 9a57f9b37..000000000 --- a/extensions/inference-cortex-extension/resources/models/gemma-1.1-7b/model.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "sources": [ - { - "filename": "gemma-1.1-7b-it-Q4_K_M.gguf", - "url": "https://huggingface.co/bartowski/gemma-1.1-7b-it-GGUF/resolve/main/gemma-1.1-7b-it-Q4_K_M.gguf" - } - ], - "id": "gemma-1.1-7b-it", - "object": "model", - "name": "Gemma 1.1 7B Q4", - "version": "1.3", - "description": "Google's Gemma is built for multilingual purpose", - "format": "gguf", - "settings": { - "ctx_len": 8192, - "prompt_template": "user\n{prompt}\nmodel", - "llama_model_path": "gemma-1.1-7b-it-Q4_K_M.gguf", - "ngl": 29 - }, - "parameters": { - "temperature": 0.7, - "top_p": 0.95, - "stream": true, - "max_tokens": 8192, - "stop": [], - "frequency_penalty": 0, - "presence_penalty": 0 - }, - "metadata": { - "author": "Google", - "tags": ["7B", "Finetuned"], - "size": 5330000000 - }, - "engine": "llama-cpp" -} diff --git a/extensions/inference-cortex-extension/resources/models/gemma-2-27b/model.json b/extensions/inference-cortex-extension/resources/models/gemma-2-27b/model.json deleted file mode 100644 index 66eaff7c2..000000000 --- a/extensions/inference-cortex-extension/resources/models/gemma-2-27b/model.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "sources": [ - { - "filename": "gemma-2-27b-it-Q4_K_M.gguf", - "url": "https://huggingface.co/bartowski/gemma-2-27b-it-GGUF/resolve/main/gemma-2-27b-it-Q4_K_M.gguf" - } - ], - "id": "gemma-2-27b-it", - "object": "model", - "name": "Gemma 2 27B Q4", - "version": "1.1", - "description": "Gemma is built from the same technology with Google's Gemini.", - "format": "gguf", - "settings": { - "ctx_len": 8192, - "prompt_template": "user\n{prompt}\nmodel\n\nmodel\n", - "llama_model_path": "gemma-2-27b-it-Q4_K_M.gguf", - "ngl": 47 - }, - "parameters": { - "temperature": 0.7, - "top_p": 0.95, - "stream": true, - "max_tokens": 8192, - "stop": [ - "" - ], - "frequency_penalty": 0, - "presence_penalty": 0 - }, - "metadata": { - "author": "Google", - "tags": [ - "27B", - "Conversational", - "Text-generation" - ], - "size": 16600000000 - }, - "engine": "llama-cpp" -} diff --git a/extensions/inference-cortex-extension/resources/models/gemma-2-2b/model.json b/extensions/inference-cortex-extension/resources/models/gemma-2-2b/model.json deleted file mode 100644 index 60be558b8..000000000 --- a/extensions/inference-cortex-extension/resources/models/gemma-2-2b/model.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "sources": [ - { - "filename": "gemma-2-2b-it-Q4_K_M.gguf", - "url": "https://huggingface.co/bartowski/gemma-2-2b-it-GGUF/resolve/main/gemma-2-2b-it-Q4_K_M.gguf" - } - ], - "id": "gemma-2-2b-it", - "object": "model", - "name": "Gemma 2 2B Q4", - "version": "1.1", - "description": "Gemma is built from the same technology with Google's Gemini.", - "format": "gguf", - "settings": { - "ctx_len": 8192, - "prompt_template": "user\n{prompt}\nmodel\n\nmodel\n", - "llama_model_path": "gemma-2-2b-it-Q4_K_M.gguf", - "ngl": 27 - }, - "parameters": { - "temperature": 0.7, - "top_p": 0.95, - "stream": true, - "max_tokens": 8192, - "stop": [ - "" - ], - "frequency_penalty": 0, - "presence_penalty": 0 - }, - "metadata": { - "author": "Google", - "tags": [ - "2B", - "Tiny", - "Conversational", - "Text-generation" - ], - "size": 1710000000 - }, - "engine": "llama-cpp" -} diff --git a/extensions/inference-cortex-extension/resources/models/gemma-2-9b/model.json b/extensions/inference-cortex-extension/resources/models/gemma-2-9b/model.json deleted file mode 100644 index 67acaad09..000000000 --- a/extensions/inference-cortex-extension/resources/models/gemma-2-9b/model.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "sources": [ - { - "filename": "gemma-2-9b-it-Q4_K_M.gguf", - "url": "https://huggingface.co/bartowski/gemma-2-9b-it-GGUF/resolve/main/gemma-2-9b-it-Q4_K_M.gguf" - } - ], - "id": "gemma-2-9b-it", - "object": "model", - "name": "Gemma 2 9B Q4", - "version": "1.1", - "description": "Gemma is built from the same technology with Google's Gemini.", - "format": "gguf", - "settings": { - "ctx_len": 8192, - "prompt_template": "user\n{prompt}\nmodel\n\nmodel\n", - "llama_model_path": "gemma-2-9b-it-Q4_K_M.gguf", - "ngl": 43 - }, - "parameters": { - "temperature": 0.7, - "top_p": 0.95, - "stream": true, - "max_tokens": 8192, - "stop": [ - "" - ], - "frequency_penalty": 0, - "presence_penalty": 0 - }, - "metadata": { - "author": "Google", - "tags": [ - "9B", - "Conversational", - "Text-generation" - ], - "size": 5760000000 - }, - "engine": "llama-cpp" -} diff --git a/extensions/inference-cortex-extension/resources/models/llama2-chat-70b/model.json b/extensions/inference-cortex-extension/resources/models/llama2-chat-70b/model.json deleted file mode 100644 index c91a0a73b..000000000 --- a/extensions/inference-cortex-extension/resources/models/llama2-chat-70b/model.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "sources": [ - { - "filename": "llama-2-70b-chat.Q4_K_M.gguf", - "url": "https://huggingface.co/TheBloke/Llama-2-70B-Chat-GGUF/resolve/main/llama-2-70b-chat.Q4_K_M.gguf" - } - ], - "id": "llama2-chat-70b", - "object": "model", - "name": "Llama 2 Chat 70B Q4", - "version": "1.1", - "description": "Llama 2 specifically designed for a comprehensive understanding the world.", - "format": "gguf", - "settings": { - "ctx_len": 4096, - "prompt_template": "[INST] <>\n{system_message}<>\n{prompt}[/INST]", - "llama_model_path": "llama-2-70b-chat.Q4_K_M.gguf", - "ngl": 81 - }, - "parameters": { - "temperature": 0.7, - "top_p": 0.95, - "stream": true, - "max_tokens": 4096, - "stop": [], - "frequency_penalty": 0, - "presence_penalty": 0 - }, - "metadata": { - "author": "MetaAI", - "tags": ["70B", "Foundational Model"], - "size": 43920000000 - }, - "engine": "llama-cpp" -} diff --git a/extensions/inference-cortex-extension/resources/models/llama2-chat-7b/model.json b/extensions/inference-cortex-extension/resources/models/llama2-chat-7b/model.json deleted file mode 100644 index 4a28f6004..000000000 --- a/extensions/inference-cortex-extension/resources/models/llama2-chat-7b/model.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "sources": [ - { - "filename": "llama-2-7b-chat.Q4_K_M.gguf", - "url": "https://huggingface.co/TheBloke/Llama-2-7B-Chat-GGUF/resolve/main/llama-2-7b-chat.Q4_K_M.gguf" - } - ], - "id": "llama2-chat-7b", - "object": "model", - "name": "Llama 2 Chat 7B Q4", - "version": "1.1", - "description": "Llama 2 specifically designed for a comprehensive understanding the world.", - "format": "gguf", - "settings": { - "ctx_len": 4096, - "prompt_template": "[INST] <>\n{system_message}<>\n{prompt}[/INST]", - "llama_model_path": "llama-2-7b-chat.Q4_K_M.gguf", - "ngl": 33 - }, - "parameters": { - "temperature": 0.7, - "top_p": 0.95, - "stream": true, - "max_tokens": 4096, - "stop": [], - "frequency_penalty": 0, - "presence_penalty": 0 - }, - "metadata": { - "author": "MetaAI", - "tags": ["7B", "Foundational Model"], - "size": 4080000000 - }, - "engine": "llama-cpp" -} diff --git a/extensions/inference-cortex-extension/resources/models/llama3-8b-instruct/model.json b/extensions/inference-cortex-extension/resources/models/llama3-8b-instruct/model.json deleted file mode 100644 index 3456a185e..000000000 --- a/extensions/inference-cortex-extension/resources/models/llama3-8b-instruct/model.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "sources": [ - { - "filename": "Meta-Llama-3-8B-Instruct-Q4_K_M.gguf", - "url": "https://huggingface.co/bartowski/Meta-Llama-3-8B-Instruct-GGUF/resolve/main/Meta-Llama-3-8B-Instruct-Q4_K_M.gguf" - } - ], - "id": "llama3-8b-instruct", - "object": "model", - "name": "Llama 3 8B Instruct Q4", - "version": "1.4", - "description": "Meta's Llama 3 excels at general usage situations, including chat, general world knowledge, and coding.", - "format": "gguf", - "settings": { - "ctx_len": 8192, - "prompt_template": "<|begin_of_text|><|start_header_id|>system<|end_header_id|>\n\n{system_message}<|eot_id|><|start_header_id|>user<|end_header_id|>\n\n{prompt}<|eot_id|><|start_header_id|>assistant<|end_header_id|>\n\n", - "llama_model_path": "Meta-Llama-3-8B-Instruct-Q4_K_M.gguf", - "ngl": 33 - }, - "parameters": { - "temperature": 0.7, - "top_p": 0.95, - "stream": true, - "max_tokens": 8192, - "stop": ["<|end_of_text|>","<|eot_id|>"], - "frequency_penalty": 0, - "presence_penalty": 0 - }, - "metadata": { - "author": "MetaAI", - "tags": ["8B"], - "size": 4920000000 - }, - "engine": "llama-cpp" -} diff --git a/extensions/inference-cortex-extension/resources/models/llama3-hermes-8b/model.json b/extensions/inference-cortex-extension/resources/models/llama3-hermes-8b/model.json deleted file mode 100644 index 718629fb0..000000000 --- a/extensions/inference-cortex-extension/resources/models/llama3-hermes-8b/model.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "sources": [ - { - "filename": "Hermes-2-Pro-Llama-3-8B-Q4_K_M.gguf", - "url": "https://huggingface.co/NousResearch/Hermes-2-Pro-Llama-3-8B-GGUF/resolve/main/Hermes-2-Pro-Llama-3-8B-Q4_K_M.gguf" - } - ], - "id": "llama3-hermes-8b", - "object": "model", - "name": "Hermes Pro Llama 3 8B Q4", - "version": "1.2", - "description": "Hermes Pro is well-designed for General chat and JSON output.", - "format": "gguf", - "settings": { - "ctx_len": 8192, - "prompt_template": "<|im_start|>system\n{system_message}<|im_end|>\n<|im_start|>user\n{prompt}<|im_end|>\n<|im_start|>assistant", - "llama_model_path": "Hermes-2-Pro-Llama-3-8B-Q4_K_M.gguf", - "ngl": 33 - }, - "parameters": { - "temperature": 0.7, - "top_p": 0.95, - "stream": true, - "max_tokens": 8192, - "stop": [], - "frequency_penalty": 0, - "presence_penalty": 0 - }, - "metadata": { - "author": "NousResearch", - "tags": [ - "7B", - "Finetuned" - ], - "size": 4920000000 - }, - "engine": "llama-cpp" - } diff --git a/extensions/inference-cortex-extension/resources/models/llama3.1-70b-instruct/model.json b/extensions/inference-cortex-extension/resources/models/llama3.1-70b-instruct/model.json deleted file mode 100644 index aec73719e..000000000 --- a/extensions/inference-cortex-extension/resources/models/llama3.1-70b-instruct/model.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "sources": [ - { - "filename": "Meta-Llama-3.1-70B-Instruct-Q4_K_M.gguf", - "url": "https://huggingface.co/bartowski/Meta-Llama-3.1-70B-Instruct-GGUF/resolve/main/Meta-Llama-3.1-70B-Instruct-Q4_K_M.gguf" - } - ], - "id": "llama3.1-70b-instruct", - "object": "model", - "name": "Llama 3.1 70B Instruct Q4", - "version": "1.2", - "description": "Meta's Llama 3.1 excels at general usage situations, including chat, general world knowledge, and coding.", - "format": "gguf", - "settings": { - "ctx_len": 131072, - "prompt_template": "<|begin_of_text|><|start_header_id|>system<|end_header_id|>\n\n{system_message}<|eot_id|><|start_header_id|>user<|end_header_id|>\n\n{prompt}<|eot_id|><|start_header_id|>assistant<|end_header_id|>\n\n", - "llama_model_path": "Meta-Llama-3.1-70B-Instruct-Q4_K_M.gguf", - "ngl": 33 - }, - "parameters": { - "temperature": 0.7, - "top_p": 0.95, - "stream": true, - "max_tokens": 8192, - "stop": [ - "<|end_of_text|>", - "<|eot_id|>", - "<|eom_id|>" - ], - "frequency_penalty": 0, - "presence_penalty": 0 - }, - "metadata": { - "author": "MetaAI", - "tags": [ - "70B" - ], - "size": 42500000000 - }, - "engine": "llama-cpp" -} diff --git a/extensions/inference-cortex-extension/resources/models/llama3.1-8b-instruct/model.json b/extensions/inference-cortex-extension/resources/models/llama3.1-8b-instruct/model.json deleted file mode 100644 index 1aeb80450..000000000 --- a/extensions/inference-cortex-extension/resources/models/llama3.1-8b-instruct/model.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "sources": [ - { - "filename": "Meta-Llama-3.1-8B-Instruct-Q4_K_M.gguf", - "url": "https://huggingface.co/bartowski/Meta-Llama-3.1-8B-Instruct-GGUF/resolve/main/Meta-Llama-3.1-8B-Instruct-Q4_K_M.gguf" - } - ], - "id": "llama3.1-8b-instruct", - "object": "model", - "name": "Llama 3.1 8B Instruct Q4", - "version": "1.2", - "description": "Meta's Llama 3.1 excels at general usage situations, including chat, general world knowledge, and coding.", - "format": "gguf", - "settings": { - "ctx_len": 131072, - "prompt_template": "<|begin_of_text|><|start_header_id|>system<|end_header_id|>\n\n{system_message}<|eot_id|><|start_header_id|>user<|end_header_id|>\n\n{prompt}<|eot_id|><|start_header_id|>assistant<|end_header_id|>\n\n", - "llama_model_path": "Meta-Llama-3.1-8B-Instruct.Q4_K_M.gguf", - "ngl": 33 - }, - "parameters": { - "temperature": 0.7, - "top_p": 0.95, - "stream": true, - "max_tokens": 8192, - "stop": ["<|end_of_text|>", "<|eot_id|>", "<|eom_id|>"], - "frequency_penalty": 0, - "presence_penalty": 0 - }, - "metadata": { - "author": "MetaAI", - "tags": ["8B", "Featured"], - "size": 4920000000 - }, - "engine": "llama-cpp" -} diff --git a/extensions/inference-cortex-extension/resources/models/llama3.2-1b-instruct/model.json b/extensions/inference-cortex-extension/resources/models/llama3.2-1b-instruct/model.json deleted file mode 100644 index 0fe7d3316..000000000 --- a/extensions/inference-cortex-extension/resources/models/llama3.2-1b-instruct/model.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "sources": [ - { - "filename": "Llama-3.2-1B-Instruct-Q8_0.gguf", - "url": "https://huggingface.co/bartowski/Llama-3.2-1B-Instruct-GGUF/resolve/main/Llama-3.2-1B-Instruct-Q8_0.gguf" - } - ], - "id": "llama3.2-1b-instruct", - "object": "model", - "name": "Llama 3.2 1B Instruct Q8", - "version": "1.0", - "description": "Meta's Llama 3.2 excels at general usage situations, including chat, general world knowledge, and coding.", - "format": "gguf", - "settings": { - "ctx_len": 131072, - "prompt_template": "<|begin_of_text|><|start_header_id|>system<|end_header_id|>\n\n{system_message}<|eot_id|><|start_header_id|>user<|end_header_id|>\n\n{prompt}<|eot_id|><|start_header_id|>assistant<|end_header_id|>\n\n", - "llama_model_path": "Llama-3.2-1B-Instruct-Q8_0.gguf", - "ngl": 33 - }, - "parameters": { - "temperature": 0.7, - "top_p": 0.95, - "stream": true, - "max_tokens": 8192, - "stop": ["<|end_of_text|>", "<|eot_id|>", "<|eom_id|>"], - "frequency_penalty": 0, - "presence_penalty": 0 - }, - "metadata": { - "author": "MetaAI", - "tags": ["1B", "Featured"], - "size": 1320000000 - }, - "engine": "llama-cpp" -} diff --git a/extensions/inference-cortex-extension/resources/models/llama3.2-3b-instruct/model.json b/extensions/inference-cortex-extension/resources/models/llama3.2-3b-instruct/model.json deleted file mode 100644 index 299362fbf..000000000 --- a/extensions/inference-cortex-extension/resources/models/llama3.2-3b-instruct/model.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "sources": [ - { - "filename": "Llama-3.2-3B-Instruct-Q8_0.gguf", - "url": "https://huggingface.co/bartowski/Llama-3.2-3B-Instruct-GGUF/resolve/main/Llama-3.2-3B-Instruct-Q8_0.gguf" - } - ], - "id": "llama3.2-3b-instruct", - "object": "model", - "name": "Llama 3.2 3B Instruct Q8", - "version": "1.0", - "description": "Meta's Llama 3.2 excels at general usage situations, including chat, general world knowledge, and coding.", - "format": "gguf", - "settings": { - "ctx_len": 131072, - "prompt_template": "<|begin_of_text|><|start_header_id|>system<|end_header_id|>\n\n{system_message}<|eot_id|><|start_header_id|>user<|end_header_id|>\n\n{prompt}<|eot_id|><|start_header_id|>assistant<|end_header_id|>\n\n", - "llama_model_path": "Llama-3.2-3B-Instruct-Q8_0.gguf", - "ngl": 33 - }, - "parameters": { - "temperature": 0.7, - "top_p": 0.95, - "stream": true, - "max_tokens": 8192, - "stop": ["<|end_of_text|>", "<|eot_id|>", "<|eom_id|>"], - "frequency_penalty": 0, - "presence_penalty": 0 - }, - "metadata": { - "author": "MetaAI", - "tags": ["3B", "Featured"], - "size": 3420000000 - }, - "engine": "llama-cpp" -} diff --git a/extensions/inference-cortex-extension/resources/models/llamacorn-1.1b/model.json b/extensions/inference-cortex-extension/resources/models/llamacorn-1.1b/model.json deleted file mode 100644 index 3230df5b0..000000000 --- a/extensions/inference-cortex-extension/resources/models/llamacorn-1.1b/model.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "sources": [ - { - "url":"https://huggingface.co/janhq/llamacorn-1.1b-chat-GGUF/resolve/main/llamacorn-1.1b-chat.Q8_0.gguf", - "filename": "llamacorn-1.1b-chat.Q8_0.gguf" - } - ], - "id": "llamacorn-1.1b", - "object": "model", - "name": "LlamaCorn 1.1B Q8", - "version": "1.1", - "description": "LlamaCorn is designed to improve chat functionality from TinyLlama.", - "format": "gguf", - "settings": { - "ctx_len": 2048, - "prompt_template": "<|im_start|>system\n{system_message}<|im_end|>\n<|im_start|>user\n{prompt}<|im_end|>\n<|im_start|>assistant", - "llama_model_path": "llamacorn-1.1b-chat.Q8_0.gguf", - "ngl": 23 - }, - "parameters": { - "temperature": 0.7, - "top_p": 0.95, - "stream": true, - "max_tokens": 2048, - "stop": [], - "frequency_penalty": 0, - "presence_penalty": 0 - }, - "metadata": { - "author": "Jan", - "tags": [ - "Tiny", - "Finetuned" - ], - "size": 1170000000 - }, - "engine": "llama-cpp" - } \ No newline at end of file diff --git a/extensions/inference-cortex-extension/resources/models/llava-13b/model.json b/extensions/inference-cortex-extension/resources/models/llava-13b/model.json deleted file mode 100644 index fe058e259..000000000 --- a/extensions/inference-cortex-extension/resources/models/llava-13b/model.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "sources": [ - { - "filename": "llava-v1.6-vicuna-13b.Q4_K_M.gguf", - "url": "https://huggingface.co/cjpais/llava-v1.6-vicuna-13b-gguf/resolve/main/llava-v1.6-vicuna-13b.Q4_K_M.gguf" - }, - { - "filename": "mmproj-model-f16.gguf", - "url": "https://huggingface.co/cjpais/llava-v1.6-vicuna-13b-gguf/resolve/main/mmproj-model-f16.gguf" - } - ], - "id": "llava-13b", - "object": "model", - "name": "LlaVa 13B Q4", - "version": "1.2", - "description": "LlaVa can bring vision understanding to Jan", - "format": "gguf", - "settings": { - "vision_model": true, - "text_model": false, - "ctx_len": 4096, - "prompt_template": "\n### Instruction:\n{prompt}\n### Response:\n", - "llama_model_path": "llava-v1.6-vicuna-13b.Q4_K_M.gguf", - "mmproj": "mmproj-model-f16.gguf", - "ngl": 33 - }, - "parameters": { - "max_tokens": 4096, - "stop": [""] - }, - "metadata": { - "author": "liuhaotian", - "tags": ["Vision"], - "size": 7870000000 - }, - "engine": "llama-cpp" -} diff --git a/extensions/inference-cortex-extension/resources/models/llava-7b/model.json b/extensions/inference-cortex-extension/resources/models/llava-7b/model.json deleted file mode 100644 index 8e5cdf09f..000000000 --- a/extensions/inference-cortex-extension/resources/models/llava-7b/model.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "sources": [ - { - "filename": "llava-v1.6-mistral-7b.Q4_K_M.gguf", - "url": "https://huggingface.co/cjpais/llava-1.6-mistral-7b-gguf/resolve/main/llava-v1.6-mistral-7b.Q4_K_M.gguf" - }, - { - "filename": "mmproj-model-f16.gguf", - "url": "https://huggingface.co/cjpais/llava-1.6-mistral-7b-gguf/resolve/main/mmproj-model-f16.gguf" - } - ], - "id": "llava-7b", - "object": "model", - "name": "LlaVa 7B", - "version": "1.2", - "description": "LlaVa can bring vision understanding to Jan", - "format": "gguf", - "settings": { - "vision_model": true, - "text_model": false, - "ctx_len": 4096, - "prompt_template": "\n### Instruction:\n{prompt}\n### Response:\n", - "llama_model_path": "llava-v1.6-mistral-7b.Q4_K_M.gguf", - "mmproj": "mmproj-model-f16.gguf", - "ngl": 33 - }, - "parameters": { - "max_tokens": 4096, - "stop": [""] - }, - "metadata": { - "author": "liuhaotian", - "tags": ["Vision"], - "size": 4370000000 - }, - "engine": "llama-cpp" -} diff --git a/extensions/inference-cortex-extension/resources/models/mistral-ins-7b-q4/model.json b/extensions/inference-cortex-extension/resources/models/mistral-ins-7b-q4/model.json deleted file mode 100644 index 9b568e468..000000000 --- a/extensions/inference-cortex-extension/resources/models/mistral-ins-7b-q4/model.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "sources": [ - { - "filename": "Mistral-7B-Instruct-v0.3-Q4_K_M.gguf", - "url": "https://huggingface.co/bartowski/Mistral-7B-Instruct-v0.3-GGUF/resolve/main/Mistral-7B-Instruct-v0.3-Q4_K_M.gguf" - } - ], - "id": "mistral-ins-7b-q4", - "object": "model", - "name": "Mistral 7B Instruct Q4", - "version": "1.5", - "description": "Mistral 7B Instruct model, specifically designed for a comprehensive understanding of the world.", - "format": "gguf", - "settings": { - "ctx_len": 32768, - "prompt_template": "{system_message} [INST] {prompt} [/INST]", - "llama_model_path": "Mistral-7B-Instruct-v0.3-Q4_K_M.gguf", - "ngl": 33 - }, - "parameters": { - "temperature": 0.7, - "top_p": 0.95, - "stream": true, - "max_tokens": 32768, - "stop": ["[/INST]"], - "frequency_penalty": 0, - "presence_penalty": 0 - }, - "metadata": { - "author": "MistralAI", - "tags": ["7B", "Foundational Model"], - "size": 4370000000, - "cover": "https://raw.githubusercontent.com/janhq/jan/dev/models/mistral-ins-7b-q4/cover.png" - }, - "engine": "llama-cpp" -} diff --git a/extensions/inference-cortex-extension/resources/models/mixtral-8x7b-instruct/model.json b/extensions/inference-cortex-extension/resources/models/mixtral-8x7b-instruct/model.json deleted file mode 100644 index c711065ff..000000000 --- a/extensions/inference-cortex-extension/resources/models/mixtral-8x7b-instruct/model.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "sources": [ - { - "filename": "mixtral-8x7b-instruct-v0.1.Q4_K_M.gguf", - "url": "https://huggingface.co/TheBloke/Mixtral-8x7B-Instruct-v0.1-GGUF/resolve/main/mixtral-8x7b-instruct-v0.1.Q4_K_M.gguf" - } - ], - "id": "mixtral-8x7b-instruct", - "object": "model", - "name": "Mixtral 8x7B Instruct Q4", - "version": "1.1", - "description": "The Mixtral-8x7B is a pretrained generative Sparse Mixture of Experts. The Mixtral-8x7B outperforms 70B models on most benchmarks.", - "format": "gguf", - "settings": { - "ctx_len": 32768, - "prompt_template": "[INST] {prompt} [/INST]", - "llama_model_path": "mixtral-8x7b-instruct-v0.1.Q4_K_M.gguf", - "ngl": 100 - }, - "parameters": { - "temperature": 0.7, - "top_p": 0.95, - "stream": true, - "max_tokens": 32768, - "frequency_penalty": 0, - "presence_penalty": 0 - }, - "metadata": { - "author": "MistralAI, TheBloke", - "tags": ["70B", "Foundational Model"], - "size": 26440000000 - }, - "engine": "llama-cpp" -} diff --git a/extensions/inference-cortex-extension/resources/models/noromaid-7b/model.json b/extensions/inference-cortex-extension/resources/models/noromaid-7b/model.json deleted file mode 100644 index 1999035aa..000000000 --- a/extensions/inference-cortex-extension/resources/models/noromaid-7b/model.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "sources": [ - { - "filename": "Noromaid-7B-0.4-DPO.q4_k_m.gguf", - "url": "https://huggingface.co/NeverSleep/Noromaid-7B-0.4-DPO-GGUF/resolve/main/Noromaid-7B-0.4-DPO.q4_k_m.gguf" - } - ], - "id": "noromaid-7b", - "object": "model", - "name": "Noromaid 7B Q4", - "version": "1.2", - "description": "The Noromaid 7b model is designed for role-playing with human-like behavior.", - "format": "gguf", - "settings": { - "ctx_len": 32768, - "prompt_template": "<|im_start|>system\n{system_message}<|im_end|>\n<|im_start|>user\n{prompt}<|im_end|>\n<|im_start|>assistant", - "llama_model_path": "Noromaid-7B-0.4-DPO.q4_k_m.gguf", - "ngl": 33 - }, - "parameters": { - "temperature": 0.7, - "top_p": 0.95, - "stream": true, - "max_tokens": 32768, - "stop": [], - "frequency_penalty": 0, - "presence_penalty": 0 - }, - "metadata": { - "author": "NeverSleep", - "tags": ["7B", "Finetuned"], - "size": 4370000000 - }, - "engine": "llama-cpp" -} diff --git a/extensions/inference-cortex-extension/resources/models/openchat-3.5-7b/model.json b/extensions/inference-cortex-extension/resources/models/openchat-3.5-7b/model.json deleted file mode 100644 index 05371b69e..000000000 --- a/extensions/inference-cortex-extension/resources/models/openchat-3.5-7b/model.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "sources": [ - { - "filename": "openchat-3.5-0106.Q4_K_M.gguf", - "url": "https://huggingface.co/TheBloke/openchat-3.5-0106-GGUF/resolve/main/openchat-3.5-0106.Q4_K_M.gguf" - } - ], - "id": "openchat-3.5-7b", - "object": "model", - "name": "Openchat-3.5 7B Q4", - "version": "1.2", - "description": "The performance of Openchat surpasses ChatGPT-3.5 and Grok-1 across various benchmarks.", - "format": "gguf", - "settings": { - "ctx_len": 8192, - "prompt_template": "GPT4 Correct User: {prompt}<|end_of_turn|>GPT4 Correct Assistant:", - "llama_model_path": "openchat-3.5-0106.Q4_K_M.gguf", - "ngl": 33 - }, - "parameters": { - "temperature": 0.7, - "top_p": 0.95, - "stream": true, - "max_tokens": 8192, - "stop": ["<|end_of_turn|>"], - "frequency_penalty": 0, - "presence_penalty": 0 - }, - "metadata": { - "author": "Openchat", - "tags": ["Recommended", "7B", "Finetuned"], - "size": 4370000000 - }, - "engine": "llama-cpp" -} diff --git a/extensions/inference-cortex-extension/resources/models/phi3-3.8b/model.json b/extensions/inference-cortex-extension/resources/models/phi3-3.8b/model.json deleted file mode 100644 index 90aa50117..000000000 --- a/extensions/inference-cortex-extension/resources/models/phi3-3.8b/model.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "sources": [ - { - "url": "https://huggingface.co/bartowski/Phi-3-mini-4k-instruct-GGUF/resolve/main/Phi-3-mini-4k-instruct-Q4_K_M.gguf", - "filename": "Phi-3-mini-4k-instruct-Q4_K_M.gguf" - } - ], - "id": "phi3-3.8b", - "object": "model", - "name": "Phi-3 Mini Instruct Q4", - "version": "1.3", - "description": "Phi-3 Mini is Microsoft's newest, compact model designed for mobile use.", - "format": "gguf", - "settings": { - "ctx_len": 4096, - "prompt_template": "<|user|>\n{prompt}<|end|>\n<|assistant|>\n", - "llama_model_path": "Phi-3-mini-4k-instruct-Q4_K_M.gguf", - "ngl": 33 - }, - "parameters": { - "max_tokens": 4096, - "stop": ["<|end|>"], - "temperature": 0.7, - "top_p": 0.95, - "stream": true, - "frequency_penalty": 0, - "presence_penalty": 0 - }, - "metadata": { - "author": "Microsoft", - "tags": [ - "3B", - "Finetuned" - ], - "size": 2320000000 - }, - "engine": "llama-cpp" -} \ No newline at end of file diff --git a/extensions/inference-cortex-extension/resources/models/phi3-medium/model.json b/extensions/inference-cortex-extension/resources/models/phi3-medium/model.json deleted file mode 100644 index afce04952..000000000 --- a/extensions/inference-cortex-extension/resources/models/phi3-medium/model.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "sources": [ - { - "url": "https://huggingface.co/bartowski/Phi-3-mini-4k-instruct-GGUF/resolve/main/Phi-3-mini-4k-instruct-Q4_K_M.gguf", - "filename": "Phi-3-mini-4k-instruct-Q4_K_M.gguf" - } - ], - "id": "phi3-medium", - "object": "model", - "name": "Phi-3 Medium Instruct Q4", - "version": "1.4", - "description": "Phi-3 Medium is Microsoft's latest SOTA model.", - "format": "gguf", - "settings": { - "ctx_len": 128000, - "prompt_template": "<|user|> {prompt}<|end|><|assistant|>", - "llama_model_path": "Phi-3-mini-4k-instruct-Q4_K_M.gguf", - "ngl": 33 - }, - "parameters": { - "max_tokens": 128000, - "stop": ["<|end|>"], - "temperature": 0.7, - "top_p": 0.95, - "stream": true, - "frequency_penalty": 0, - "presence_penalty": 0 - }, - "metadata": { - "author": "Microsoft", - "tags": [ - "14B", - "Finetuned" - ], - "size": 8366000000 - }, - "engine": "llama-cpp" - } \ No newline at end of file diff --git a/extensions/inference-cortex-extension/resources/models/phind-34b/model.json b/extensions/inference-cortex-extension/resources/models/phind-34b/model.json deleted file mode 100644 index f6e302173..000000000 --- a/extensions/inference-cortex-extension/resources/models/phind-34b/model.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "sources": [ - { - "filename": "phind-codellama-34b-v2.Q5_K_M.gguf", - "url": "https://huggingface.co/TheBloke/Phind-CodeLlama-34B-v2-GGUF/resolve/main/phind-codellama-34b-v2.Q5_K_M.gguf" - } - ], - "id": "phind-34b", - "object": "model", - "name": "Phind 34B Q4", - "version": "1.3", - "description": "Phind 34B is the best Open-source coding model.", - "format": "gguf", - "settings": { - "ctx_len": 16384, - "prompt_template": "### System Prompt\n{system_message}\n### User Message\n{prompt}\n### Assistant", - "llama_model_path": "phind-codellama-34b-v2.Q4_K_M.gguf", - "ngl": 49 - }, - "parameters": { - "temperature": 0.7, - "top_p": 0.95, - "stream": true, - "max_tokens": 16384, - "stop": [], - "frequency_penalty": 0, - "presence_penalty": 0 - }, - "metadata": { - "author": "Phind", - "tags": ["34B", "Finetuned"], - "size": 20220000000 - }, - "engine": "llama-cpp" -} diff --git a/extensions/inference-cortex-extension/resources/models/qwen-7b/model.json b/extensions/inference-cortex-extension/resources/models/qwen-7b/model.json deleted file mode 100644 index be37cac0d..000000000 --- a/extensions/inference-cortex-extension/resources/models/qwen-7b/model.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "sources": [ - { - "filename": "qwen1_5-7b-chat-q4_k_m.gguf", - "url": "https://huggingface.co/Qwen/Qwen1.5-7B-Chat-GGUF/resolve/main/qwen1_5-7b-chat-q4_k_m.gguf" - } - ], - "id": "qwen-7b", - "object": "model", - "name": "Qwen Chat 7B Q4", - "version": "1.2", - "description": "Qwen is optimized at Chinese, ideal for everyday tasks.", - "format": "gguf", - "settings": { - "ctx_len": 32768, - "prompt_template": "<|im_start|>system\n{system_message}<|im_end|>\n<|im_start|>user\n{prompt}<|im_end|>\n<|im_start|>assistant", - "llama_model_path": "qwen1_5-7b-chat-q4_k_m.gguf", - "ngl": 33 - }, - "parameters": { - "temperature": 0.7, - "top_p": 0.95, - "stream": true, - "max_tokens": 32768, - "stop": [], - "frequency_penalty": 0, - "presence_penalty": 0 - }, - "metadata": { - "author": "Alibaba", - "tags": ["7B", "Finetuned"], - "size": 4770000000 - }, - "engine": "llama-cpp" -} diff --git a/extensions/inference-cortex-extension/resources/models/qwen2-7b/model.json b/extensions/inference-cortex-extension/resources/models/qwen2-7b/model.json deleted file mode 100644 index 210848a43..000000000 --- a/extensions/inference-cortex-extension/resources/models/qwen2-7b/model.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "sources": [ - { - "filename": "Qwen2-7B-Instruct-Q4_K_M.gguf", - "url": "https://huggingface.co/bartowski/Qwen2-7B-Instruct-GGUF/resolve/main/Qwen2-7B-Instruct-Q4_K_M.gguf" - } - ], - "id": "qwen2-7b", - "object": "model", - "name": "Qwen 2 7B Instruct Q4", - "version": "1.2", - "description": "Qwen is optimized at Chinese, ideal for everyday tasks.", - "format": "gguf", - "settings": { - "ctx_len": 32768, - "prompt_template": "<|im_start|>system\n{system_message}<|im_end|>\n<|im_start|>user\n{prompt}<|im_end|>\n<|im_start|>assistant", - "llama_model_path": "Qwen2-7B-Instruct-Q4_K_M.gguf", - "ngl": 29 - }, - "parameters": { - "temperature": 0.7, - "top_p": 0.95, - "stream": true, - "max_tokens": 32768, - "stop": [], - "frequency_penalty": 0, - "presence_penalty": 0 - }, - "metadata": { - "author": "Alibaba", - "tags": ["7B", "Finetuned"], - "size": 4680000000 - }, - "engine": "llama-cpp" - } - \ No newline at end of file diff --git a/extensions/inference-cortex-extension/resources/models/qwen2.5-14b-instruct/model.json b/extensions/inference-cortex-extension/resources/models/qwen2.5-14b-instruct/model.json deleted file mode 100644 index 96e4d214c..000000000 --- a/extensions/inference-cortex-extension/resources/models/qwen2.5-14b-instruct/model.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "sources": [ - { - "filename": "Qwen2.5-14B-Instruct-Q4_K_M.gguf", - "url": "https://huggingface.co/bartowski/Qwen2.5-14B-Instruct-GGUF/resolve/main/Qwen2.5-14B-Instruct-Q4_K_M.gguf" - } - ], - "id": "qwen2.5-14b-instruct", - "object": "model", - "name": "Qwen2.5 14B Instruct Q4", - "version": "1.0", - "description": "The Qwen 2.5 family is specifically designed to excel in math, coding, and other computational tasks", - "format": "gguf", - "settings": { - "ctx_len": 32768, - "prompt_template": "<|im_start|>system\n{system_message}<|im_end|>\n<|im_start|>user\n{prompt}<|im_end|>\n<|im_start|>assistant", - "llama_model_path": "Qwen2.5-14B-Instruct-Q4_K_M.gguf", - "ngl": 49 - }, - "parameters": { - "temperature": 0.7, - "top_p": 0.95, - "stream": true, - "max_tokens": 32768, - "stop": ["<|endoftext|>", "<|im_end|>"], - "frequency_penalty": 0, - "presence_penalty": 0 - }, - "metadata": { - "author": "QwenLM", - "tags": ["14B", "Featured"], - "size": 8990000000 - }, - "engine": "llama-cpp" - } - \ No newline at end of file diff --git a/extensions/inference-cortex-extension/resources/models/qwen2.5-32b-instruct/model.json b/extensions/inference-cortex-extension/resources/models/qwen2.5-32b-instruct/model.json deleted file mode 100644 index 20681dff4..000000000 --- a/extensions/inference-cortex-extension/resources/models/qwen2.5-32b-instruct/model.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "sources": [ - { - "filename": "Qwen2.5-32B-Instruct-Q4_K_M.gguf", - "url": "https://huggingface.co/bartowski/Qwen2.5-32B-Instruct-GGUF/resolve/main/Qwen2.5-32B-Instruct-Q4_K_M.gguf" - } - ], - "id": "qwen2.5-32b-instruct", - "object": "model", - "name": "Qwen2.5 32B Instruct Q4", - "version": "1.0", - "description": "The Qwen 2.5 family is specifically designed to excel in math, coding, and other computational tasks", - "format": "gguf", - "settings": { - "ctx_len": 32768, - "prompt_template": "<|im_start|>system\n{system_message}<|im_end|>\n<|im_start|>user\n{prompt}<|im_end|>\n<|im_start|>assistant", - "llama_model_path": "Qwen2.5-32B-Instruct-Q4_K_M.gguf", - "ngl": 65 - }, - "parameters": { - "temperature": 0.7, - "top_p": 0.95, - "stream": true, - "max_tokens": 32768, - "stop": ["<|endoftext|>", "<|im_end|>"], - "frequency_penalty": 0, - "presence_penalty": 0 - }, - "metadata": { - "author": "QwenLM", - "tags": ["32B"], - "size": 19900000000 - }, - "engine": "llama-cpp" - } - \ No newline at end of file diff --git a/extensions/inference-cortex-extension/resources/models/qwen2.5-72b-instruct/model.json b/extensions/inference-cortex-extension/resources/models/qwen2.5-72b-instruct/model.json deleted file mode 100644 index b741539eb..000000000 --- a/extensions/inference-cortex-extension/resources/models/qwen2.5-72b-instruct/model.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "sources": [ - { - "filename": "Qwen2.5-72B-Instruct-Q4_K_M.gguf", - "url": "https://huggingface.co/bartowski/Qwen2.5-72B-Instruct-GGUF/resolve/main/Qwen2.5-72B-Instruct-Q4_K_M.gguf" - } - ], - "id": "qwen2.5-72b-instruct", - "object": "model", - "name": "Qwen2.5 72B Instruct Q4", - "version": "1.0", - "description": "The Qwen 2.5 family is specifically designed to excel in math, coding, and other computational tasks", - "format": "gguf", - "settings": { - "ctx_len": 32768, - "prompt_template": "<|im_start|>system\n{system_message}<|im_end|>\n<|im_start|>user\n{prompt}<|im_end|>\n<|im_start|>assistant", - "llama_model_path": "Qwen2.5-72B-Instruct-Q4_K_M.gguf", - "ngl": 81 - }, - "parameters": { - "temperature": 0.7, - "top_p": 0.95, - "stream": true, - "max_tokens": 32768, - "stop": ["<|endoftext|>", "<|im_end|>"], - "frequency_penalty": 0, - "presence_penalty": 0 - }, - "metadata": { - "author": "QwenLM", - "tags": ["72B"], - "size": 47400000000 - }, - "engine": "llama-cpp" - } - \ No newline at end of file diff --git a/extensions/inference-cortex-extension/resources/models/qwen2.5-7b-instruct/model.json b/extensions/inference-cortex-extension/resources/models/qwen2.5-7b-instruct/model.json deleted file mode 100644 index 6741aef64..000000000 --- a/extensions/inference-cortex-extension/resources/models/qwen2.5-7b-instruct/model.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "sources": [ - { - "filename": "Qwen2.5-7B-Instruct-Q4_K_M.gguf", - "url": "https://huggingface.co/bartowski/Qwen2.5-7B-Instruct-GGUF/resolve/main/Qwen2.5-7B-Instruct-Q4_K_M.gguf" - } - ], - "id": "qwen2.5-7b-instruct", - "object": "model", - "name": "Qwen2.5 7B Instruct Q4", - "version": "1.0", - "description": "The Qwen 2.5 family is specifically designed to excel in math, coding, and other computational tasks", - "format": "gguf", - "settings": { - "ctx_len": 32768, - "prompt_template": "<|im_start|>system\n{system_message}<|im_end|>\n<|im_start|>user\n{prompt}<|im_end|>\n<|im_start|>assistant", - "llama_model_path": "Qwen2.5-7B-Instruct-Q4_K_M.gguf", - "ngl": 29 - }, - "parameters": { - "temperature": 0.7, - "top_p": 0.95, - "stream": true, - "max_tokens": 32768, - "stop": ["<|endoftext|>", "<|im_end|>"], - "frequency_penalty": 0, - "presence_penalty": 0 - }, - "metadata": { - "author": "QwenLM", - "tags": ["7B", "Featured"], - "size": 4680000000 - }, - "engine": "llama-cpp" - } - \ No newline at end of file diff --git a/extensions/inference-cortex-extension/resources/models/qwen2.5-coder-14b-instruct/model.json b/extensions/inference-cortex-extension/resources/models/qwen2.5-coder-14b-instruct/model.json deleted file mode 100644 index a445ee2db..000000000 --- a/extensions/inference-cortex-extension/resources/models/qwen2.5-coder-14b-instruct/model.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "sources": [ - { - "filename": "Qwen2.5-Coder-14B-Instruct-Q4_K_M.gguf", - "url": "https://huggingface.co/bartowski/Qwen2.5-Coder-14B-Instruct-GGUF/resolve/main/Qwen2.5-Coder-14B-Instruct-Q4_K_M.gguf" - } - ], - "id": "qwen2.5-coder-14b-instruct", - "object": "model", - "name": "Qwen2.5 Coder 14B Instruct Q4", - "version": "1.0", - "description": "Qwen2.5-Coder is the latest series of Code-Specific Qwen large language models. Significantly improvements in code generation, code reasoning and code fixing.", - "format": "gguf", - "settings": { - "ctx_len": 32768, - "prompt_template": "<|im_start|>system\n{system_message}<|im_end|>\n<|im_start|>user\n{prompt}<|im_end|>\n<|im_start|>assistant", - "llama_model_path": "Qwen2.5-Coder-14B-Instruct-Q4_K_M.gguf", - "ngl": 29 - }, - "parameters": { - "temperature": 0.7, - "top_p": 0.95, - "stream": true, - "max_tokens": 32768, - "stop": ["<|endoftext|>", "<|im_end|>"], - "frequency_penalty": 0, - "presence_penalty": 0 - }, - "metadata": { - "author": "QwenLM", - "tags": ["14B", "Featured"], - "size": 8990000000 - }, - "engine": "llama-cpp" - } - \ No newline at end of file diff --git a/extensions/inference-cortex-extension/resources/models/qwen2.5-coder-32b-instruct/model.json b/extensions/inference-cortex-extension/resources/models/qwen2.5-coder-32b-instruct/model.json deleted file mode 100644 index cffdf03df..000000000 --- a/extensions/inference-cortex-extension/resources/models/qwen2.5-coder-32b-instruct/model.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "sources": [ - { - "filename": "Qwen2.5-Coder-32B-Instruct-Q4_K_M.gguf", - "url": "https://huggingface.co/bartowski/Qwen2.5-Coder-32B-Instruct-GGUF/resolve/main/Qwen2.5-Coder-32B-Instruct-Q4_K_M.gguf" - } - ], - "id": "qwen2.5-coder-32b-instruct", - "object": "model", - "name": "Qwen2.5 Coder 32B Instruct Q4", - "version": "1.0", - "description": "Qwen2.5-Coder is the latest series of Code-Specific Qwen large language models. Significantly improvements in code generation, code reasoning and code fixing.", - "format": "gguf", - "settings": { - "ctx_len": 32768, - "prompt_template": "<|im_start|>system\n{system_message}<|im_end|>\n<|im_start|>user\n{prompt}<|im_end|>\n<|im_start|>assistant", - "llama_model_path": "Qwen2.5-Coder-32B-Instruct-Q4_K_M.gguf", - "ngl": 29 - }, - "parameters": { - "temperature": 0.7, - "top_p": 0.95, - "stream": true, - "max_tokens": 32768, - "stop": ["<|endoftext|>", "<|im_end|>"], - "frequency_penalty": 0, - "presence_penalty": 0 - }, - "metadata": { - "author": "QwenLM", - "tags": ["32B", "Featured"], - "size": 19900000000 - }, - "engine": "llama-cpp" - } - \ No newline at end of file diff --git a/extensions/inference-cortex-extension/resources/models/qwen2.5-coder-7b-instruct/model.json b/extensions/inference-cortex-extension/resources/models/qwen2.5-coder-7b-instruct/model.json deleted file mode 100644 index 9162c8a43..000000000 --- a/extensions/inference-cortex-extension/resources/models/qwen2.5-coder-7b-instruct/model.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "sources": [ - { - "filename": "Qwen2.5-Coder-7B-Instruct-Q4_K_M.gguf", - "url": "https://huggingface.co/bartowski/Qwen2.5-Coder-7B-Instruct-GGUF/resolve/main/Qwen2.5-Coder-7B-Instruct-Q4_K_M.gguf" - } - ], - "id": "qwen2.5-coder-7b-instruct", - "object": "model", - "name": "Qwen2.5 Coder 7B Instruct Q4", - "version": "1.0", - "description": "Qwen2.5-Coder is the latest series of Code-Specific Qwen large language models. Significantly improvements in code generation, code reasoning and code fixing.", - "format": "gguf", - "settings": { - "ctx_len": 32768, - "prompt_template": "<|im_start|>system\n{system_message}<|im_end|>\n<|im_start|>user\n{prompt}<|im_end|>\n<|im_start|>assistant", - "llama_model_path": "Qwen2.5-Coder-7B-Instruct-Q4_K_M.gguf", - "ngl": 29 - }, - "parameters": { - "temperature": 0.7, - "top_p": 0.95, - "stream": true, - "max_tokens": 32768, - "stop": ["<|endoftext|>", "<|im_end|>"], - "frequency_penalty": 0, - "presence_penalty": 0 - }, - "metadata": { - "author": "QwenLM", - "tags": ["7B", "Featured"], - "size": 4680000000 - }, - "engine": "llama-cpp" - } - \ No newline at end of file diff --git a/extensions/inference-cortex-extension/resources/models/stable-zephyr-3b/model.json b/extensions/inference-cortex-extension/resources/models/stable-zephyr-3b/model.json deleted file mode 100644 index a6c84bd17..000000000 --- a/extensions/inference-cortex-extension/resources/models/stable-zephyr-3b/model.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "sources": [ - { - "url": "https://huggingface.co/TheBloke/stablelm-zephyr-3b-GGUF/resolve/main/stablelm-zephyr-3b.Q8_0.gguf", - "filename": "stablelm-zephyr-3b.Q8_0.gguf" - } - ], - "id": "stable-zephyr-3b", - "object": "model", - "name": "Stable Zephyr 3B Q8", - "version": "1.1", - "description": "StableLM Zephyr 3B is a best model for low-end machine.", - "format": "gguf", - "settings": { - "ctx_len": 4096, - "prompt_template": "<|user|>\n{prompt}<|endoftext|>\n<|assistant|>", - "llama_model_path": "stablelm-zephyr-3b.Q8_0.gguf", - "ngl": 33 - }, - "parameters": { - "temperature": 0.7, - "top_p": 0.95, - "stream": true, - "max_tokens": 4096, - "stop": ["<|endoftext|>"], - "frequency_penalty": 0, - "presence_penalty": 0 - }, - "metadata": { - "author": "StabilityAI", - "tags": ["3B", "Finetuned", "Tiny"], - "size": 2970000000 - }, - "engine": "llama-cpp" - } \ No newline at end of file diff --git a/extensions/inference-cortex-extension/resources/models/stealth-v1.2-7b/model.json b/extensions/inference-cortex-extension/resources/models/stealth-v1.2-7b/model.json deleted file mode 100644 index ffb32922e..000000000 --- a/extensions/inference-cortex-extension/resources/models/stealth-v1.2-7b/model.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "sources": [ - { - "filename": "stealth-v1.3.Q4_K_M.gguf", - "url": "https://huggingface.co/janhq/stealth-v1.3-GGUF/resolve/main/stealth-v1.3.Q4_K_M.gguf" - } - ], - "id": "stealth-v1.2-7b", - "object": "model", - "name": "Stealth 7B Q4", - "version": "1.2", - "description": "This is a new experimental family designed to enhance Mathematical and Logical abilities.", - "format": "gguf", - "settings": { - "ctx_len": 32768, - "prompt_template": "<|im_start|>system\n{system_message}<|im_end|>\n<|im_start|>user\n{prompt}<|im_end|>\n<|im_start|>assistant", - "llama_model_path": "stealth-v1.3.Q4_K_M.gguf", - "ngl": 33 - }, - "parameters": { - "temperature": 0.7, - "top_p": 0.95, - "stream": true, - "max_tokens": 32768, - "frequency_penalty": 0, - "presence_penalty": 0 - }, - "metadata": { - "author": "Jan", - "tags": ["7B", "Finetuned"], - "size": 4370000000 - }, - "engine": "llama-cpp" -} diff --git a/extensions/inference-cortex-extension/resources/models/tinyllama-1.1b/model.json b/extensions/inference-cortex-extension/resources/models/tinyllama-1.1b/model.json deleted file mode 100644 index b6aeea3e3..000000000 --- a/extensions/inference-cortex-extension/resources/models/tinyllama-1.1b/model.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "sources": [ - { - "filename": "tinyllama-1.1b-chat-v1.0.Q4_K_M.gguf", - "url": "https://huggingface.co/TheBloke/TinyLlama-1.1B-Chat-v1.0-GGUF/resolve/main/tinyllama-1.1b-chat-v1.0.Q4_K_M.gguf" - } - ], - "id": "tinyllama-1.1b", - "object": "model", - "name": "TinyLlama Chat 1.1B Q4", - "version": "1.1", - "description": "TinyLlama is a tiny model with only 1.1B. It's a good model for less powerful computers.", - "format": "gguf", - "settings": { - "ctx_len": 4096, - "prompt_template": "<|system|>\n{system_message}<|user|>\n{prompt}<|assistant|>", - "llama_model_path": "tinyllama-1.1b-chat-v1.0.Q4_K_M.gguf", - "ngl": 23 - }, - "parameters": { - "temperature": 0.7, - "top_p": 0.95, - "stream": true, - "max_tokens": 2048, - "stop": [], - "frequency_penalty": 0, - "presence_penalty": 0 - }, - "metadata": { - "author": "TinyLlama", - "tags": ["Tiny", "Foundation Model"], - "size": 669000000 - }, - "engine": "llama-cpp" -} diff --git a/extensions/inference-cortex-extension/resources/models/trinity-v1.2-7b/model.json b/extensions/inference-cortex-extension/resources/models/trinity-v1.2-7b/model.json deleted file mode 100644 index fae5d0ca5..000000000 --- a/extensions/inference-cortex-extension/resources/models/trinity-v1.2-7b/model.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "sources": [ - { - "filename": "trinity-v1.2.Q4_K_M.gguf", - "url": "https://huggingface.co/janhq/trinity-v1.2-GGUF/resolve/main/trinity-v1.2.Q4_K_M.gguf" - } - ], - "id": "trinity-v1.2-7b", - "object": "model", - "name": "Trinity-v1.2 7B Q4", - "version": "1.2", - "description": "Trinity is an experimental model merge using the Slerp method. Recommended for daily assistance purposes.", - "format": "gguf", - "settings": { - "ctx_len": 32768, - "prompt_template": "<|im_start|>system\n{system_message}<|im_end|>\n<|im_start|>user\n{prompt}<|im_end|>\n<|im_start|>assistant", - "llama_model_path": "trinity-v1.2.Q4_K_M.gguf", - "ngl": 33 - }, - "parameters": { - "temperature": 0.7, - "top_p": 0.95, - "stream": true, - "max_tokens": 32768, - "frequency_penalty": 0, - "presence_penalty": 0 - }, - "metadata": { - "author": "Jan", - "tags": ["7B", "Merged"], - "size": 4370000000, - "cover": "https://raw.githubusercontent.com/janhq/jan/dev/models/trinity-v1.2-7b/cover.png" - }, - "engine": "llama-cpp" -} diff --git a/extensions/inference-cortex-extension/resources/models/vistral-7b/model.json b/extensions/inference-cortex-extension/resources/models/vistral-7b/model.json deleted file mode 100644 index 46b6999a6..000000000 --- a/extensions/inference-cortex-extension/resources/models/vistral-7b/model.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "sources": [ - { - "filename": "vistral-7b-chat-dpo.Q4_K_M.gguf", - "url": "https://huggingface.co/janhq/vistral-7b-chat-dpo-GGUF/resolve/main/vistral-7b-chat-dpo.Q4_K_M.gguf" - } - ], - "id": "vistral-7b", - "object": "model", - "name": "Vistral 7B Q4", - "version": "1.2", - "description": "Vistral 7B has a deep understanding of Vietnamese.", - "format": "gguf", - "settings": { - "ctx_len": 32768, - "prompt_template": "[INST] <>\n{system_message}\n<>\n{prompt} [/INST]", - "llama_model_path": "vistral-7b-chat-dpo.Q4_K_M.gguf", - "ngl": 33 - }, - "parameters": { - "temperature": 0.7, - "top_p": 0.95, - "stream": true, - "max_tokens": 32768, - "stop": [], - "frequency_penalty": 0, - "presence_penalty": 0 - }, - "metadata": { - "author": "Viet Mistral, Jan", - "tags": ["7B", "Finetuned"], - "size": 4410000000 - }, - "engine": "llama-cpp" - } - \ No newline at end of file diff --git a/extensions/inference-cortex-extension/resources/models/wizardcoder-13b/model.json b/extensions/inference-cortex-extension/resources/models/wizardcoder-13b/model.json deleted file mode 100644 index cf39ad857..000000000 --- a/extensions/inference-cortex-extension/resources/models/wizardcoder-13b/model.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "sources": [ - { - "filename": "wizardcoder-python-13b-v1.0.Q4_K_M.gguf", - "url": "https://huggingface.co/TheBloke/WizardCoder-Python-13B-V1.0-GGUF/resolve/main/wizardcoder-python-13b-v1.0.Q4_K_M.gguf" - } - ], - "id": "wizardcoder-13b", - "object": "model", - "name": "Wizard Coder Python 13B Q4", - "version": "1.2", - "description": "WizardCoder 13B is a Python coding model. This model demonstrate high proficiency in specific domains like coding and mathematics.", - "format": "gguf", - "settings": { - "ctx_len": 16384, - "prompt_template": "### Instruction:\n{prompt}\n### Response:", - "llama_model_path": "wizardcoder-python-13b-v1.0.Q4_K_M.gguf", - "ngl": 41 - }, - "parameters": { - "temperature": 0.7, - "top_p": 0.95, - "stream": true, - "max_tokens": 16384, - "stop": [], - "frequency_penalty": 0, - "presence_penalty": 0 - }, - "metadata": { - "author": "WizardLM, The Bloke", - "tags": ["Recommended", "13B", "Finetuned"], - "size": 7870000000 - }, - "engine": "llama-cpp" -} diff --git a/extensions/inference-cortex-extension/resources/models/yi-34b/model.json b/extensions/inference-cortex-extension/resources/models/yi-34b/model.json deleted file mode 100644 index 4f56650d7..000000000 --- a/extensions/inference-cortex-extension/resources/models/yi-34b/model.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "sources": [ - { - "filename": "yi-34b-chat.Q4_K_M.gguf", - "url": "https://huggingface.co/TheBloke/Yi-34B-Chat-GGUF/resolve/main/yi-34b-chat.Q4_K_M.gguf" - } - ], - "id": "yi-34b", - "object": "model", - "name": "Yi 34B Q4", - "version": "1.1", - "description": "Yi-34B, a specialized chat model, is known for its diverse and creative responses and excels across various NLP tasks and benchmarks.", - "format": "gguf", - "settings": { - "ctx_len": 4096, - "prompt_template": "<|im_start|>system\n{system_message}<|im_end|>\n<|im_start|>user\n{prompt}<|im_end|>\n<|im_start|>assistant", - "llama_model_path": "yi-34b-chat.Q4_K_M.gguf", - "ngl": 61 - }, - "parameters": { - "temperature": 0.7, - "top_p": 0.95, - "stream": true, - "max_tokens": 4096, - "stop": [], - "frequency_penalty": 0, - "presence_penalty": 0 - }, - "metadata": { - "author": "01-ai, The Bloke", - "tags": ["34B", "Foundational Model"], - "size": 20660000000 - }, - "engine": "llama-cpp" -} diff --git a/extensions/inference-cortex-extension/rolldown.config.mjs b/extensions/inference-cortex-extension/rolldown.config.mjs index aebd8ac38..ef4c56c7b 100644 --- a/extensions/inference-cortex-extension/rolldown.config.mjs +++ b/extensions/inference-cortex-extension/rolldown.config.mjs @@ -1,60 +1,6 @@ import { defineConfig } from 'rolldown' import packageJson from './package.json' with { type: 'json' } import defaultSettingJson from './resources/default_settings.json' with { type: 'json' } -import bakllavaJson from './resources/models/bakllava-1/model.json' with { type: 'json' } -import codeninja7bJson from './resources/models/codeninja-1.0-7b/model.json' with { type: 'json' } -import commandr34bJson from './resources/models/command-r-34b/model.json' with { type: 'json' } -import deepseekCoder13bJson from './resources/models/deepseek-coder-1.3b/model.json' with { type: 'json' } -import deepseekCoder34bJson from './resources/models/deepseek-coder-34b/model.json' with { type: 'json' } -import gemma112bJson from './resources/models/gemma-1.1-2b/model.json' with { type: 'json' } -import gemma117bJson from './resources/models/gemma-1.1-7b/model.json' with { type: 'json' } -import llama2Chat70bJson from './resources/models/llama2-chat-70b/model.json' with { type: 'json' } -import llama2Chat7bJson from './resources/models/llama2-chat-7b/model.json' with { type: 'json' } -import llamacorn1bJson from './resources/models/llamacorn-1.1b/model.json' with { type: 'json' } -import llava13bJson from './resources/models/llava-13b/model.json' with { type: 'json' } -import llava7bJson from './resources/models/llava-7b/model.json' with { type: 'json' } -import mistralIns7bq4Json from './resources/models/mistral-ins-7b-q4/model.json' with { type: 'json' } -import mixtral8x7bInstructJson from './resources/models/mixtral-8x7b-instruct/model.json' with { type: 'json' } -import noromaid7bJson from './resources/models/noromaid-7b/model.json' with { type: 'json' } -import openchat357bJson from './resources/models/openchat-3.5-7b/model.json' with { type: 'json' } -import phi3bJson from './resources/models/phi3-3.8b/model.json' with { type: 'json' } -import phind34bJson from './resources/models/phind-34b/model.json' with { type: 'json' } -import qwen7bJson from './resources/models/qwen-7b/model.json' with { type: 'json' } -import stableZephyr3bJson from './resources/models/stable-zephyr-3b/model.json' with { type: 'json' } -import stealthv127bJson from './resources/models/stealth-v1.2-7b/model.json' with { type: 'json' } -import tinyllama11bJson from './resources/models/tinyllama-1.1b/model.json' with { type: 'json' } -import trinityv127bJson from './resources/models/trinity-v1.2-7b/model.json' with { type: 'json' } -import vistral7bJson from './resources/models/vistral-7b/model.json' with { type: 'json' } -import wizardcoder13bJson from './resources/models/wizardcoder-13b/model.json' with { type: 'json' } -import yi34bJson from './resources/models/yi-34b/model.json' with { type: 'json' } -import llama3Json from './resources/models/llama3-8b-instruct/model.json' with { type: 'json' } -import llama3Hermes8bJson from './resources/models/llama3-hermes-8b/model.json' with { type: 'json' } -import aya8bJson from './resources/models/aya-23-8b/model.json' with { type: 'json' } -import aya35bJson from './resources/models/aya-23-35b/model.json' with { type: 'json' } -import phimediumJson from './resources/models/phi3-medium/model.json' with { type: 'json' } -import codestralJson from './resources/models/codestral-22b/model.json' with { type: 'json' } -import qwen2Json from './resources/models/qwen2-7b/model.json' with { type: 'json' } -import llama318bJson from './resources/models/llama3.1-8b-instruct/model.json' with { type: 'json' } -import llama3170bJson from './resources/models/llama3.1-70b-instruct/model.json' with { type: 'json' } -import gemma22bJson from './resources/models/gemma-2-2b/model.json' with { type: 'json' } -import gemma29bJson from './resources/models/gemma-2-9b/model.json' with { type: 'json' } -import gemma227bJson from './resources/models/gemma-2-27b/model.json' with { type: 'json' } -import llama321bJson from './resources/models/llama3.2-1b-instruct/model.json' with { type: 'json' } -import llama323bJson from './resources/models/llama3.2-3b-instruct/model.json' with { type: 'json' } -import qwen257bJson from './resources/models/qwen2.5-7b-instruct/model.json' with { type: 'json' } -import qwen25coder7bJson from './resources/models/qwen2.5-coder-7b-instruct/model.json' with { type: 'json' } -import qwen25coder14bJson from './resources/models/qwen2.5-coder-14b-instruct/model.json' with { type: 'json' } -import qwen25coder32bJson from './resources/models/qwen2.5-coder-32b-instruct/model.json' with { type: 'json' } -import qwen2514bJson from './resources/models/qwen2.5-14b-instruct/model.json' with { type: 'json' } -import qwen2532bJson from './resources/models/qwen2.5-32b-instruct/model.json' with { type: 'json' } -import qwen2572bJson from './resources/models/qwen2.5-72b-instruct/model.json' with { type: 'json' } - -import deepseekR1DistillQwen_1_5b from './resources/models/deepseek-r1-distill-qwen-1.5b/model.json' with { type: 'json' } -import deepseekR1DistillQwen_7b from './resources/models/deepseek-r1-distill-qwen-7b/model.json' with { type: 'json' } -import deepseekR1DistillQwen_14b from './resources/models/deepseek-r1-distill-qwen-14b/model.json' with { type: 'json' } -import deepseekR1DistillQwen_32b from './resources/models/deepseek-r1-distill-qwen-32b/model.json' with { type: 'json' } -import deepseekR1DistillLlama_8b from './resources/models/deepseek-r1-distill-llama-8b/model.json' with { type: 'json' } -import deepseekR1DistillLlama_70b from './resources/models/deepseek-r1-distill-llama-70b/model.json' with { type: 'json' } export default defineConfig([ { @@ -65,71 +11,20 @@ export default defineConfig([ }, platform: 'browser', define: { - MODELS: JSON.stringify([ - bakllavaJson, - codeninja7bJson, - commandr34bJson, - deepseekCoder13bJson, - deepseekCoder34bJson, - gemma112bJson, - gemma117bJson, - llama2Chat70bJson, - llama2Chat7bJson, - llamacorn1bJson, - llava13bJson, - llava7bJson, - mistralIns7bq4Json, - mixtral8x7bInstructJson, - noromaid7bJson, - openchat357bJson, - phi3bJson, - phind34bJson, - qwen7bJson, - stableZephyr3bJson, - stealthv127bJson, - tinyllama11bJson, - trinityv127bJson, - vistral7bJson, - wizardcoder13bJson, - yi34bJson, - llama3Json, - llama3Hermes8bJson, - phimediumJson, - aya8bJson, - aya35bJson, - codestralJson, - qwen2Json, - llama318bJson, - llama3170bJson, - gemma22bJson, - gemma29bJson, - gemma227bJson, - llama321bJson, - llama323bJson, - qwen257bJson, - qwen25coder7bJson, - qwen25coder14bJson, - qwen25coder32bJson, - qwen2514bJson, - qwen2532bJson, - qwen2572bJson, - deepseekR1DistillQwen_1_5b, - deepseekR1DistillQwen_7b, - deepseekR1DistillQwen_14b, - deepseekR1DistillQwen_32b, - deepseekR1DistillLlama_8b, - deepseekR1DistillLlama_70b, - ]), NODE: JSON.stringify(`${packageJson.name}/${packageJson.node}`), SETTINGS: JSON.stringify(defaultSettingJson), - CORTEX_API_URL: JSON.stringify('http://127.0.0.1:39291'), - CORTEX_SOCKET_URL: JSON.stringify('ws://127.0.0.1:39291'), - CORTEX_ENGINE_VERSION: JSON.stringify('v0.1.49'), + CORTEX_API_URL: JSON.stringify( + `http://127.0.0.1:${process.env.CORTEX_API_PORT ?? '39291'}` + ), + CORTEX_SOCKET_URL: JSON.stringify( + `ws://127.0.0.1:${process.env.CORTEX_API_PORT ?? '39291'}` + ), + CORTEX_ENGINE_VERSION: JSON.stringify('v0.1.55'), }, }, { input: 'src/node/index.ts', - external: ['@janhq/core/node', 'cpu-instructions'], + external: ['@janhq/core/node'], output: { format: 'cjs', file: 'dist/node/index.cjs.js', @@ -139,6 +34,11 @@ export default defineConfig([ resolve: { extensions: ['.js', '.ts', '.json'], }, + define: { + CORTEX_API_URL: JSON.stringify( + `http://127.0.0.1:${process.env.CORTEX_API_PORT ?? '39291'}` + ), + }, platform: 'node', }, ]) diff --git a/extensions/inference-cortex-extension/src/@types/global.d.ts b/extensions/inference-cortex-extension/src/@types/global.d.ts index 2de432c29..52f97b9ab 100644 --- a/extensions/inference-cortex-extension/src/@types/global.d.ts +++ b/extensions/inference-cortex-extension/src/@types/global.d.ts @@ -3,4 +3,3 @@ declare const CORTEX_API_URL: string declare const CORTEX_SOCKET_URL: string declare const CORTEX_ENGINE_VERSION: string declare const SETTINGS: any -declare const MODELS: any diff --git a/extensions/inference-cortex-extension/src/index.test.ts b/extensions/inference-cortex-extension/src/index.test.ts new file mode 100644 index 000000000..9726400e7 --- /dev/null +++ b/extensions/inference-cortex-extension/src/index.test.ts @@ -0,0 +1,452 @@ +import { describe, beforeEach, it, expect, vi, afterEach } from 'vitest' + +// Must mock before imports +vi.mock('@janhq/core', () => { + return { + executeOnMain: vi.fn().mockResolvedValue({}), + events: { + emit: vi.fn() + }, + extractModelLoadParams: vi.fn().mockReturnValue({}), + ModelEvent: { + OnModelsUpdate: 'OnModelsUpdate', + OnModelStopped: 'OnModelStopped' + }, + EngineEvent: { + OnEngineUpdate: 'OnEngineUpdate' + }, + InferenceEngine: { + cortex: 'cortex', + nitro: 'nitro', + cortex_llamacpp: 'cortex_llamacpp' + }, + LocalOAIEngine: class LocalOAIEngine { + onLoad() {} + onUnload() {} + } + } +}) + +import JanInferenceCortexExtension, { Settings } from './index' +import { InferenceEngine, ModelEvent, EngineEvent, executeOnMain, events } from '@janhq/core' +import ky from 'ky' + +// Mock global variables +const CORTEX_API_URL = 'http://localhost:3000' +const CORTEX_SOCKET_URL = 'ws://localhost:3000' +const SETTINGS = [ + { id: 'n_parallel', name: 'Parallel Execution', description: 'Number of parallel executions', type: 'number', value: '4' }, + { id: 'cont_batching', name: 'Continuous Batching', description: 'Enable continuous batching', type: 'boolean', value: true }, + { id: 'caching_enabled', name: 'Caching', description: 'Enable caching', type: 'boolean', value: true }, + { id: 'flash_attn', name: 'Flash Attention', description: 'Enable flash attention', type: 'boolean', value: true }, + { id: 'cache_type', name: 'Cache Type', description: 'Type of cache to use', type: 'string', value: 'f16' }, + { id: 'use_mmap', name: 'Use Memory Map', description: 'Use memory mapping', type: 'boolean', value: true }, + { id: 'cpu_threads', name: 'CPU Threads', description: 'Number of CPU threads', type: 'number', value: '' } +] +const NODE = 'node' + +// Mock globals +vi.stubGlobal('CORTEX_API_URL', CORTEX_API_URL) +vi.stubGlobal('CORTEX_SOCKET_URL', CORTEX_SOCKET_URL) +vi.stubGlobal('SETTINGS', SETTINGS) +vi.stubGlobal('NODE', NODE) +vi.stubGlobal('window', { + addEventListener: vi.fn() +}) + +// Mock WebSocket +class MockWebSocket { + url :string + listeners: {} + onclose: Function + + constructor(url) { + this.url = url + this.listeners = {} + } + + addEventListener(event, listener) { + this.listeners[event] = listener + } + + emit(event, data) { + if (this.listeners[event]) { + this.listeners[event](data) + } + } + + close() { + if (this.onclose) { + this.onclose({ code: 1000 }) + } + } +} + +// Mock global WebSocket +// @ts-ignore +global.WebSocket = vi.fn().mockImplementation((url) => new MockWebSocket(url)) + +describe('JanInferenceCortexExtension', () => { + let extension + + beforeEach(() => { + // Reset mocks + vi.clearAllMocks() + + // Create a new instance for each test + extension = new JanInferenceCortexExtension() + + // Mock the getSetting method + extension.getSetting = vi.fn().mockImplementation((key, defaultValue) => { + switch(key) { + case Settings.n_parallel: + return '4' + case Settings.cont_batching: + return true + case Settings.caching_enabled: + return true + case Settings.flash_attn: + return true + case Settings.cache_type: + return 'f16' + case Settings.use_mmap: + return true + case Settings.cpu_threads: + return '' + default: + return defaultValue + } + }) + + // Mock methods + extension.registerSettings = vi.fn() + extension.onLoad = vi.fn() + extension.clean = vi.fn().mockResolvedValue({}) + extension.healthz = vi.fn().mockResolvedValue({}) + extension.subscribeToEvents = vi.fn() + }) + + describe('onSettingUpdate', () => { + it('should update n_parallel setting correctly', () => { + extension.onSettingUpdate(Settings.n_parallel, '8') + expect(extension.n_parallel).toBe(8) + }) + + it('should update cont_batching setting correctly', () => { + extension.onSettingUpdate(Settings.cont_batching, false) + expect(extension.cont_batching).toBe(false) + }) + + it('should update caching_enabled setting correctly', () => { + extension.onSettingUpdate(Settings.caching_enabled, false) + expect(extension.caching_enabled).toBe(false) + }) + + it('should update flash_attn setting correctly', () => { + extension.onSettingUpdate(Settings.flash_attn, false) + expect(extension.flash_attn).toBe(false) + }) + + it('should update cache_type setting correctly', () => { + extension.onSettingUpdate(Settings.cache_type, 'f32') + expect(extension.cache_type).toBe('f32') + }) + + it('should update use_mmap setting correctly', () => { + extension.onSettingUpdate(Settings.use_mmap, false) + expect(extension.use_mmap).toBe(false) + }) + + it('should update cpu_threads setting correctly', () => { + extension.onSettingUpdate(Settings.cpu_threads, '4') + expect(extension.cpu_threads).toBe(4) + }) + + it('should not update cpu_threads when value is not a number', () => { + extension.cpu_threads = undefined + extension.onSettingUpdate(Settings.cpu_threads, 'not-a-number') + expect(extension.cpu_threads).toBeUndefined() + }) + }) + + describe('onUnload', () => { + it('should clean up resources correctly', async () => { + extension.shouldReconnect = true + + await extension.onUnload() + + expect(extension.shouldReconnect).toBe(false) + expect(extension.clean).toHaveBeenCalled() + expect(executeOnMain).toHaveBeenCalledWith(NODE, 'dispose') + }) + }) + + describe('loadModel', () => { + it('should remove llama_model_path and mmproj from settings', async () => { + // Setup + const model = { + id: 'test-model', + settings: { + llama_model_path: '/path/to/model', + mmproj: '/path/to/mmproj', + some_setting: 'value' + }, + engine: InferenceEngine.cortex_llamacpp + } + + // Mock ky.post + vi.spyOn(ky, 'post').mockImplementation(() => ({ + // @ts-ignore + json: () => Promise.resolve({}), + catch: () => ({ + finally: () => ({ + // @ts-ignore + then: () => Promise.resolve({}) + }) + }) + })) + + // Setup queue for testing + extension.queue = { add: vi.fn(fn => fn()) } + + // Execute + await extension.loadModel(model) + + // Verify settings were filtered + expect(model.settings).not.toHaveProperty('llama_model_path') + expect(model.settings).not.toHaveProperty('mmproj') + expect(model.settings).toHaveProperty('some_setting') + }) + + it('should convert nitro to cortex_llamacpp engine', async () => { + // Setup + const model = { + id: 'test-model', + settings: {}, + engine: InferenceEngine.nitro + } + + // Mock ky.post + const mockKyPost = vi.spyOn(ky, 'post').mockImplementation(() => ({ + // @ts-ignore + json: () => Promise.resolve({}), + catch: () => ({ + finally: () => ({ + // @ts-ignore + then: () => Promise.resolve({}) + }) + }) + })) + + // Setup queue for testing + extension.queue = { add: vi.fn(fn => fn()) } + + // Execute + await extension.loadModel(model) + + // Verify API call + expect(mockKyPost).toHaveBeenCalledWith( + `${CORTEX_API_URL}/v1/models/start`, + expect.objectContaining({ + json: expect.objectContaining({ + engine: InferenceEngine.cortex_llamacpp + }) + }) + ) + }) + }) + + describe('unloadModel', () => { + it('should call the correct API endpoint and abort loading if in progress', async () => { + // Setup + const model = { id: 'test-model' } + const mockAbort = vi.fn() + extension.abortControllers.set(model.id, { abort: mockAbort }) + + // Mock ky.post + const mockKyPost = vi.spyOn(ky, 'post').mockImplementation(() => ({ + // @ts-ignore + json: () => Promise.resolve({}), + finally: () => ({ + // @ts-ignore + then: () => Promise.resolve({}) + }) + })) + + // Execute + await extension.unloadModel(model) + + // Verify API call + expect(mockKyPost).toHaveBeenCalledWith( + `${CORTEX_API_URL}/v1/models/stop`, + expect.objectContaining({ + json: { model: model.id } + }) + ) + + // Verify abort controller was called + expect(mockAbort).toHaveBeenCalled() + }) + }) + + describe('clean', () => { + it('should make a DELETE request to destroy process manager', async () => { + // Mock the ky.delete function directly + const mockDelete = vi.fn().mockReturnValue({ + catch: vi.fn().mockReturnValue(Promise.resolve({})) + }) + + // Replace the original implementation + vi.spyOn(ky, 'delete').mockImplementation(mockDelete) + + // Override the clean method to use the real implementation + // @ts-ignore + extension.clean = JanInferenceCortexExtension.prototype.clean + + // Call the method + await extension.clean() + + // Verify the correct API call was made + expect(mockDelete).toHaveBeenCalledWith( + `${CORTEX_API_URL}/processmanager/destroy`, + expect.objectContaining({ + timeout: 2000, + retry: expect.objectContaining({ + limit: 0 + }) + }) + ) + }) + }) + + describe('WebSocket events', () => { + it('should handle WebSocket events correctly', () => { + // Create a mock implementation for subscribeToEvents that stores the socket + let messageHandler; + let closeHandler; + + // Override the private method + extension.subscribeToEvents = function() { + this.socket = new MockWebSocket('ws://localhost:3000/events'); + this.socket.addEventListener('message', (event) => { + const data = JSON.parse(event.data); + + // Store for testing + messageHandler = data; + + const transferred = data.task.items.reduce( + (acc, cur) => acc + cur.downloadedBytes, + 0 + ); + const total = data.task.items.reduce( + (acc, cur) => acc + cur.bytes, + 0 + ); + const percent = total > 0 ? transferred / total : 0; + + events.emit( + data.type === 'DownloadUpdated' ? 'onFileDownloadUpdate' : + data.type === 'DownloadSuccess' ? 'onFileDownloadSuccess' : + data.type, + { + modelId: data.task.id, + percent: percent, + size: { + transferred: transferred, + total: total, + }, + downloadType: data.task.type, + } + ); + + if (data.task.type === 'Engine') { + events.emit(EngineEvent.OnEngineUpdate, { + type: data.type, + percent: percent, + id: data.task.id, + }); + } + else if (data.type === 'DownloadSuccess') { + setTimeout(() => { + events.emit(ModelEvent.OnModelsUpdate, { + fetch: true, + }); + }, 500); + } + }); + + this.socket.onclose = (event) => { + closeHandler = event; + // Notify app to update model running state + events.emit(ModelEvent.OnModelStopped, {}); + }; + }; + + // Setup queue + extension.queue = { + add: vi.fn(fn => fn()) + }; + + // Execute the method + extension.subscribeToEvents(); + + // Simulate a message event + extension.socket.listeners.message({ + data: JSON.stringify({ + type: 'DownloadUpdated', + task: { + id: 'test-model', + type: 'Model', + items: [ + { downloadedBytes: 50, bytes: 100 } + ] + } + }) + }); + + // Verify event emission + expect(events.emit).toHaveBeenCalledWith( + 'onFileDownloadUpdate', + expect.objectContaining({ + modelId: 'test-model', + percent: 0.5 + }) + ); + + // Simulate a download success event + vi.useFakeTimers(); + extension.socket.listeners.message({ + data: JSON.stringify({ + type: 'DownloadSuccess', + task: { + id: 'test-model', + type: 'Model', + items: [ + { downloadedBytes: 100, bytes: 100 } + ] + } + }) + }); + + // Fast-forward time to trigger the timeout + vi.advanceTimersByTime(500); + + // Verify the ModelEvent.OnModelsUpdate event was emitted + expect(events.emit).toHaveBeenCalledWith( + ModelEvent.OnModelsUpdate, + { fetch: true } + ); + + vi.useRealTimers(); + + // Trigger websocket close + extension.socket.onclose({ code: 1000 }); + + // Verify OnModelStopped event was emitted + expect(events.emit).toHaveBeenCalledWith( + ModelEvent.OnModelStopped, + {} + ); + }); + }) +}) \ No newline at end of file diff --git a/extensions/inference-cortex-extension/src/index.ts b/extensions/inference-cortex-extension/src/index.ts index 05efaf735..7ed51f9c2 100644 --- a/extensions/inference-cortex-extension/src/index.ts +++ b/extensions/inference-cortex-extension/src/index.ts @@ -10,19 +10,14 @@ import { Model, executeOnMain, EngineEvent, - systemInformation, - joinPath, LocalOAIEngine, InferenceEngine, - getJanDataFolderPath, extractModelLoadParams, - fs, events, ModelEvent, - dirName, } from '@janhq/core' import PQueue from 'p-queue' -import ky from 'ky' +import ky, { KyInstance } from 'ky' /** * Event subscription types of Downloader @@ -80,14 +75,37 @@ export default class JanInferenceCortexExtension extends LocalOAIEngine { abortControllers = new Map() + api?: KyInstance /** - * Subscribes to events emitted by the @janhq/core package. + * Get the API instance + * @returns + */ + async apiInstance(): Promise { + if(this.api) return this.api + const apiKey = (await window.core?.api.appToken()) ?? 'cortex.cpp' + this.api = ky.extend({ + prefixUrl: CORTEX_API_URL, + headers: { + Authorization: `Bearer ${apiKey}`, + }, + }) + return this.api + } + + /** + * Authorization headers for the API requests. + * @returns + */ + headers(): Promise { + return window.core?.api.appToken().then((token: string) => ({ + Authorization: `Bearer ${token}`, + })) + } + + /** + * Called when the extension is loaded. */ async onLoad() { - const models = MODELS as Model[] - - this.registerModels(models) - super.onLoad() // Register Settings @@ -152,81 +170,59 @@ export default class JanInferenceCortexExtension extends LocalOAIEngine { override async loadModel( model: Model & { file_path?: string } ): Promise { - if ( - (model.engine === InferenceEngine.nitro || model.settings.vision_model) && - model.settings.llama_model_path - ) { - // Legacy chat model support - model.settings = { - ...model.settings, - llama_model_path: await getModelFilePath( - model, - model.settings.llama_model_path - ), - } - } else { - const { llama_model_path, ...settings } = model.settings - model.settings = settings - } + // Cortex will handle these settings + const { llama_model_path, mmproj, ...settings } = model.settings + model.settings = settings - if ( - (model.engine === InferenceEngine.nitro || model.settings.vision_model) && - model.settings.mmproj - ) { - // Legacy clip vision model support - model.settings = { - ...model.settings, - mmproj: await getModelFilePath(model, model.settings.mmproj), - } - } else { - const { mmproj, ...settings } = model.settings - model.settings = settings - } const controller = new AbortController() const { signal } = controller this.abortControllers.set(model.id, controller) return await this.queue.add(() => - ky - .post(`${CORTEX_API_URL}/v1/models/start`, { - json: { - ...extractModelLoadParams(model.settings), - model: model.id, - engine: - model.engine === InferenceEngine.nitro // Legacy model cache - ? InferenceEngine.cortex_llamacpp - : model.engine, - cont_batching: this.cont_batching, - n_parallel: this.n_parallel, - caching_enabled: this.caching_enabled, - flash_attn: this.flash_attn, - cache_type: this.cache_type, - use_mmap: this.use_mmap, - ...(this.cpu_threads ? { cpu_threads: this.cpu_threads } : {}), - }, - timeout: false, - signal, - }) - .json() - .catch(async (e) => { - throw (await e.response?.json()) ?? e - }) - .finally(() => this.abortControllers.delete(model.id)) - .then() + this.apiInstance().then((api) => + api + .post('v1/models/start', { + json: { + ...extractModelLoadParams(model.settings), + model: model.id, + engine: + model.engine === InferenceEngine.nitro // Legacy model cache + ? InferenceEngine.cortex_llamacpp + : model.engine, + cont_batching: this.cont_batching, + n_parallel: this.n_parallel, + caching_enabled: this.caching_enabled, + flash_attn: this.flash_attn, + cache_type: this.cache_type, + use_mmap: this.use_mmap, + ...(this.cpu_threads ? { cpu_threads: this.cpu_threads } : {}), + }, + timeout: false, + signal, + }) + .json() + .catch(async (e) => { + throw (await e.response?.json()) ?? e + }) + .finally(() => this.abortControllers.delete(model.id)) + .then() + ) ) } override async unloadModel(model: Model): Promise { - return ky - .post(`${CORTEX_API_URL}/v1/models/stop`, { - json: { model: model.id }, - }) - .json() - .finally(() => { - this.abortControllers.get(model.id)?.abort() - }) - .then() + return this.apiInstance().then((api) => + api + .post('v1/models/stop', { + json: { model: model.id }, + }) + .json() + .finally(() => { + this.abortControllers.get(model.id)?.abort() + }) + .then() + ) } /** @@ -234,15 +230,17 @@ export default class JanInferenceCortexExtension extends LocalOAIEngine { * @returns */ private async healthz(): Promise { - return ky - .get(`${CORTEX_API_URL}/healthz`, { - retry: { - limit: 20, - delay: () => 500, - methods: ['get'], - }, - }) - .then(() => {}) + return this.apiInstance().then((api) => + api + .get('healthz', { + retry: { + limit: 20, + delay: () => 500, + methods: ['get'], + }, + }) + .then(() => {}) + ) } /** @@ -250,13 +248,15 @@ export default class JanInferenceCortexExtension extends LocalOAIEngine { * @returns */ private async clean(): Promise { - return ky - .delete(`${CORTEX_API_URL}/processmanager/destroy`, { - timeout: 2000, // maximum 2 seconds - retry: { - limit: 0, - }, - }) + return this.apiInstance() + .then((api) => + api.delete('processmanager/destroy', { + timeout: 2000, // maximum 2 seconds + retry: { + limit: 0, + }, + }) + ) .catch(() => { // Do nothing }) @@ -339,22 +339,3 @@ export default class JanInferenceCortexExtension extends LocalOAIEngine { ) } } - -/// Legacy -const getModelFilePath = async ( - model: Model & { file_path?: string }, - file: string -): Promise => { - // Symlink to the model file - if ( - !model.sources[0]?.url.startsWith('http') && - (await fs.existsSync(model.sources[0].url)) - ) { - return model.sources[0]?.url - } - if (model.file_path) { - await joinPath([await dirName(model.file_path), file]) - } - return joinPath([await getJanDataFolderPath(), 'models', model.id, file]) -} -/// diff --git a/extensions/inference-cortex-extension/src/node/index.test.ts b/extensions/inference-cortex-extension/src/node/index.test.ts index bdfd99d03..6a1e168f3 100644 --- a/extensions/inference-cortex-extension/src/node/index.test.ts +++ b/extensions/inference-cortex-extension/src/node/index.test.ts @@ -1,6 +1,14 @@ -jest.mock('@janhq/core/node', () => ({ - ...jest.requireActual('@janhq/core/node'), +import { describe, it, expect, vi } from 'vitest' +// Mocks + +const CORTEX_API_URL = 'http://localhost:3000' +vi.stubGlobal('CORTEX_API_URL', CORTEX_API_URL) + +vi.mock('@janhq/core/node', (actual) => ({ + ...actual(), getJanDataFolderPath: () => '', + appResourcePath: () => '/mock/path', + log: vi.fn(), getSystemResourceInfo: () => { return { cpu: { @@ -30,25 +38,36 @@ jest.mock('@janhq/core/node', () => ({ }, })) -jest.mock('fs', () => ({ +vi.mock('fs', () => ({ default: { readdirSync: () => [], }, })) -jest.mock('child_process', () => ({ +vi.mock('./watchdog', () => { + return { + ProcessWatchdog: vi.fn().mockImplementation(() => { + return { + start: vi.fn(), + terminate: vi.fn(), + } + }), + } +}) + +vi.mock('child_process', () => ({ exec: () => { return { - stdout: { on: jest.fn() }, - stderr: { on: jest.fn() }, - on: jest.fn(), + stdout: { on: vi.fn() }, + stderr: { on: vi.fn() }, + on: vi.fn(), } }, spawn: () => { return { - stdout: { on: jest.fn() }, - stderr: { on: jest.fn() }, - on: jest.fn(), + stdout: { on: vi.fn() }, + stderr: { on: vi.fn() }, + on: vi.fn(), pid: '111', } }, @@ -56,28 +75,70 @@ jest.mock('child_process', () => ({ import index from './index' -describe('dispose', () => { - it('should dispose a model successfully on Mac', async () => { - Object.defineProperty(process, 'platform', { - value: 'darwin', +describe('Cortex extension node interface', () => { + describe('run', () => { + it('should start the cortex subprocess on macOS', async () => { + Object.defineProperty(process, 'platform', { + value: 'darwin', + }) + + const result = await index.run() + expect(result).toBeUndefined() }) - // Call the dispose function - const result = await index.dispose() + it('should start the cortex subprocess on Windows', async () => { + Object.defineProperty(process, 'platform', { + value: 'win32', + }) - // Assert that the result is as expected - expect(result).toBeUndefined() + const result = await index.run() + expect(result).toBeUndefined() + }) + + it('should set the proper environment variables based on platform', async () => { + // Test for Windows + Object.defineProperty(process, 'platform', { + value: 'win32', + }) + process.env.PATH = '/original/path' + + await index.run() + expect(process.env.PATH).toContain('/original/path') + + // Test for non-Windows (macOS/Linux) + Object.defineProperty(process, 'platform', { + value: 'darwin', + }) + process.env.LD_LIBRARY_PATH = '/original/ld/path' + + await index.run() + expect(process.env.LD_LIBRARY_PATH).toContain('/original/ld/path') + }) }) - it('should kill the subprocess successfully on Windows', async () => { - Object.defineProperty(process, 'platform', { - value: 'win32', + describe('dispose', () => { + it('should dispose a model successfully on Mac', async () => { + Object.defineProperty(process, 'platform', { + value: 'darwin', + }) + + // Call the dispose function + const result = index.dispose() + + // Assert that the result is as expected + expect(result).toBeUndefined() }) - // Call the killSubprocess function - const result = await index.dispose() + it('should kill the subprocess successfully on Windows', async () => { + Object.defineProperty(process, 'platform', { + value: 'win32', + }) - // Assert that the result is as expected - expect(result).toBeUndefined() + // Call the dispose function + const result = index.dispose() + + // Assert that the result is as expected + expect(result).toBeUndefined() + }) }) }) diff --git a/extensions/inference-cortex-extension/src/node/index.ts b/extensions/inference-cortex-extension/src/node/index.ts index 5222bb156..d82225745 100644 --- a/extensions/inference-cortex-extension/src/node/index.ts +++ b/extensions/inference-cortex-extension/src/node/index.ts @@ -1,15 +1,7 @@ import path from 'path' -import { - appResourcePath, - getJanDataFolderPath, - log, - SystemInformation, -} from '@janhq/core/node' +import { appResourcePath, getJanDataFolderPath, log } from '@janhq/core/node' import { ProcessWatchdog } from './watchdog' -import { readdir, symlink } from 'fs/promises' -// The HOST address to use for the Nitro subprocess -const LOCAL_PORT = '39291' let watchdog: ProcessWatchdog | undefined = undefined /** @@ -39,6 +31,9 @@ function run(): Promise { watchdog.terminate() } + // The HOST address to use for the cortex subprocess + const LOCAL_PORT = CORTEX_API_URL.split(':').pop() ?? '39291' + watchdog = new ProcessWatchdog( executablePath, [ @@ -49,8 +44,9 @@ function run(): Promise { `${path.join(dataFolderPath, '.janrc')}`, '--data_folder_path', dataFolderPath, - '--loglevel', - 'INFO', + 'config', + '--api_keys', + process.env.appToken ?? 'cortex.cpp', ], { env: { diff --git a/extensions/model-extension/jest.config.js b/extensions/model-extension/jest.config.js deleted file mode 100644 index 3e32adceb..000000000 --- a/extensions/model-extension/jest.config.js +++ /dev/null @@ -1,9 +0,0 @@ -/** @type {import('ts-jest').JestConfigWithTsJest} */ -module.exports = { - preset: 'ts-jest', - testEnvironment: 'node', - transform: { - 'node_modules/@janhq/core/.+\\.(j|t)s?$': 'ts-jest', - }, - transformIgnorePatterns: ['node_modules/(?!@janhq/core/.*)'], -} diff --git a/extensions/model-extension/package.json b/extensions/model-extension/package.json index abd0e28a0..32ef2f70c 100644 --- a/extensions/model-extension/package.json +++ b/extensions/model-extension/package.json @@ -1,13 +1,13 @@ { "name": "@janhq/model-extension", "productName": "Model Management", - "version": "1.0.35", + "version": "1.0.36", "description": "Handles model lists, their details, and settings.", "main": "dist/index.js", "author": "Jan ", "license": "AGPL-3.0", "scripts": { - "test": "jest", + "test": "vitest run", "build": "rolldown -c rolldown.config.mjs", "build:publish": "rimraf *.tgz --glob || true && yarn build && npm pack && cpx *.tgz ../../pre-install" }, @@ -16,8 +16,8 @@ "rimraf": "^3.0.2", "rolldown": "1.0.0-beta.1", "run-script-os": "^1.1.6", - "ts-loader": "^9.5.0", - "typescript": "5.3.3" + "typescript": "5.3.3", + "vitest": "^3.0.6" }, "files": [ "dist/*", diff --git a/extensions/model-extension/resources/default.json b/extensions/model-extension/resources/default.json new file mode 100644 index 000000000..ce17c9616 --- /dev/null +++ b/extensions/model-extension/resources/default.json @@ -0,0 +1,1255 @@ +[ + { + "author": "CohereForAI", + "id": "cortexso/command-r", + "metadata": { + "_id": "66751b98585f2bf57092b2ae", + "author": "cortexso", + "cardData": { + "license": "cc-by-nc-4.0" + }, + "createdAt": "2024-06-21T06:20:08.000Z", + "description": "---\nlicense: cc-by-nc-4.0\npipeline_tag: text-generation\ntags:\n- cortex.cpp\n---\n\n## Overview\n\nC4AI Command-R is a research release of a 35 billion parameter highly performant generative model. Command-R is a large language model with open weights optimized for a variety of use cases including reasoning, summarization, and question answering. Command-R has the capability for multilingual generation evaluated in 10 languages and highly performant RAG capabilities.\n\n## Variants\n\n| No | Variant | Cortex CLI command |\n| --- | --- | --- |\n| 1 | [Command-r-32b](https://huggingface.co/cortexhub/command-r/tree/32b) | `cortex run command-r:32b` |\n| 1 | [Command-r-35b](https://huggingface.co/cortexhub/command-r/tree/35b) | `cortex run command-r:35b` |\n\n## Use it with Jan (UI)\n\n1. Install **Jan** using [Quickstart](https://jan.ai/docs/quickstart)\n2. Use in Jan model Hub:\n ```bash\n cortexhub/command-r\n ```\n \n## Use it with Cortex (CLI)\n\n1. Install **Cortex** using [Quickstart](https://cortex.jan.ai/docs/quickstart)\n2. Run the model with command:\n ```bash\n cortex run command-r\n ```\n \n## Credits\n\n- **Author:** Cohere For AI\n- **Converter:** [Homebrew](https://www.homebrew.ltd/)\n- **Original License:** [Licence](https://cohere.com/c4ai-cc-by-nc-license)", + "disabled": false, + "downloads": 14, + "gated": false, + "id": "cortexso/command-r", + "lastModified": "2024-11-12T20:13:19.000Z", + "likes": 1, + "model-index": null, + "modelId": "cortexso/command-r", + "private": false, + "sha": "ca1564f6a6d4d03181b01e87e6c3e3fc959c7103", + "siblings": [ + { + "rfilename": ".gitattributes" + }, + { + "rfilename": "README.md" + }, + { + "rfilename": "metadata.yml" + }, + { + "rfilename": "model.yml" + } + ], + "spaces": [], + "tags": ["license:cc-by-nc-4.0", "region:us"], + "usedStorage": 227869888992 + }, + "models": [ + { + "id": "command-r:32b-gguf-q8-0", + "size": 34326891584 + }, + { + "id": "command-r:35b-gguf", + "size": 21527041888 + }, + { + "id": "command-r:32b-gguf-q6-k", + "size": 26505169984 + }, + { + "id": "command-r:32b-gguf-q5-km", + "size": 23051422784 + }, + { + "id": "command-r:32b-gguf-q4-km", + "size": 19800837184 + }, + { + "id": "command-r:32b-gguf-q5-ks", + "size": 22494366784 + }, + { + "id": "command-r:32b-gguf-q2-k", + "size": 12810767424 + }, + { + "id": "command-r:32b-gguf-q3-kl", + "size": 17563438144 + }, + { + "id": "command-r:gguf", + "size": 21527041888 + }, + { + "id": "command-r:32b-gguf-q3-ks", + "size": 14708689984 + }, + { + "id": "command-r:32b-gguf-q3-km", + "size": 16231746624 + }, + { + "id": "command-r:32b-gguf-q4-ks", + "size": 18849516608 + } + ] + }, + { + "author": "Google", + "id": "cortexso/gemma2", + "metadata": { + "_id": "66b06c37491b555fefe0a0bf", + "author": "cortexso", + "cardData": { + "license": "gemma" + }, + "createdAt": "2024-08-05T06:07:51.000Z", + "description": "---\nlicense: gemma\npipeline_tag: text-generation\ntags:\n- cortex.cpp\n---\n\n## Overview\n\nThe [Gemma](https://huggingface.co/google/gemma-2-2b-it), state-of-the-art open model trained with the Gemma datasets that includes both synthetic data and the filtered publicly available websites data with a focus on high-quality and reasoning dense properties. The model belongs to the Gemma family with the 4B, 7B version in two variants 8K and 128K which is the context length (in tokens) that it can support.\n\n## Variants\n\n| No | Variant | Cortex CLI command |\n| --- | --- | --- |\n| 1 | [Gemma2-2b](https://huggingface.co/cortexso/gemma2/tree/2b) | `cortex run gemma2:2b` |\n| 2 | [Gemma2-9b](https://huggingface.co/cortexso/gemma2/tree/9b) | `cortex run gemma2:9b` |\n| 3 | [Gemma2-27b](https://huggingface.co/cortexso/gemma2/tree/27b) | `cortex run gemma2:27b` |\n\n## Use it with Jan (UI)\n\n1. Install **Jan** using [Quickstart](https://jan.ai/docs/quickstart)\n2. Use in Jan model Hub:\n ```bash\n cortexso/gemma2\n ```\n \n## Use it with Cortex (CLI)\n\n1. Install **Cortex** using [Quickstart](https://cortex.jan.ai/docs/quickstart)\n2. Run the model with command:\n ```bash\n cortex run gemma2\n ```\n \n## Credits\n\n- **Author:** Go\u200cogle\n- **Converter:** [Homebrew](https://www.homebrew.ltd/)\n- **Original License:** [License](https://ai.google.dev/gemma/terms)\n- **Papers:** [Gemma Technical Report](https://arxiv.org/abs/2403.08295)", + "disabled": false, + "downloads": 190, + "gated": false, + "id": "cortexso/gemma2", + "lastModified": "2024-11-12T20:13:02.000Z", + "likes": 0, + "model-index": null, + "modelId": "cortexso/gemma2", + "private": false, + "sha": "5fe1c79fabadcd2cb59cd05f76019d0a5fd71ce0", + "siblings": [ + { + "rfilename": ".gitattributes" + }, + { + "rfilename": "README.md" + }, + { + "rfilename": "metadata.yml" + }, + { + "rfilename": "model.yml" + } + ], + "spaces": [], + "tags": ["arxiv:2403.08295", "license:gemma", "region:us"], + "usedStorage": 265964141287 + }, + "models": [ + { + "id": "gemma2:2b-gguf-q6-k", + "size": 2151393024 + }, + { + "id": "gemma2:2b-gguf-q3-km", + "size": 1461667584 + }, + { + "id": "gemma2:gguf", + "size": 1708582496 + }, + { + "id": "gemma2:9b-gguf-q4-km", + "size": 5761057888 + }, + { + "id": "gemma2:9b-gguf-q3-ks", + "size": 4337665120 + }, + { + "id": "gemma2:2b-gguf-q4-ks", + "size": 1638651648 + }, + { + "id": "gemma2:9b-gguf-q5-ks", + "size": 6483592288 + }, + { + "id": "gemma2:9b-gguf-q3-km", + "size": 4761781344 + }, + { + "id": "gemma2:9b-gguf-q3-kl", + "size": 5132452960 + }, + { + "id": "gemma2:27b-gguf-q5-ks", + "size": 18884206240 + }, + { + "id": "gemma2:9b-gguf-q2-k", + "size": 3805398112 + }, + { + "id": "gemma2:27b-gguf-q3-km", + "size": 13424647840 + }, + { + "id": "gemma2:2b-gguf", + "size": 1708582496 + }, + { + "id": "gemma2:onnx", + "size": 1708582496 + }, + { + "id": "gemma2:27b-gguf-q4-km", + "size": 16645381792 + }, + { + "id": "gemma2:9b-gguf-q5-km", + "size": 6647366752 + }, + { + "id": "gemma2:27b-gguf-q2-k", + "size": 10449575584 + }, + { + "id": "gemma2:9b-gguf-q4-ks", + "size": 5478925408 + }, + { + "id": "gemma2:27b-gguf-q3-ks", + "size": 12169060000 + }, + { + "id": "gemma2:2b-gguf-q2-k", + "size": 1229829888 + }, + { + "id": "gemma2:2b-gguf-q4-km", + "size": 1708582656 + }, + { + "id": "gemma2:27b-gguf-q4-ks", + "size": 15739264672 + }, + { + "id": "gemma2:9b-gguf-q8-0", + "size": 9827148896 + }, + { + "id": "gemma2:27b-gguf-q8-0", + "size": 28937387680 + }, + { + "id": "gemma2:9b-gguf-q6-k", + "size": 7589069920 + }, + { + "id": "gemma2:2b-gguf-q8-0", + "size": 2784495360 + }, + { + "id": "gemma2:27b-gguf-q5-km", + "size": 19408117408 + }, + { + "id": "gemma2:2b-gguf-q3-kl", + "size": 1550436096 + }, + { + "id": "gemma2:27b-gguf-q6-k", + "size": 22343524000 + }, + { + "id": "gemma2:2b-gguf-q3-ks", + "size": 1360660224 + }, + { + "id": "gemma2:27b-gguf-q3-kl", + "size": 14519361184 + }, + { + "id": "gemma2:2b-gguf-q5-ks", + "size": 1882543872 + }, + { + "id": "gemma2:2b-gguf-q5-km", + "size": 1923278592 + } + ] + }, + { + "author": "CohereForAI", + "id": "cortexso/aya", + "metadata": { + "_id": "66790e21db26e8589ccd3816", + "author": "cortexso", + "cardData": { + "license": "apache-2.0" + }, + "createdAt": "2024-06-24T06:11:45.000Z", + "description": "---\nlicense: cc-by-sa-4.0\npipeline_tag: text-generation\ntags:\n- cortex.cpp\n---\n\n## Overview\n\nAya Expanse is an open-weight research release of a model with highly advanced multilingual capabilities. It focuses on pairing a highly performant pre-trained Command family of models with the result of a year\u2019s dedicated research from Cohere For AI, including data arbitrage, multilingual preference training, safety tuning, and model merging. The result is a powerful multilingual large language model serving 23 languages.\n\n## Variants\n\n| No | Variant | Cortex CLI command |\n| --- | --- | --- |\n| 1 | [main](https://huggingface.co/cortexso/aya-expanse/tree/main) | `cortex run aya-expanse` |\n\n## Use it with Jan (UI)\n\n1. Install **Jan** using [Quickstart](https://jan.ai/docs/quickstart)\n2. Use in Jan model Hub:\n ```\n cortexso/aya-expanse\n ```\n\n## Use it with Cortex (CLI)\n\n1. Install **Cortex** using [Quickstart](https://cortex.jan.ai/docs/quickstart)\n2. Run the model with command:\n ```\n cortex run aya-expanse\n ```\n\n## Credits\n\n- **Author:** CohereAI\n- **Converter:** [Homebrew](https://www.homebrew.ltd/)\n- **Original License:** [License](https://cohere.com/c4ai-cc-by-nc-license)\n- **Papers:** [Aya Expanse Blog](https://cohere.com/blog/aya-expanse-connecting-our-world)", + "disabled": false, + "downloads": 25, + "gated": false, + "id": "cortexso/aya", + "lastModified": "2024-11-12T20:24:22.000Z", + "likes": 0, + "model-index": null, + "modelId": "cortexso/aya", + "private": false, + "sha": "cae2291fec1dc73739fb8189f9165d23ebe398b8", + "siblings": [ + { + "rfilename": ".gitattributes" + }, + { + "rfilename": "README.md" + }, + { + "rfilename": "metadata.yml" + }, + { + "rfilename": "model.yml" + } + ], + "spaces": [], + "tags": ["license:apache-2.0", "region:us"], + "usedStorage": 21527051168 + }, + "models": [ + { + "id": "aya:12.9b-gguf", + "size": 21527051168 + }, + { + "id": "aya:gguf", + "size": 21527051168 + } + ] + }, + { + "author": "Qwen", + "id": "cortexso/qwen2.5", + "metadata": { + "_id": "671d0d55748faf685e6450a3", + "author": "cortexso", + "cardData": { + "license": "apache-2.0", + "pipeline_tag": "text-generation", + "tags": ["cortex.cpp"] + }, + "createdAt": "2024-10-26T15:40:05.000Z", + "description": "---\nlicense: apache-2.0\npipeline_tag: text-generation\ntags:\n- cortex.cpp\n---\n\n## Overview\n\nQwen2.5 by Qwen is a family of model include various specialized models for coding and mathematics available in multiple sizes from 0.5B to 72B parameters\n\n## Variants\n\n| No | Variant | Cortex CLI command |\n| --- | --- | --- |\n| 1 | [Qwen-2.5-0.5b](https://huggingface.co/cortexso/qwen2.5/tree/0.5b) | `cortex run qwen2.5:0.5b` |\n| 2 | [Qwen-2.5-1.5b](https://huggingface.co/cortexso/qwen2.5/tree/1.5b) | `cortex run qwen2.5:1.5b` |\n| 3 | [Qwen-2.5-3b](https://huggingface.co/cortexso/qwen2.5/tree/3b) | `cortex run qwen2.5:3b` |\n| 4 | [Qwen-2.5-7b](https://huggingface.co/cortexso/qwen2.5/tree/7b) | `cortex run qwen2.5:7b` |\n| 5 | [Qwen-2.5-14b](https://huggingface.co/cortexso/qwen2.5/tree/14b) | `cortex run qwen2.5:14b` |\n| 6 | [Qwen-2.5-32b](https://huggingface.co/cortexso/qwen2.5/tree/32b) | `cortex run qwen2.5:32b` |\n| 7 | [Qwen-2.5-72b](https://huggingface.co/cortexso/qwen2.5/tree/72b) | `cortex run qwen2.5:72b` |\n| 8 | [Qwen-2.5-coder-1.5b](https://huggingface.co/cortexso/qwen2.5/tree/coder-1.5b) | `cortex run qwen2.5:coder-1.5b` |\n| 9 | [Qwen-2.5-coder-7b](https://huggingface.co/cortexso/qwen2.5/tree/coder-7b) | `cortex run qwen2.5:coder-7b` |\n| 10 | [Qwen-2.5-math-1.5b](https://huggingface.co/cortexso/qwen2.5/tree/math-1.5b) | `cortex run qwen2.5:math-1.5b` |\n| 11 | [Qwen-2.5-math-7b](https://huggingface.co/cortexso/qwen2.5/tree/math-7b) | `cortex run qwen2.5:math-7b` |\n\n## Use it with Jan (UI)\n\n1. Install **Jan** using [Quickstart](https://jan.ai/docs/quickstart)\n2. Use in Jan model Hub:\n ```\n cortexso/qwen2.5\n ```\n\n## Use it with Cortex (CLI)\n\n1. Install **Cortex** using [Quickstart](https://cortex.jan.ai/docs/quickstart)\n2. Run the model with command:\n ```\n cortex run qwen2.5\n ```\n\n## Credits\n\n- **Author:** Qwen\n- **Converter:** [Homebrew](https://www.homebrew.ltd/)\n- **Original License:** [License Apache 2.0](https://choosealicense.com/licenses/apache-2.0/)\n- **Papers:** [Qwen2.5 Blog](https://qwenlm.github.io/blog/qwen2.5/)", + "disabled": false, + "downloads": 2482, + "gated": false, + "gguf": { + "architecture": "qwen2", + "bos_token": "<|endoftext|>", + "chat_template": "{%- if tools %}\n {{- '<|im_start|>system\\n' }}\n {%- if messages[0]['role'] == 'system' %}\n {{- messages[0]['content'] }}\n {%- else %}\n {{- 'You are Qwen, created by Alibaba Cloud. You are a helpful assistant.' }}\n {%- endif %}\n {{- \"\\n\\n# Tools\\n\\nYou may call one or more functions to assist with the user query.\\n\\nYou are provided with function signatures within XML tags:\\n\" }}\n {%- for tool in tools %}\n {{- \"\\n\" }}\n {{- tool | tojson }}\n {%- endfor %}\n {{- \"\\n\\n\\nFor each function call, return a json object with function name and arguments within XML tags:\\n\\n{\\\"name\\\": , \\\"arguments\\\": }\\n<|im_end|>\\n\" }}\n{%- else %}\n {%- if messages[0]['role'] == 'system' %}\n {{- '<|im_start|>system\\n' + messages[0]['content'] + '<|im_end|>\\n' }}\n {%- else %}\n {{- '<|im_start|>system\\nYou are Qwen, created by Alibaba Cloud. You are a helpful assistant.<|im_end|>\\n' }}\n {%- endif %}\n{%- endif %}\n{%- for message in messages %}\n {%- if (message.role == \"user\") or (message.role == \"system\" and not loop.first) or (message.role == \"assistant\" and not message.tool_calls) %}\n {{- '<|im_start|>' + message.role + '\\n' + message.content + '<|im_end|>' + '\\n' }}\n {%- elif message.role == \"assistant\" %}\n {{- '<|im_start|>' + message.role }}\n {%- if message.content %}\n {{- '\\n' + message.content }}\n {%- endif %}\n {%- for tool_call in message.tool_calls %}\n {%- if tool_call.function is defined %}\n {%- set tool_call = tool_call.function %}\n {%- endif %}\n {{- '\\n\\n{\"name\": \"' }}\n {{- tool_call.name }}\n {{- '\", \"arguments\": ' }}\n {{- tool_call.arguments | tojson }}\n {{- '}\\n' }}\n {%- endfor %}\n {{- '<|im_end|>\\n' }}\n {%- elif message.role == \"tool\" %}\n {%- if (loop.index0 == 0) or (messages[loop.index0 - 1].role != \"tool\") %}\n {{- '<|im_start|>user' }}\n {%- endif %}\n {{- '\\n\\n' }}\n {{- message.content }}\n {{- '\\n' }}\n {%- if loop.last or (messages[loop.index0 + 1].role != \"tool\") %}\n {{- '<|im_end|>\\n' }}\n {%- endif %}\n {%- endif %}\n{%- endfor %}\n{%- if add_generation_prompt %}\n {{- '<|im_start|>assistant\\n' }}\n{%- endif %}\n", + "context_length": 32768, + "eos_token": "<|im_end|>", + "total": 494032768 + }, + "id": "cortexso/qwen2.5", + "lastModified": "2025-02-25T07:36:34.000Z", + "likes": 0, + "model-index": null, + "modelId": "cortexso/qwen2.5", + "pipeline_tag": "text-generation", + "private": false, + "sha": "7b8b2c31e393f5cf085fe6e535fa5d6ee1cb1c5c", + "siblings": [ + { + "rfilename": ".gitattributes" + }, + { + "rfilename": "README.md" + }, + { + "rfilename": "metadata.yml" + }, + { + "rfilename": "model.yml" + }, + { + "rfilename": "qwen2.5-0.5b-instruct-q2_k.gguf" + }, + { + "rfilename": "qwen2.5-0.5b-instruct-q3_k_l.gguf" + }, + { + "rfilename": "qwen2.5-0.5b-instruct-q3_k_m.gguf" + }, + { + "rfilename": "qwen2.5-0.5b-instruct-q3_k_s.gguf" + }, + { + "rfilename": "qwen2.5-0.5b-instruct-q4_k_m.gguf" + }, + { + "rfilename": "qwen2.5-0.5b-instruct-q4_k_s.gguf" + }, + { + "rfilename": "qwen2.5-0.5b-instruct-q5_k_m.gguf" + }, + { + "rfilename": "qwen2.5-0.5b-instruct-q5_k_s.gguf" + }, + { + "rfilename": "qwen2.5-0.5b-instruct-q6_k.gguf" + }, + { + "rfilename": "qwen2.5-0.5b-instruct-q8_0.gguf" + }, + { + "rfilename": "qwen2.5-1.5b-instruct-q2_k.gguf" + }, + { + "rfilename": "qwen2.5-1.5b-instruct-q3_k_l.gguf" + }, + { + "rfilename": "qwen2.5-1.5b-instruct-q3_k_m.gguf" + }, + { + "rfilename": "qwen2.5-1.5b-instruct-q3_k_s.gguf" + }, + { + "rfilename": "qwen2.5-1.5b-instruct-q4_k_m.gguf" + }, + { + "rfilename": "qwen2.5-1.5b-instruct-q4_k_s.gguf" + }, + { + "rfilename": "qwen2.5-1.5b-instruct-q5_k_m.gguf" + }, + { + "rfilename": "qwen2.5-1.5b-instruct-q5_k_s.gguf" + }, + { + "rfilename": "qwen2.5-1.5b-instruct-q6_k.gguf" + }, + { + "rfilename": "qwen2.5-1.5b-instruct-q8_0.gguf" + }, + { + "rfilename": "qwen2.5-14b-instruct-q2_k.gguf" + }, + { + "rfilename": "qwen2.5-14b-instruct-q3_k_l.gguf" + }, + { + "rfilename": "qwen2.5-14b-instruct-q3_k_m.gguf" + }, + { + "rfilename": "qwen2.5-14b-instruct-q3_k_s.gguf" + }, + { + "rfilename": "qwen2.5-14b-instruct-q4_k_m.gguf" + }, + { + "rfilename": "qwen2.5-14b-instruct-q4_k_s.gguf" + }, + { + "rfilename": "qwen2.5-14b-instruct-q5_k_m.gguf" + }, + { + "rfilename": "qwen2.5-14b-instruct-q5_k_s.gguf" + }, + { + "rfilename": "qwen2.5-14b-instruct-q6_k.gguf" + }, + { + "rfilename": "qwen2.5-14b-instruct-q8_0.gguf" + }, + { + "rfilename": "qwen2.5-32b-instruct-q2_k.gguf" + }, + { + "rfilename": "qwen2.5-32b-instruct-q3_k_l.gguf" + }, + { + "rfilename": "qwen2.5-32b-instruct-q3_k_m.gguf" + }, + { + "rfilename": "qwen2.5-32b-instruct-q3_k_s.gguf" + }, + { + "rfilename": "qwen2.5-32b-instruct-q4_k_m.gguf" + }, + { + "rfilename": "qwen2.5-32b-instruct-q4_k_s.gguf" + }, + { + "rfilename": "qwen2.5-32b-instruct-q5_k_m.gguf" + }, + { + "rfilename": "qwen2.5-32b-instruct-q5_k_s.gguf" + }, + { + "rfilename": "qwen2.5-32b-instruct-q6_k.gguf" + }, + { + "rfilename": "qwen2.5-32b-instruct-q8_0.gguf" + }, + { + "rfilename": "qwen2.5-3b-instruct-q2_k.gguf" + }, + { + "rfilename": "qwen2.5-3b-instruct-q3_k_l.gguf" + }, + { + "rfilename": "qwen2.5-3b-instruct-q3_k_m.gguf" + }, + { + "rfilename": "qwen2.5-3b-instruct-q3_k_s.gguf" + }, + { + "rfilename": "qwen2.5-3b-instruct-q4_k_m.gguf" + }, + { + "rfilename": "qwen2.5-3b-instruct-q4_k_s.gguf" + }, + { + "rfilename": "qwen2.5-3b-instruct-q5_k_m.gguf" + }, + { + "rfilename": "qwen2.5-3b-instruct-q5_k_s.gguf" + }, + { + "rfilename": "qwen2.5-3b-instruct-q6_k.gguf" + }, + { + "rfilename": "qwen2.5-3b-instruct-q8_0.gguf" + }, + { + "rfilename": "qwen2.5-72b-instruct-q4_k_m.gguf" + }, + { + "rfilename": "qwen2.5-7b-instruct-q2_k.gguf" + }, + { + "rfilename": "qwen2.5-7b-instruct-q3_k_l.gguf" + }, + { + "rfilename": "qwen2.5-7b-instruct-q3_k_m.gguf" + }, + { + "rfilename": "qwen2.5-7b-instruct-q3_k_s.gguf" + }, + { + "rfilename": "qwen2.5-7b-instruct-q4_k_m.gguf" + }, + { + "rfilename": "qwen2.5-7b-instruct-q4_k_s.gguf" + }, + { + "rfilename": "qwen2.5-7b-instruct-q5_k_m.gguf" + }, + { + "rfilename": "qwen2.5-7b-instruct-q5_k_s.gguf" + }, + { + "rfilename": "qwen2.5-7b-instruct-q6_k.gguf" + }, + { + "rfilename": "qwen2.5-7b-instruct-q8_0.gguf" + }, + { + "rfilename": "qwen2.5-coder-1.5b-instruct-q2_k.gguf" + }, + { + "rfilename": "qwen2.5-coder-1.5b-instruct-q3_k_l.gguf" + }, + { + "rfilename": "qwen2.5-coder-1.5b-instruct-q3_k_m.gguf" + }, + { + "rfilename": "qwen2.5-coder-1.5b-instruct-q3_k_s.gguf" + }, + { + "rfilename": "qwen2.5-coder-1.5b-instruct-q4_k_m.gguf" + }, + { + "rfilename": "qwen2.5-coder-1.5b-instruct-q4_k_s.gguf" + }, + { + "rfilename": "qwen2.5-coder-1.5b-instruct-q5_k_m.gguf" + }, + { + "rfilename": "qwen2.5-coder-1.5b-instruct-q5_k_s.gguf" + }, + { + "rfilename": "qwen2.5-coder-1.5b-instruct-q6_k.gguf" + }, + { + "rfilename": "qwen2.5-coder-1.5b-instruct-q8_0.gguf" + }, + { + "rfilename": "qwen2.5-coder-7b-instruct-q2_k.gguf" + }, + { + "rfilename": "qwen2.5-coder-7b-instruct-q3_k_l.gguf" + }, + { + "rfilename": "qwen2.5-coder-7b-instruct-q3_k_m.gguf" + }, + { + "rfilename": "qwen2.5-coder-7b-instruct-q3_k_s.gguf" + }, + { + "rfilename": "qwen2.5-coder-7b-instruct-q4_k_m.gguf" + }, + { + "rfilename": "qwen2.5-coder-7b-instruct-q4_k_s.gguf" + }, + { + "rfilename": "qwen2.5-coder-7b-instruct-q5_k_m.gguf" + }, + { + "rfilename": "qwen2.5-coder-7b-instruct-q5_k_s.gguf" + }, + { + "rfilename": "qwen2.5-coder-7b-instruct-q6_k.gguf" + }, + { + "rfilename": "qwen2.5-coder-7b-instruct-q8_0.gguf" + }, + { + "rfilename": "qwen2.5-math-1.5b-instruct-q2_k.gguf" + }, + { + "rfilename": "qwen2.5-math-1.5b-instruct-q3_k_l.gguf" + }, + { + "rfilename": "qwen2.5-math-1.5b-instruct-q3_k_m.gguf" + }, + { + "rfilename": "qwen2.5-math-1.5b-instruct-q3_k_s.gguf" + }, + { + "rfilename": "qwen2.5-math-1.5b-instruct-q4_k_m.gguf" + }, + { + "rfilename": "qwen2.5-math-1.5b-instruct-q4_k_s.gguf" + }, + { + "rfilename": "qwen2.5-math-1.5b-instruct-q5_k_m.gguf" + }, + { + "rfilename": "qwen2.5-math-1.5b-instruct-q5_k_s.gguf" + }, + { + "rfilename": "qwen2.5-math-1.5b-instruct-q6_k.gguf" + }, + { + "rfilename": "qwen2.5-math-1.5b-instruct-q8_0.gguf" + }, + { + "rfilename": "qwen2.5-math-7b-instruct-q2_k.gguf" + }, + { + "rfilename": "qwen2.5-math-7b-instruct-q3_k_l.gguf" + }, + { + "rfilename": "qwen2.5-math-7b-instruct-q3_k_m.gguf" + }, + { + "rfilename": "qwen2.5-math-7b-instruct-q3_k_s.gguf" + }, + { + "rfilename": "qwen2.5-math-7b-instruct-q4_k_m.gguf" + }, + { + "rfilename": "qwen2.5-math-7b-instruct-q4_k_s.gguf" + }, + { + "rfilename": "qwen2.5-math-7b-instruct-q5_k_m.gguf" + }, + { + "rfilename": "qwen2.5-math-7b-instruct-q5_k_s.gguf" + }, + { + "rfilename": "qwen2.5-math-7b-instruct-q6_k.gguf" + }, + { + "rfilename": "qwen2.5-math-7b-instruct-q8_0.gguf" + } + ], + "spaces": [], + "tags": [ + "gguf", + "cortex.cpp", + "text-generation", + "license:apache-2.0", + "endpoints_compatible", + "region:us", + "conversational" + ], + "usedStorage": 1466939625856, + "widgetData": [ + { + "text": "Hi, what can you help me with?" + }, + { + "text": "Hey, let's have a conversation!" + }, + { + "text": "Hello there!" + }, + { + "text": "Hey my name is Clara! How are you?" + } + ] + }, + "models": [ + { + "id": "qwen2.5:1.5b", + "size": 986048384 + }, + { + "id": "qwen2.5:math-1.5b", + "size": 986048416 + }, + { + "id": "qwen2.5:7b", + "size": 4683073856 + }, + { + "id": "qwen2.5:0.5b", + "size": 397807808 + }, + { + "id": "qwen2.5:coder-1.5b", + "size": 986048480 + }, + { + "id": "qwen2.5:32b", + "size": 19851336192 + }, + { + "id": "qwen2.5:3b", + "size": 1929902912 + }, + { + "id": "qwen2.5:14b", + "size": 8988110592 + }, + { + "id": "qwen2.5:math-7b", + "size": 4683073856 + }, + { + "id": "qwen2.5:72b", + "size": 47415715104 + }, + { + "id": "qwen2.5:coder-7b", + "size": 4683073920 + }, + { + "id": "qwen2.5:main", + "size": 8098525504 + } + ] + }, + { + "author": "meta-llama", + "id": "cortexso/llama3.2", + "metadata": { + "_id": "66f63309ba963b1db95deaa4", + "author": "cortexso", + "cardData": { + "license": "llama3.2", + "pipeline_tag": "text-generation", + "tags": ["cortex.cpp", "featured"] + }, + "createdAt": "2024-09-27T04:22:33.000Z", + "description": "---\nlicense: llama3.2\npipeline_tag: text-generation\ntags:\n- cortex.cpp\n- featured\n---\n\n## Overview\n\nMeta developed and released the [Meta Llama 3.2](https://huggingface.co/meta-llama/Llama-3.2-3B-Instruct) family of large language models (LLMs), a collection of pretrained and instruction tuned generative text models in 1B and 3B sizes (text in/text out). The Llama 3.2 instruction-tuned text only models are optimized for multilingual dialogue use cases, including agentic retrieval and summarization tasks. They outperform many of the available open source and closed chat models on common industry benchmarks.\n\n## Variants\n\n| No | Variant | Cortex CLI command |\n| --- | --- | --- |\n| 2 | [gguf](https://huggingface.co/cortexso/llama3.2/tree/main) | `cortex run llama3.2` |\n\n## Use it with Jan (UI)\n\n1. Install **Jan** using [Quickstart](https://jan.ai/docs/quickstart)\n2. Use in Jan model Hub:\n ```bash\n cortexso/llama3.2\n ```\n\n## Use it with Cortex (CLI)\n\n1. Install **Cortex** using [Quickstart](https://cortex.jan.ai/docs/quickstart)\n2. Run the model with command:\n ```bash\n cortex run llama3.2\n ```\n\n## Credits\n\n- **Author:** Meta\n- **Converter:** [Homebrew](https://www.homebrew.ltd/)\n- **Original License:** [License](https://huggingface.co/meta-llama/Llama-3.2-3B-Instruct/blob/main/LICENSE.txt)\n- **Papers:** [Llama-3.2 Blog](https://ai.meta.com/blog/llama-3-2-connect-2024-vision-edge-mobile-devices/)", + "disabled": false, + "downloads": 761, + "gated": false, + "gguf": { + "architecture": "llama", + "bos_token": "<|begin_of_text|>", + "chat_template": "{{- bos_token }}\n{%- if custom_tools is defined %}\n {%- set tools = custom_tools %}\n{%- endif %}\n{%- if not tools_in_user_message is defined %}\n {%- set tools_in_user_message = true %}\n{%- endif %}\n{%- if not date_string is defined %}\n {%- if strftime_now is defined %}\n {%- set date_string = strftime_now(\"%d %b %Y\") %}\n {%- else %}\n {%- set date_string = \"26 Jul 2024\" %}\n {%- endif %}\n{%- endif %}\n{%- if not tools is defined %}\n {%- set tools = none %}\n{%- endif %}\n\n{#- This block extracts the system message, so we can slot it into the right place. #}\n{%- if messages[0]['role'] == 'system' %}\n {%- set system_message = messages[0]['content']|trim %}\n {%- set messages = messages[1:] %}\n{%- else %}\n {%- set system_message = \"\" %}\n{%- endif %}\n\n{#- System message #}\n{{- \"<|start_header_id|>system<|end_header_id|>\\n\\n\" }}\n{%- if tools is not none %}\n {{- \"Environment: ipython\\n\" }}\n{%- endif %}\n{{- \"Cutting Knowledge Date: December 2023\\n\" }}\n{{- \"Today Date: \" + date_string + \"\\n\\n\" }}\n{%- if tools is not none and not tools_in_user_message %}\n {{- \"You have access to the following functions. To call a function, please respond with JSON for a function call.\" }}\n {{- 'Respond in the format {\"name\": function name, \"parameters\": dictionary of argument name and its value}.' }}\n {{- \"Do not use variables.\\n\\n\" }}\n {%- for t in tools %}\n {{- t | tojson(indent=4) }}\n {{- \"\\n\\n\" }}\n {%- endfor %}\n{%- endif %}\n{{- system_message }}\n{{- \"<|eot_id|>\" }}\n\n{#- Custom tools are passed in a user message with some extra guidance #}\n{%- if tools_in_user_message and not tools is none %}\n {#- Extract the first user message so we can plug it in here #}\n {%- if messages | length != 0 %}\n {%- set first_user_message = messages[0]['content']|trim %}\n {%- set messages = messages[1:] %}\n {%- else %}\n {{- raise_exception(\"Cannot put tools in the first user message when there's no first user message!\") }}\n{%- endif %}\n {{- '<|start_header_id|>user<|end_header_id|>\\n\\n' -}}\n {{- \"Given the following functions, please respond with a JSON for a function call \" }}\n {{- \"with its proper arguments that best answers the given prompt.\\n\\n\" }}\n {{- 'Respond in the format {\"name\": function name, \"parameters\": dictionary of argument name and its value}.' }}\n {{- \"Do not use variables.\\n\\n\" }}\n {%- for t in tools %}\n {{- t | tojson(indent=4) }}\n {{- \"\\n\\n\" }}\n {%- endfor %}\n {{- first_user_message + \"<|eot_id|>\"}}\n{%- endif %}\n\n{%- for message in messages %}\n {%- if not (message.role == 'ipython' or message.role == 'tool' or 'tool_calls' in message) %}\n {{- '<|start_header_id|>' + message['role'] + '<|end_header_id|>\\n\\n'+ message['content'] | trim + '<|eot_id|>' }}\n {%- elif 'tool_calls' in message %}\n {%- if not message.tool_calls|length == 1 %}\n {{- raise_exception(\"This model only supports single tool-calls at once!\") }}\n {%- endif %}\n {%- set tool_call = message.tool_calls[0].function %}\n {{- '<|start_header_id|>assistant<|end_header_id|>\\n\\n' -}}\n {{- '{\"name\": \"' + tool_call.name + '\", ' }}\n {{- '\"parameters\": ' }}\n {{- tool_call.arguments | tojson }}\n {{- \"}\" }}\n {{- \"<|eot_id|>\" }}\n {%- elif message.role == \"tool\" or message.role == \"ipython\" %}\n {{- \"<|start_header_id|>ipython<|end_header_id|>\\n\\n\" }}\n {%- if message.content is mapping or message.content is iterable %}\n {{- message.content | tojson }}\n {%- else %}\n {{- message.content }}\n {%- endif %}\n {{- \"<|eot_id|>\" }}\n {%- endif %}\n{%- endfor %}\n{%- if add_generation_prompt %}\n {{- '<|start_header_id|>assistant<|end_header_id|>\\n\\n' }}\n{%- endif %}\n", + "context_length": 131072, + "eos_token": "<|eot_id|>", + "total": 1235814432 + }, + "id": "cortexso/llama3.2", + "lastModified": "2025-02-24T10:25:50.000Z", + "likes": 0, + "model-index": null, + "modelId": "cortexso/llama3.2", + "pipeline_tag": "text-generation", + "private": false, + "sha": "5aabb7db00af6183d866ff69260db98b55760359", + "siblings": [ + { + "rfilename": ".gitattributes" + }, + { + "rfilename": "README.md" + }, + { + "rfilename": "llama-3.2-1b-instruct-q2_k.gguf" + }, + { + "rfilename": "llama-3.2-1b-instruct-q3_k_l.gguf" + }, + { + "rfilename": "llama-3.2-1b-instruct-q3_k_m.gguf" + }, + { + "rfilename": "llama-3.2-1b-instruct-q3_k_s.gguf" + }, + { + "rfilename": "llama-3.2-1b-instruct-q4_k_m.gguf" + }, + { + "rfilename": "llama-3.2-1b-instruct-q4_k_s.gguf" + }, + { + "rfilename": "llama-3.2-1b-instruct-q5_k_m.gguf" + }, + { + "rfilename": "llama-3.2-1b-instruct-q5_k_s.gguf" + }, + { + "rfilename": "llama-3.2-1b-instruct-q6_k.gguf" + }, + { + "rfilename": "llama-3.2-1b-instruct-q8_0.gguf" + }, + { + "rfilename": "llama-3.2-3b-instruct-q2_k.gguf" + }, + { + "rfilename": "llama-3.2-3b-instruct-q3_k_l.gguf" + }, + { + "rfilename": "llama-3.2-3b-instruct-q3_k_m.gguf" + }, + { + "rfilename": "llama-3.2-3b-instruct-q3_k_s.gguf" + }, + { + "rfilename": "llama-3.2-3b-instruct-q4_k_m.gguf" + }, + { + "rfilename": "llama-3.2-3b-instruct-q4_k_s.gguf" + }, + { + "rfilename": "llama-3.2-3b-instruct-q5_k_m.gguf" + }, + { + "rfilename": "llama-3.2-3b-instruct-q5_k_s.gguf" + }, + { + "rfilename": "llama-3.2-3b-instruct-q6_k.gguf" + }, + { + "rfilename": "llama-3.2-3b-instruct-q8_0.gguf" + }, + { + "rfilename": "metadata.yml" + }, + { + "rfilename": "model.yml" + } + ], + "spaces": [], + "tags": [ + "gguf", + "cortex.cpp", + "featured", + "text-generation", + "license:llama3.2", + "endpoints_compatible", + "region:us", + "conversational" + ], + "usedStorage": 50404795008, + "widgetData": [ + { + "text": "Hi, what can you help me with?" + }, + { + "text": "Hey, let's have a conversation!" + }, + { + "text": "Hello there!" + }, + { + "text": "Hey my name is Clara! How are you?" + } + ] + }, + "models": [ + { + "id": "llama3.2:1b", + "size": 911503104 + }, + { + "id": "llama3.2:main", + "size": 3421898912 + }, + { + "id": "llama3.2:3b", + "size": 2019377312 + } + ] + }, + { + "author": "DeepSeek-AI", + "id": "cortexso/deepseek-r1", + "metadata": { + "_id": "67a0bcf13ac2dd6adf0bdfcf", + "author": "cortexso", + "cardData": { + "license": "mit", + "pipeline_tag": "text-generation", + "tags": ["cortexp.cpp", "featured"] + }, + "createdAt": "2025-02-03T12:56:17.000Z", + "description": "---\nlicense: mit\npipeline_tag: text-generation\ntags:\n- cortexp.cpp\n- featured\n---\n\n## Overview\n\n**DeepSeek** developed and released the **DeepSeek-R1** series, featuring multiple model sizes fine-tuned for high-performance text generation. These models are optimized for dialogue, reasoning, and information-seeking tasks, providing a balance of efficiency and accuracy while maintaining a smaller footprint compared to their original counterparts.\n\nThe DeepSeek-R1 models include distilled and full-scale variants of both **Qwen** and **Llama** architectures, catering to various applications such as customer support, conversational AI, research, and enterprise automation.\n\n## Variants\n\n### DeepSeek-R1\n\n| No | Variant | Branch | Cortex CLI command |\n| -- | ---------------------------------------------------------------------------------------------- | ------- | ------------------------------------------ |\n| 1 | [DeepSeek-R1-Distill-Qwen-1.5B](https://huggingface.co/cortexso/deepseek-r1/tree/1.5b) | 1.5b | `cortex run deepseek-r1:1.5b` |\n| 2 | [DeepSeek-R1-Distill-Qwen-7B](https://huggingface.co/cortexso/deepseek-r1/tree/7b) | 7b | `cortex run deepseek-r1:7b` |\n| 3 | [DeepSeek-R1-Distill-Llama-8B](https://huggingface.co/cortexso/deepseek-r1/tree/8b) | 8b | `cortex run deepseek-r1:8b` |\n| 4 | [DeepSeek-R1-Distill-Qwen-14B](https://huggingface.co/cortexso/deepseek-r1/tree/14b) | 14b | `cortex run deepseek-r1:14b` |\n| 5 | [DeepSeek-R1-Distill-Qwen-32B](https://huggingface.co/cortexso/deepseek-r1/tree/32b) | 32b | `cortex run deepseek-r1:32b` |\n| 6 | [DeepSeek-R1-Distill-Llama-70B](https://huggingface.co/cortexso/deepseek-r1/tree/70b) | 70b | `cortex run deepseek-r1:70b` |\n\nEach branch contains a default quantized version:\n- **Qwen-1.5B:** q4-km\n- **Qwen-7B:** q4-km\n- **Llama-8B:** q4-km\n- **Qwen-14B:** q4-km\n- **Qwen-32B:** q4-km\n- **Llama-70B:** q4-km\n\n## Use it with Jan (UI)\n\n1. Install **Jan** using [Quickstart](https://jan.ai/docs/quickstart)\n2. Use in Jan model Hub:\n ```text\n cortexso/deepseek-r1\n ```\n\n## Use it with Cortex (CLI)\n\n1. Install **Cortex** using [Quickstart](https://cortex.jan.ai/docs/quickstart)\n2. Run the model with command:\n ```bash\n cortex run deepseek-r1\n ```\n\n## Credits\n\n- **Author:** DeepSeek\n- **Converter:** [Homebrew](https://www.homebrew.ltd/)\n- **Original License:** [License](https://huggingface.co/deepseek-ai/DeepSeek-R1#license)\n- **Papers:** [DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning](https://arxiv.org/html/2501.12948v1)", + "disabled": false, + "downloads": 999, + "gated": false, + "gguf": { + "architecture": "llama", + "bos_token": "<\uff5cbegin\u2581of\u2581sentence\uff5c>", + "chat_template": "{% if not add_generation_prompt is defined %}{% set add_generation_prompt = false %}{% endif %}{% set ns = namespace(is_first=false, is_tool=false, is_output_first=true, system_prompt='') %}{%- for message in messages %}{%- if message['role'] == 'system' %}{% set ns.system_prompt = message['content'] %}{%- endif %}{%- endfor %}{{bos_token}}{{ns.system_prompt}}{%- for message in messages %}{%- if message['role'] == 'user' %}{%- set ns.is_tool = false -%}{{'<\uff5cUser\uff5c>' + message['content']}}{%- endif %}{%- if message['role'] == 'assistant' and message['content'] is none %}{%- set ns.is_tool = false -%}{%- for tool in message['tool_calls']%}{%- if not ns.is_first %}{{'<\uff5cAssistant\uff5c><\uff5ctool\u2581calls\u2581begin\uff5c><\uff5ctool\u2581call\u2581begin\uff5c>' + tool['type'] + '<\uff5ctool\u2581sep\uff5c>' + tool['function']['name'] + '\\n' + '```json' + '\\n' + tool['function']['arguments'] + '\\n' + '```' + '<\uff5ctool\u2581call\u2581end\uff5c>'}}{%- set ns.is_first = true -%}{%- else %}{{'\\n' + '<\uff5ctool\u2581call\u2581begin\uff5c>' + tool['type'] + '<\uff5ctool\u2581sep\uff5c>' + tool['function']['name'] + '\\n' + '```json' + '\\n' + tool['function']['arguments'] + '\\n' + '```' + '<\uff5ctool\u2581call\u2581end\uff5c>'}}{{'<\uff5ctool\u2581calls\u2581end\uff5c><\uff5cend\u2581of\u2581sentence\uff5c>'}}{%- endif %}{%- endfor %}{%- endif %}{%- if message['role'] == 'assistant' and message['content'] is not none %}{%- if ns.is_tool %}{{'<\uff5ctool\u2581outputs\u2581end\uff5c>' + message['content'] + '<\uff5cend\u2581of\u2581sentence\uff5c>'}}{%- set ns.is_tool = false -%}{%- else %}{% set content = message['content'] %}{% if '' in content %}{% set content = content.split('')[-1] %}{% endif %}{{'<\uff5cAssistant\uff5c>' + content + '<\uff5cend\u2581of\u2581sentence\uff5c>'}}{%- endif %}{%- endif %}{%- if message['role'] == 'tool' %}{%- set ns.is_tool = true -%}{%- if ns.is_output_first %}{{'<\uff5ctool\u2581outputs\u2581begin\uff5c><\uff5ctool\u2581output\u2581begin\uff5c>' + message['content'] + '<\uff5ctool\u2581output\u2581end\uff5c>'}}{%- set ns.is_output_first = false %}{%- else %}{{'\\n<\uff5ctool\u2581output\u2581begin\uff5c>' + message['content'] + '<\uff5ctool\u2581output\u2581end\uff5c>'}}{%- endif %}{%- endif %}{%- endfor -%}{% if ns.is_tool %}{{'<\uff5ctool\u2581outputs\u2581end\uff5c>'}}{% endif %}{% if add_generation_prompt and not ns.is_tool %}{{'<\uff5cAssistant\uff5c>\\n'}}{% endif %}", + "context_length": 131072, + "eos_token": "<\uff5cend\u2581of\u2581sentence\uff5c>", + "total": 70553706560 + }, + "id": "cortexso/deepseek-r1", + "lastModified": "2025-02-24T17:35:43.000Z", + "likes": 0, + "model-index": null, + "modelId": "cortexso/deepseek-r1", + "pipeline_tag": "text-generation", + "private": false, + "sha": "b08ca722cc176e8d830a4e348f51367ea47b7bed", + "siblings": [ + { + "rfilename": ".gitattributes" + }, + { + "rfilename": "README.md" + }, + { + "rfilename": "deepseek-r1-distill-llama-70b-q4_k_m.gguf" + }, + { + "rfilename": "deepseek-r1-distill-llama-8b-q2_k.gguf" + }, + { + "rfilename": "deepseek-r1-distill-llama-8b-q3_k_l.gguf" + }, + { + "rfilename": "deepseek-r1-distill-llama-8b-q3_k_m.gguf" + }, + { + "rfilename": "deepseek-r1-distill-llama-8b-q3_k_s.gguf" + }, + { + "rfilename": "deepseek-r1-distill-llama-8b-q4_k_m.gguf" + }, + { + "rfilename": "deepseek-r1-distill-llama-8b-q4_k_s.gguf" + }, + { + "rfilename": "deepseek-r1-distill-llama-8b-q5_k_m.gguf" + }, + { + "rfilename": "deepseek-r1-distill-llama-8b-q5_k_s.gguf" + }, + { + "rfilename": "deepseek-r1-distill-llama-8b-q6_k.gguf" + }, + { + "rfilename": "deepseek-r1-distill-llama-8b-q8_0.gguf" + }, + { + "rfilename": "deepseek-r1-distill-qwen-1.5b-q2_k.gguf" + }, + { + "rfilename": "deepseek-r1-distill-qwen-1.5b-q3_k_l.gguf" + }, + { + "rfilename": "deepseek-r1-distill-qwen-1.5b-q3_k_m.gguf" + }, + { + "rfilename": "deepseek-r1-distill-qwen-1.5b-q3_k_s.gguf" + }, + { + "rfilename": "deepseek-r1-distill-qwen-1.5b-q4_k_m.gguf" + }, + { + "rfilename": "deepseek-r1-distill-qwen-1.5b-q4_k_s.gguf" + }, + { + "rfilename": "deepseek-r1-distill-qwen-1.5b-q5_k_m.gguf" + }, + { + "rfilename": "deepseek-r1-distill-qwen-1.5b-q5_k_s.gguf" + }, + { + "rfilename": "deepseek-r1-distill-qwen-1.5b-q6_k.gguf" + }, + { + "rfilename": "deepseek-r1-distill-qwen-1.5b-q8_0.gguf" + }, + { + "rfilename": "deepseek-r1-distill-qwen-14b-q2_k.gguf" + }, + { + "rfilename": "deepseek-r1-distill-qwen-14b-q3_k_l.gguf" + }, + { + "rfilename": "deepseek-r1-distill-qwen-14b-q3_k_m.gguf" + }, + { + "rfilename": "deepseek-r1-distill-qwen-14b-q3_k_s.gguf" + }, + { + "rfilename": "deepseek-r1-distill-qwen-14b-q4_k_m.gguf" + }, + { + "rfilename": "deepseek-r1-distill-qwen-14b-q4_k_s.gguf" + }, + { + "rfilename": "deepseek-r1-distill-qwen-14b-q5_k_m.gguf" + }, + { + "rfilename": "deepseek-r1-distill-qwen-14b-q5_k_s.gguf" + }, + { + "rfilename": "deepseek-r1-distill-qwen-14b-q6_k.gguf" + }, + { + "rfilename": "deepseek-r1-distill-qwen-14b-q8_0.gguf" + }, + { + "rfilename": "deepseek-r1-distill-qwen-32b-q2_k.gguf" + }, + { + "rfilename": "deepseek-r1-distill-qwen-32b-q3_k_l.gguf" + }, + { + "rfilename": "deepseek-r1-distill-qwen-32b-q3_k_m.gguf" + }, + { + "rfilename": "deepseek-r1-distill-qwen-32b-q3_k_s.gguf" + }, + { + "rfilename": "deepseek-r1-distill-qwen-32b-q4_k_m.gguf" + }, + { + "rfilename": "deepseek-r1-distill-qwen-32b-q4_k_s.gguf" + }, + { + "rfilename": "deepseek-r1-distill-qwen-32b-q5_k_m.gguf" + }, + { + "rfilename": "deepseek-r1-distill-qwen-32b-q5_k_s.gguf" + }, + { + "rfilename": "deepseek-r1-distill-qwen-32b-q6_k.gguf" + }, + { + "rfilename": "deepseek-r1-distill-qwen-32b-q8_0.gguf" + }, + { + "rfilename": "deepseek-r1-distill-qwen-7b-q2_k.gguf" + }, + { + "rfilename": "deepseek-r1-distill-qwen-7b-q3_k_l.gguf" + }, + { + "rfilename": "deepseek-r1-distill-qwen-7b-q3_k_m.gguf" + }, + { + "rfilename": "deepseek-r1-distill-qwen-7b-q3_k_s.gguf" + }, + { + "rfilename": "deepseek-r1-distill-qwen-7b-q4_k_m.gguf" + }, + { + "rfilename": "deepseek-r1-distill-qwen-7b-q4_k_s.gguf" + }, + { + "rfilename": "deepseek-r1-distill-qwen-7b-q5_k_m.gguf" + }, + { + "rfilename": "deepseek-r1-distill-qwen-7b-q5_k_s.gguf" + }, + { + "rfilename": "deepseek-r1-distill-qwen-7b-q6_k.gguf" + }, + { + "rfilename": "deepseek-r1-distill-qwen-7b-q8_0.gguf" + }, + { + "rfilename": "metadata.yaml" + } + ], + "spaces": [], + "tags": [ + "gguf", + "cortexp.cpp", + "featured", + "text-generation", + "license:mit", + "endpoints_compatible", + "region:us", + "conversational" + ], + "usedStorage": 825182913408, + "widgetData": [ + { + "text": "Hi, what can you help me with?" + }, + { + "text": "Hey, let's have a conversation!" + }, + { + "text": "Hello there!" + }, + { + "text": "Hey my name is Clara! How are you?" + } + ] + }, + "models": [ + { + "id": "deepseek-r1:1.5b", + "size": 1117320480 + }, + { + "id": "deepseek-r1:14b", + "size": 8988109920 + }, + { + "id": "deepseek-r1:70b", + "size": 42520395584 + }, + { + "id": "deepseek-r1:8b", + "size": 4920736256 + }, + { + "id": "deepseek-r1:main", + "size": 8098524832 + }, + { + "id": "deepseek-r1:7b", + "size": 4683073184 + }, + { + "id": "deepseek-r1:32b", + "size": 19851335520 + } + ] + }, + { + "author": "meta-llama", + "id": "cortexso/llama3.1", + "metadata": { + "_id": "66a76e01a1037fe261a5a472", + "author": "cortexso", + "cardData": { + "license": "llama3.1", + "pipeline_tag": "text-generation", + "tags": ["cortex.cpp"] + }, + "createdAt": "2024-07-29T10:25:05.000Z", + "description": "---\nlicense: llama3.1\npipeline_tag: text-generation\ntags:\n- cortex.cpp\n---\n\n## Overview\n\nMeta developed and released the [Meta Llama 3.1](https://huggingface.co/meta-llama/Meta-Llama-3.1-8B) family of large language models (LLMs), a collection of pretrained and instruction tuned generative text models in 8 and 70B sizes. The Llama 3 instruction tuned models are optimized for dialogue use cases and outperform many of the available open source chat models on common industry benchmarks. Further, in developing these models, we took great care to optimize helpfulness and safety.\n\n## Variants\n\n| No | Variant | Cortex CLI command |\n| --- | --- | --- |\n| 1 | [Llama3.1-8b](https://huggingface.co/cortexso/llama3.1/tree/8b) | `cortex run llama3.1:8b` |\n\n## Use it with Jan (UI)\n\n1. Install **Jan** using [Quickstart](https://jan.ai/docs/quickstart)\n2. Use in Jan model Hub:\n ```bash\n cortexso/llama3.1\n ```\n\n## Use it with Cortex (CLI)\n\n1. Install **Cortex** using [Quickstart](https://cortex.jan.ai/docs/quickstart)\n2. Run the model with command:\n ```bash\n cortex run llama3.1\n ```\n\n## Credits\n\n- **Author:** Meta\n- **Converter:** [Homebrew](https://www.homebrew.ltd/)\n- **Original License:** [License](https://huggingface.co/meta-llama/Meta-Llama-3.1-8B/blob/main/LICENSE)\n- **Papers:** [Llama-3.1 Blog](https://ai.meta.com/blog/meta-llama-3-1/)", + "disabled": false, + "downloads": 275, + "gated": false, + "gguf": { + "architecture": "llama", + "bos_token": "<|begin_of_text|>", + "context_length": 131072, + "eos_token": "<|end_of_text|>", + "total": 8030261312 + }, + "id": "cortexso/llama3.1", + "lastModified": "2025-02-25T07:41:12.000Z", + "likes": 0, + "model-index": null, + "modelId": "cortexso/llama3.1", + "pipeline_tag": "text-generation", + "private": false, + "sha": "f83805762b13bfe9aaa071c065edb74c48281367", + "siblings": [ + { + "rfilename": ".gitattributes" + }, + { + "rfilename": "README.md" + }, + { + "rfilename": "llama-3.1-8b-q2_k.gguf" + }, + { + "rfilename": "llama-3.1-8b-q3_k_l.gguf" + }, + { + "rfilename": "llama-3.1-8b-q3_k_m.gguf" + }, + { + "rfilename": "llama-3.1-8b-q3_k_s.gguf" + }, + { + "rfilename": "llama-3.1-8b-q4_k_m.gguf" + }, + { + "rfilename": "llama-3.1-8b-q4_k_s.gguf" + }, + { + "rfilename": "llama-3.1-8b-q5_k_m.gguf" + }, + { + "rfilename": "llama-3.1-8b-q5_k_s.gguf" + }, + { + "rfilename": "llama-3.1-8b-q6_k.gguf" + }, + { + "rfilename": "llama-3.1-8b-q8_0.gguf" + }, + { + "rfilename": "metadata.yml" + }, + { + "rfilename": "model.yml" + } + ], + "spaces": [], + "tags": [ + "gguf", + "cortex.cpp", + "text-generation", + "license:llama3.1", + "endpoints_compatible", + "region:us" + ], + "usedStorage": 227069905920, + "widgetData": [ + { + "text": "My name is Julien and I like to" + }, + { + "text": "I like traveling by train because" + }, + { + "text": "Paris is an amazing place to visit," + }, + { + "text": "Once upon a time," + } + ] + }, + "models": [ + { + "id": "llama3.1:8b", + "size": 4920734176 + }, + { + "id": "llama3.1:main", + "size": 8540770784 + } + ] + } +] diff --git a/extensions/model-extension/rolldown.config.mjs b/extensions/model-extension/rolldown.config.mjs index 0e4c866fe..54ea654ff 100644 --- a/extensions/model-extension/rolldown.config.mjs +++ b/extensions/model-extension/rolldown.config.mjs @@ -1,5 +1,6 @@ import { defineConfig } from 'rolldown' import settingJson from './resources/settings.json' with { type: 'json' } +import modelSources from './resources/default.json' with { type: 'json' } export default defineConfig({ input: 'src/index.ts', @@ -10,7 +11,7 @@ export default defineConfig({ platform: 'browser', define: { SETTINGS: JSON.stringify(settingJson), - API_URL: JSON.stringify('http://127.0.0.1:39291'), - SOCKET_URL: JSON.stringify('ws://127.0.0.1:39291'), + CORTEX_API_URL: JSON.stringify(`http://127.0.0.1:${process.env.CORTEX_API_PORT ?? "39291"}`), + DEFAULT_MODEL_SOURCES: JSON.stringify(modelSources), }, }) diff --git a/extensions/model-extension/src/@types/global.d.ts b/extensions/model-extension/src/@types/global.d.ts index 92d9df09b..e4d269cdb 100644 --- a/extensions/model-extension/src/@types/global.d.ts +++ b/extensions/model-extension/src/@types/global.d.ts @@ -1,7 +1,7 @@ declare const NODE: string -declare const API_URL: string -declare const SOCKET_URL: string +declare const CORTEX_API_URL: string declare const SETTINGS: SettingComponentProps[] +declare const DEFAULT_MODEL_SOURCES: any interface Core { api: APIFunctions diff --git a/extensions/model-extension/src/cortex.ts b/extensions/model-extension/src/cortex.ts deleted file mode 100644 index 7618e8170..000000000 --- a/extensions/model-extension/src/cortex.ts +++ /dev/null @@ -1,198 +0,0 @@ -import PQueue from 'p-queue' -import ky from 'ky' -import { extractModelLoadParams, Model } from '@janhq/core' -import { extractInferenceParams } from '@janhq/core' -/** - * cortex.cpp Model APIs interface - */ -interface ICortexAPI { - getModel(model: string): Promise - getModels(): Promise - pullModel(model: string, id?: string, name?: string): Promise - importModel( - path: string, - modelPath: string, - name?: string, - option?: string - ): Promise - deleteModel(model: string): Promise - updateModel(model: object): Promise - cancelModelPull(model: string): Promise - configs(body: { [key: string]: any }): Promise -} - -type ModelList = { - data: any[] -} - -export class CortexAPI implements ICortexAPI { - queue = new PQueue({ concurrency: 1 }) - - constructor() { - this.queue.add(() => this.healthz()) - } - - /** - * Fetches a model detail from cortex.cpp - * @param model - * @returns - */ - getModel(model: string): Promise { - return this.queue.add(() => - ky - .get(`${API_URL}/v1/models/${model}`) - .json() - .then((e) => this.transformModel(e)) - ) - } - - /** - * Fetches models list from cortex.cpp - * @param model - * @returns - */ - getModels(): Promise { - return this.queue - .add(() => ky.get(`${API_URL}/v1/models?limit=-1`).json()) - .then((e) => - typeof e === 'object' ? e.data.map((e) => this.transformModel(e)) : [] - ) - } - - /** - * Pulls a model from HuggingFace via cortex.cpp - * @param model - * @returns - */ - pullModel(model: string, id?: string, name?: string): Promise { - return this.queue.add(() => - ky - .post(`${API_URL}/v1/models/pull`, { json: { model, id, name } }) - .json() - .catch(async (e) => { - throw (await e.response?.json()) ?? e - }) - .then() - ) - } - - /** - * Imports a model from a local path via cortex.cpp - * @param model - * @returns - */ - importModel( - model: string, - modelPath: string, - name?: string, - option?: string - ): Promise { - return this.queue.add(() => - ky - .post(`${API_URL}/v1/models/import`, { - json: { model, modelPath, name, option }, - }) - .json() - .catch((e) => console.debug(e)) // Ignore error - .then() - ) - } - - /** - * Deletes a model from cortex.cpp - * @param model - * @returns - */ - deleteModel(model: string): Promise { - return this.queue.add(() => - ky.delete(`${API_URL}/v1/models/${model}`).json().then() - ) - } - - /** - * Update a model in cortex.cpp - * @param model - * @returns - */ - updateModel(model: Partial): Promise { - return this.queue.add(() => - ky - .patch(`${API_URL}/v1/models/${model.id}`, { json: { ...model } }) - .json() - .then() - ) - } - - /** - * Cancel model pull in cortex.cpp - * @param model - * @returns - */ - cancelModelPull(model: string): Promise { - return this.queue.add(() => - ky - .delete(`${API_URL}/v1/models/pull`, { json: { taskId: model } }) - .json() - .then() - ) - } - - /** - * Check model status - * @param model - */ - async getModelStatus(model: string): Promise { - return this.queue - .add(() => ky.get(`${API_URL}/v1/models/status/${model}`)) - .then((e) => true) - .catch(() => false) - } - - /** - * Do health check on cortex.cpp - * @returns - */ - healthz(): Promise { - return ky - .get(`${API_URL}/healthz`, { - retry: { - limit: 20, - delay: () => 500, - methods: ['get'], - }, - }) - .then(() => {}) - } - - /** - * Configure model pull options - * @param body - */ - configs(body: { [key: string]: any }): Promise { - return this.queue.add(() => - ky.patch(`${API_URL}/v1/configs`, { json: body }).then(() => {}) - ) - } - - /** - * TRansform model to the expected format (e.g. parameters, settings, metadata) - * @param model - * @returns - */ - private transformModel(model: any) { - model.parameters = { - ...extractInferenceParams(model), - ...model.parameters, - ...model.inference_params, - } - model.settings = { - ...extractModelLoadParams(model), - ...model.settings, - } - model.metadata = model.metadata ?? { - tags: [], - size: model.size ?? model.metadata?.size ?? 0, - } - return model as Model - } -} diff --git a/extensions/model-extension/src/index.test.ts b/extensions/model-extension/src/index.test.ts index e514f8ce3..a339c8c9b 100644 --- a/extensions/model-extension/src/index.test.ts +++ b/extensions/model-extension/src/index.test.ts @@ -1,89 +1,88 @@ +import { describe, it, expect, beforeEach, vi } from 'vitest' import JanModelExtension from './index' +import ky from 'ky' +import { ModelManager } from '@janhq/core' -let SETTINGS = [] -// @ts-ignore -global.SETTINGS = SETTINGS +const API_URL = 'http://localhost:3000' -jest.mock('@janhq/core', () => ({ - ...jest.requireActual('@janhq/core/node'), - events: { - emit: jest.fn(), - }, - joinPath: (paths) => paths.join('/'), - ModelExtension: jest.fn().mockImplementation(function () { - // @ts-ignore - this.registerSettings = () => { - return Promise.resolve() - } - // @ts-ignore - return this - }), -})) +vi.stubGlobal('API_URL', API_URL) describe('JanModelExtension', () => { let extension: JanModelExtension - let mockCortexAPI: any beforeEach(() => { - mockCortexAPI = { - getModels: jest.fn().mockResolvedValue([]), - pullModel: jest.fn().mockResolvedValue(undefined), - importModel: jest.fn().mockResolvedValue(undefined), - deleteModel: jest.fn().mockResolvedValue(undefined), - updateModel: jest.fn().mockResolvedValue({}), - cancelModelPull: jest.fn().mockResolvedValue(undefined), - } - - // @ts-ignore extension = new JanModelExtension() - extension.cortexAPI = mockCortexAPI - }) + vi.spyOn(ModelManager, 'instance').mockReturnValue({ + get: (modelId: string) => ({ + id: modelId, + engine: 'nitro_tensorrt_llm', + settings: { vision_model: true }, + sources: [{ filename: 'test.bin' }], + }), + } as any) + vi.spyOn(JanModelExtension.prototype, 'cancelModelPull').mockImplementation( + async (model: string) => { + const kyDeleteSpy = vi.spyOn(ky, 'delete').mockResolvedValue({ + json: () => Promise.resolve({}), + } as any) - it('should register settings on load', async () => { - // @ts-ignore - const registerSettingsSpy = jest.spyOn(extension, 'registerSettings') - await extension.onLoad() - expect(registerSettingsSpy).toHaveBeenCalledWith(SETTINGS) - }) + await ky.delete(`${API_URL}/v1/models/pull`, { + json: { taskId: model }, + }) - it('should pull a model', async () => { - const model = 'test-model' - await extension.pullModel(model) - expect(mockCortexAPI.pullModel).toHaveBeenCalledWith(model) - }) + expect(kyDeleteSpy).toHaveBeenCalledWith(`${API_URL}/v1/models/pull`, { + json: { taskId: model }, + }) - it('should cancel model download', async () => { - const model = 'test-model' - await extension.cancelModelPull(model) - expect(mockCortexAPI.cancelModelPull).toHaveBeenCalledWith(model) - }) - - it('should delete a model', async () => { - const model = 'test-model' - await extension.deleteModel(model) - expect(mockCortexAPI.deleteModel).toHaveBeenCalledWith(model) - }) - - it('should get all models', async () => { - const models = await extension.getModels() - expect(models).toEqual([]) - expect(mockCortexAPI.getModels).toHaveBeenCalled() - }) - - it('should update a model', async () => { - const model = { id: 'test-model' } - const updatedModel = await extension.updateModel(model) - expect(updatedModel).toEqual({}) - expect(mockCortexAPI.updateModel).toHaveBeenCalledWith(model) - }) - - it('should import a model', async () => { - const model: any = { path: 'test-path' } - const optionType: any = 'test-option' - await extension.importModel(model, optionType) - expect(mockCortexAPI.importModel).toHaveBeenCalledWith( - model.path, - optionType + kyDeleteSpy.mockRestore() // Restore the original implementation + } ) }) + + it('should initialize with an empty queue', () => { + expect(extension.queue.size).toBe(0) + }) + + describe('pullModel', () => { + it('should call the pull model endpoint with correct parameters', async () => { + const model = 'test-model' + const id = 'test-id' + const name = 'test-name' + + const kyPostSpy = vi.spyOn(ky, 'post').mockReturnValue({ + json: () => Promise.resolve({}), + } as any) + + await extension.pullModel(model, id, name) + + expect(kyPostSpy).toHaveBeenCalledWith(`${API_URL}/v1/models/pull`, { + json: { model, id, name }, + }) + + kyPostSpy.mockRestore() // Restore the original implementation + }) + }) + + describe('cancelModelPull', () => { + it('should call the cancel model pull endpoint with the correct model', async () => { + const model = 'test-model' + + await extension.cancelModelPull(model) + }) + }) + + describe('deleteModel', () => { + it('should call the delete model endpoint with the correct model', async () => { + const model = 'test-model' + const kyDeleteSpy = vi + .spyOn(ky, 'delete') + .mockResolvedValue({ json: () => Promise.resolve({}) } as any) + + await extension.deleteModel(model) + + expect(kyDeleteSpy).toHaveBeenCalledWith(`${API_URL}/v1/models/${model}`) + + kyDeleteSpy.mockRestore() // Restore the original implementation + }) + }) }) diff --git a/extensions/model-extension/src/index.ts b/extensions/model-extension/src/index.ts index 41081d99a..4362ab9a5 100644 --- a/extensions/model-extension/src/index.ts +++ b/extensions/model-extension/src/index.ts @@ -5,32 +5,56 @@ import { joinPath, dirName, fs, - ModelManager, - abortDownload, - DownloadState, - events, - DownloadEvent, OptionType, + ModelSource, + extractInferenceParams, + extractModelLoadParams, } from '@janhq/core' -import { CortexAPI } from './cortex' import { scanModelsFolder } from './legacy/model-json' import { deleteModelFiles } from './legacy/delete' +import PQueue from 'p-queue' +import ky, { KyInstance } from 'ky' +/** + * cortex.cpp setting keys + */ export enum Settings { huggingfaceToken = 'hugging-face-access-token', } +/** Data List Response Type */ +type Data = { + data: T[] +} + /** * A extension for models */ export default class JanModelExtension extends ModelExtension { - cortexAPI: CortexAPI = new CortexAPI() + queue = new PQueue({ concurrency: 1 }) + api?: KyInstance + /** + * Get the API instance + * @returns + */ + async apiInstance(): Promise { + if(this.api) return this.api + const apiKey = (await window.core?.api.appToken()) ?? 'cortex.cpp' + this.api = ky.extend({ + prefixUrl: CORTEX_API_URL, + headers: { + Authorization: `Bearer ${apiKey}`, + }, + }) + return this.api + } /** * Called when the extension is loaded. - * @override */ async onLoad() { + this.queue.add(() => this.healthz()) + this.registerSettings(SETTINGS) // Configure huggingface token if available @@ -38,11 +62,12 @@ export default class JanModelExtension extends ModelExtension { Settings.huggingfaceToken, undefined ) - if (huggingfaceToken) - this.cortexAPI.configs({ huggingface_token: huggingfaceToken }) + if (huggingfaceToken) { + this.updateCortexConfig({ huggingface_token: huggingfaceToken }) + } - // Listen to app download events - this.handleDesktopEvents() + // Sync with cortexsohub + this.fetchCortexsoModels() } /** @@ -52,7 +77,7 @@ export default class JanModelExtension extends ModelExtension { */ onSettingUpdate(key: string, value: T): void { if (key === Settings.huggingfaceToken) { - this.cortexAPI.configs({ huggingface_token: value }) + this.updateCortexConfig({ huggingface_token: value }) } } @@ -62,6 +87,7 @@ export default class JanModelExtension extends ModelExtension { */ async onUnload() {} + // BEGIN: - Public API /** * Downloads a machine learning model. * @param model - The model to download. @@ -71,7 +97,17 @@ export default class JanModelExtension extends ModelExtension { /** * Sending POST to /models/pull/{id} endpoint to pull the model */ - return this.cortexAPI.pullModel(model, id, name) + return this.queue.add(() => + this.apiInstance().then((api) => + api + .post('v1/models/pull', { json: { model, id, name }, timeout: false }) + .json() + .catch(async (e) => { + throw (await e.response?.json()) ?? e + }) + .then() + ) + ) } /** @@ -81,25 +117,17 @@ export default class JanModelExtension extends ModelExtension { * @returns {Promise} A promise that resolves when the download has been cancelled. */ async cancelModelPull(model: string): Promise { - if (model) { - const modelDto: Model = ModelManager.instance().get(model) - // Clip vision model - should not be handled by cortex.cpp - // TensorRT model - should not be handled by cortex.cpp - if ( - modelDto && - (modelDto.engine === InferenceEngine.nitro_tensorrt_llm || - modelDto.settings.vision_model) - ) { - for (const source of modelDto.sources) { - const path = await joinPath(['models', modelDto.id, source.filename]) - await abortDownload(path) - } - } - } /** * Sending DELETE to /models/pull/{id} endpoint to cancel a model pull */ - return this.cortexAPI.cancelModelPull(model) + return this.queue.add(() => + this.apiInstance().then((api) => + api + .delete('v1/models/pull', { json: { taskId: model } }) + .json() + .then() + ) + ) } /** @@ -108,13 +136,17 @@ export default class JanModelExtension extends ModelExtension { * @returns A Promise that resolves when the model is deleted. */ async deleteModel(model: string): Promise { - return this.cortexAPI - .deleteModel(model) + return this.queue + .add(() => + this.apiInstance().then((api) => + api.delete(`v1/models/${model}`).json().then() + ) + ) .catch((e) => console.debug(e)) .finally(async () => { // Delete legacy model files await deleteModelFiles(model).catch((e) => console.debug(e)) - }) + }) as Promise } /** @@ -138,7 +170,7 @@ export default class JanModelExtension extends ModelExtension { /** * Fetch models from cortex.cpp */ - var fetchedModels = await this.cortexAPI.getModels().catch(() => []) + var fetchedModels = await this.fetchModels().catch(() => []) // Checking if there are models to import const existingIds = fetchedModels.map((e) => e.id) @@ -165,16 +197,16 @@ export default class JanModelExtension extends ModelExtension { toImportModels.map(async (model: Model & { file_path: string }) => { return this.importModel( model.id, - model.sources[0].url.startsWith('http') || - !(await fs.existsSync(model.sources[0].url)) + model.sources?.[0]?.url.startsWith('http') || + !(await fs.existsSync(model.sources?.[0]?.url)) ? await joinPath([ await dirName(model.file_path), - model.sources[0]?.filename ?? + model.sources?.[0]?.filename ?? model.settings?.llama_model_path ?? - model.sources[0]?.url.split('/').pop() ?? + model.sources?.[0]?.url.split('/').pop() ?? model.id, ]) // Copied models - : model.sources[0].url, // Symlink models, + : model.sources?.[0]?.url, // Symlink models, model.name ) .then((e) => { @@ -195,8 +227,7 @@ export default class JanModelExtension extends ModelExtension { * Models are imported successfully before * Now return models from cortex.cpp and merge with legacy models which are not imported */ - return await this.cortexAPI - .getModels() + return await this.fetchModels() .then((models) => { return models.concat( legacyModels.filter((e) => !models.some((x) => x.id === e.id)) @@ -210,9 +241,34 @@ export default class JanModelExtension extends ModelExtension { * @param model - The metadata of the model */ async updateModel(model: Partial): Promise { - return this.cortexAPI - ?.updateModel(model) - .then(() => this.cortexAPI!.getModel(model.id)) + return this.queue + .add(() => + this.apiInstance().then((api) => + api + .patch(`v1/models/${model.id}`, { + json: { ...model }, + timeout: false, + }) + .json() + .then() + ) + ) + .then(() => this.getModel(model.id)) + } + + /** + * Get a model by its ID + * @param model - The ID of the model + */ + async getModel(model: string): Promise { + return this.queue.add(() => + this.apiInstance().then((api) => + api + .get(`v1/models/${model}`) + .json() + .then((e) => this.transformModel(e)) + ) + ) as Promise } /** @@ -226,48 +282,196 @@ export default class JanModelExtension extends ModelExtension { name?: string, option?: OptionType ): Promise { - return this.cortexAPI.importModel(model, modelPath, name, option) + return this.queue.add(() => + this.apiInstance().then((api) => + api + .post('v1/models/import', { + json: { model, modelPath, name, option }, + timeout: false, + }) + .json() + .catch((e) => console.debug(e)) // Ignore error + .then() + ) + ) } + // BEGIN - Model Sources + /** + * Get model sources + * @param model + */ + async getSources(): Promise { + const sources = await this.queue + .add(() => + this.apiInstance().then((api) => + api.get('v1/models/sources').json>() + ) + ) + .then((e) => (typeof e === 'object' ? (e.data as ModelSource[]) : [])) + .catch(() => []) + return sources.concat( + DEFAULT_MODEL_SOURCES.filter((e) => !sources.some((x) => x.id === e.id)) + ) + } + + /** + * Add a model source + * @param model + */ + async addSource(source: string): Promise { + return this.queue.add(() => + this.apiInstance().then((api) => + api.post('v1/models/sources', { + json: { + source, + }, + }) + ) + ) + } + + /** + * Delete a model source + * @param model + */ + async deleteSource(source: string): Promise { + return this.queue.add(() => + this.apiInstance().then((api) => + api.delete('v1/models/sources', { + json: { + source, + }, + timeout: false, + }) + ) + ) + } + // END - Model Sources + /** * Check model status * @param model */ async isModelLoaded(model: string): Promise { - return this.cortexAPI.getModelStatus(model) + return this.queue + .add(() => + this.apiInstance().then((api) => api.get(`v1/models/status/${model}`)) + ) + .then((e) => true) + .catch(() => false) } /** * Configure pull options such as proxy, headers, etc. */ async configurePullOptions(options: { [key: string]: any }): Promise { - return this.cortexAPI.configs(options).catch((e) => console.debug(e)) + return this.updateCortexConfig(options).catch((e) => console.debug(e)) } /** - * Handle download state from main app + * Fetches models list from cortex.cpp + * @param model + * @returns */ - handleDesktopEvents() { - if (window && window.electronAPI) { - window.electronAPI.onFileDownloadUpdate( - async (_event: string, state: DownloadState | undefined) => { - if (!state) return - state.downloadState = 'downloading' - events.emit(DownloadEvent.onFileDownloadUpdate, state) - } + async fetchModels(): Promise { + return this.queue + .add(() => + this.apiInstance().then((api) => + api.get('v1/models?limit=-1').json>() + ) ) - window.electronAPI.onFileDownloadError( - async (_event: string, state: DownloadState) => { - state.downloadState = 'error' - events.emit(DownloadEvent.onFileDownloadError, state) - } + .then((e) => + typeof e === 'object' ? e.data.map((e) => this.transformModel(e)) : [] ) - window.electronAPI.onFileDownloadSuccess( - async (_event: string, state: DownloadState) => { - state.downloadState = 'end' - events.emit(DownloadEvent.onFileDownloadSuccess, state) - } - ) - } } + // END: - Public API + + // BEGIN: - Private API + + /** + * Transform model to the expected format (e.g. parameters, settings, metadata) + * @param model + * @returns + */ + private transformModel(model: any) { + model.parameters = { + ...extractInferenceParams(model), + ...model.parameters, + ...model.inference_params, + } + model.settings = { + ...extractModelLoadParams(model), + ...model.settings, + } + model.metadata = model.metadata ?? { + tags: [], + size: model.size ?? model.metadata?.size ?? 0, + } + return model as Model + } + + /** + * Update cortex config + * @param body + */ + private async updateCortexConfig(body: { + [key: string]: any + }): Promise { + return this.queue + .add(() => + this.apiInstance().then((api) => + api.patch('v1/configs', { json: body }).then(() => {}) + ) + ) + .catch((e) => console.debug(e)) + } + + /** + * Do health check on cortex.cpp + * @returns + */ + private healthz(): Promise { + return this.apiInstance() + .then((api) => + api.get('healthz', { + retry: { + limit: 20, + delay: () => 500, + methods: ['get'], + }, + }) + ) + .then(() => { + this.queue.concurrency = Infinity + }) + } + + /** + * Fetch models from cortex.so + */ + private fetchCortexsoModels = async () => { + const models = await this.fetchModels() + + return this.queue.add(() => + this.apiInstance() + .then((api) => + api + .get('v1/models/hub?author=cortexso&tag=cortex.cpp') + .json>() + .then((e) => { + e.data?.forEach((model) => { + if ( + !models.some( + (e) => 'modelSource' in e && e.modelSource === model + ) + ) + this.addSource(model).catch((e) => console.debug(e)) + }) + }) + ) + .catch((e) => console.debug(e)) + ) + } + // END: - Private API } diff --git a/extensions/model-extension/src/legacy/download.ts b/extensions/model-extension/src/legacy/download.ts deleted file mode 100644 index 570d0cd13..000000000 --- a/extensions/model-extension/src/legacy/download.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { - downloadFile, - DownloadRequest, - fs, - joinPath, - Model, -} from '@janhq/core' - -export const downloadModel = async ( - model: Model, - network?: { ignoreSSL?: boolean; proxy?: string } -): Promise => { - const homedir = 'file://models' - const supportedGpuArch = ['ampere', 'ada'] - // Create corresponding directory - const modelDirPath = await joinPath([homedir, model.id]) - if (!(await fs.existsSync(modelDirPath))) await fs.mkdir(modelDirPath) - - const jsonFilePath = await joinPath([modelDirPath, 'model.json']) - // Write model.json on download - if (!(await fs.existsSync(jsonFilePath))) - await fs.writeFileSync( - jsonFilePath, - JSON.stringify(model, null, 2) - ) - - console.debug(`Download sources: ${JSON.stringify(model.sources)}`) - - if (model.sources.length > 1) { - // path to model binaries - for (const source of model.sources) { - let path = extractFileName(source.url, '.gguf') - if (source.filename) { - path = await joinPath([modelDirPath, source.filename]) - } - - const downloadRequest: DownloadRequest = { - url: source.url, - localPath: path, - modelId: model.id, - } - downloadFile(downloadRequest, network) - } - } else { - const fileName = extractFileName(model.sources[0]?.url, '.gguf') - const path = await joinPath([modelDirPath, fileName]) - const downloadRequest: DownloadRequest = { - url: model.sources[0]?.url, - localPath: path, - modelId: model.id, - } - downloadFile(downloadRequest, network) - } -} - -/** - * try to retrieve the download file name from the source url - */ -function extractFileName(url: string, fileExtension: string): string { - if (!url) return fileExtension - - const extractedFileName = url.split('/').pop() - const fileName = extractedFileName.toLowerCase().endsWith(fileExtension) - ? extractedFileName - : extractedFileName + fileExtension - return fileName -} diff --git a/extensions/model-extension/src/legacy/model-json.test.ts b/extensions/model-extension/src/legacy/model-json.test.ts index a4ea5bc0b..f90f13646 100644 --- a/extensions/model-extension/src/legacy/model-json.test.ts +++ b/extensions/model-extension/src/legacy/model-json.test.ts @@ -1,27 +1,31 @@ +import { describe, it, expect, beforeEach, vi } from 'vitest' import { scanModelsFolder, getModelJsonPath } from './model-json' // Mock the @janhq/core module -jest.mock('@janhq/core', () => ({ - fs: { - existsSync: jest.fn(), - readdirSync: jest.fn(), - fileStat: jest.fn(), - readFileSync: jest.fn(), +vi.mock('@janhq/core', () => ({ + InferenceEngine: { + nitro: 'nitro', }, - joinPath: jest.fn((paths) => paths.join('/')), + fs: { + existsSync: vi.fn(), + readdirSync: vi.fn(), + fileStat: vi.fn(), + readFileSync: vi.fn(), + }, + joinPath: vi.fn((paths) => paths.join('/')), })) // Import the mocked fs and joinPath after the mock is set up -const { fs } = jest.requireMock('@janhq/core') +import { fs } from '@janhq/core' describe('model-json', () => { beforeEach(() => { - jest.clearAllMocks() + vi.clearAllMocks() }) describe('scanModelsFolder', () => { it('should return an empty array when models folder does not exist', async () => { - fs.existsSync.mockReturnValue(false) + vi.spyOn(fs, 'existsSync').mockReturnValue(false) const result = await scanModelsFolder() expect(result).toEqual([]) @@ -38,11 +42,16 @@ describe('model-json', () => { ], } - fs.existsSync.mockReturnValue(true) - fs.readdirSync.mockReturnValueOnce(['test-model']) - fs.fileStat.mockResolvedValue({ isDirectory: () => true }) - fs.readFileSync.mockReturnValue(JSON.stringify(mockModelJson)) - fs.readdirSync.mockReturnValueOnce(['test-model.gguf', 'model.json']) + vi.spyOn(fs, 'existsSync').mockReturnValue(true) + vi.spyOn(fs, 'readdirSync').mockReturnValueOnce(['test-model']) + vi.spyOn(fs, 'fileStat').mockResolvedValue({ isDirectory: () => true }) + vi.spyOn(fs, 'readFileSync').mockReturnValue( + JSON.stringify(mockModelJson) + ) + vi.spyOn(fs, 'readdirSync').mockReturnValueOnce([ + 'test-model.gguf', + 'model.json', + ]) const result = await scanModelsFolder() expect(result).toHaveLength(1) @@ -52,26 +61,26 @@ describe('model-json', () => { describe('getModelJsonPath', () => { it('should return undefined when folder does not exist', async () => { - fs.existsSync.mockReturnValue(false) + vi.spyOn(fs, 'existsSync').mockReturnValue(false) const result = await getModelJsonPath('non-existent-folder') expect(result).toBeUndefined() }) it('should return the path when model.json exists in the root folder', async () => { - fs.existsSync.mockReturnValue(true) - fs.readdirSync.mockReturnValue(['model.json']) + vi.spyOn(fs, 'existsSync').mockReturnValue(true) + vi.spyOn(fs, 'readdirSync').mockReturnValue(['model.json']) const result = await getModelJsonPath('test-folder') expect(result).toBe('test-folder/model.json') }) it('should return the path when model.json exists in a subfolder', async () => { - fs.existsSync.mockReturnValue(true) - fs.readdirSync + vi.spyOn(fs, 'existsSync').mockReturnValue(true) + vi.spyOn(fs, 'readdirSync') .mockReturnValueOnce(['subfolder']) .mockReturnValueOnce(['model.json']) - fs.fileStat.mockResolvedValue({ isDirectory: () => true }) + vi.spyOn(fs, 'fileStat').mockResolvedValue({ isDirectory: () => true }) const result = await getModelJsonPath('test-folder') expect(result).toBe('test-folder/subfolder/model.json') diff --git a/extensions/model-extension/src/legacy/model-json.ts b/extensions/model-extension/src/legacy/model-json.ts index 03560cde2..e9f0d093b 100644 --- a/extensions/model-extension/src/legacy/model-json.ts +++ b/extensions/model-extension/src/legacy/model-json.ts @@ -112,7 +112,7 @@ export const scanModelsFolder = async (): Promise< } return undefined }) - .filter((e) => !!e) + .filter(Boolean) return modelData } catch (err) { diff --git a/extensions/model-extension/src/migration.test.ts b/extensions/model-extension/src/migration.test.ts index a3ddfa87c..fc7ebe8ba 100644 --- a/extensions/model-extension/src/migration.test.ts +++ b/extensions/model-extension/src/migration.test.ts @@ -1,48 +1,51 @@ -import { Model, InferenceEngine } from '@janhq/core' -import JanModelExtension from './index' +import { describe, it, expect, beforeEach, vi } from 'vitest' + +vi.stubGlobal('API_URL', 'http://localhost:3000') + // Mock the @janhq/core module -jest.mock('@janhq/core', () => ({ +vi.mock('@janhq/core', (actual) => ({ + ...actual, ModelExtension: class {}, InferenceEngine: { nitro: 'nitro', }, - joinPath: jest.fn(), - dirName: jest.fn(), + joinPath: vi.fn(), + dirName: vi.fn(), + fs: { + existsSync: vi.fn(), + readFileSync: vi.fn(), + writeFileSync: vi.fn(), + mkdirSync: vi.fn(), + }, })) -// Mock the CortexAPI -jest.mock('./cortex', () => ({ - CortexAPI: jest.fn().mockImplementation(() => ({ - getModels: jest.fn(), - importModel: jest.fn(), - })), -})) +import { Model, InferenceEngine } from '@janhq/core' + +import JanModelExtension from './index' // Mock the model-json module -jest.mock('./model-json', () => ({ - scanModelsFolder: jest.fn(), +vi.mock('./legacy/model-json', () => ({ + scanModelsFolder: vi.fn(), })) // Import the mocked scanModelsFolder after the mock is set up -const { scanModelsFolder } = jest.requireMock('./model-json') +import * as legacy from './legacy/model-json' describe('JanModelExtension', () => { let extension: JanModelExtension let mockLocalStorage: { [key: string]: string } - let mockCortexAPI: jest.Mock beforeEach(() => { // @ts-ignore extension = new JanModelExtension() mockLocalStorage = {} - mockCortexAPI = extension.cortexAPI as any // Mock localStorage Object.defineProperty(global, 'localStorage', { value: { - getItem: jest.fn((key) => mockLocalStorage[key]), - setItem: jest.fn((key, value) => { + getItem: vi.fn((key) => mockLocalStorage[key]), + setItem: vi.fn((key, value) => { mockLocalStorage[key] = value }), }, @@ -76,22 +79,13 @@ describe('JanModelExtension', () => { file_path: '/path/to/model2', }, ] as any - scanModelsFolder.mockResolvedValue(mockModels) - extension.cortexAPI.importModel = jest - .fn() - .mockResolvedValueOnce(mockModels[0]) - extension.cortexAPI.getModels = jest - .fn() - .mockResolvedValue([mockModels[0]]) - extension.cortexAPI.importModel = jest - .fn() - .mockResolvedValueOnce(mockModels[1]) - extension.cortexAPI.getModels = jest - .fn() - .mockResolvedValue([mockModels[0], mockModels[1]]) - + vi.mocked(legacy.scanModelsFolder).mockResolvedValue(mockModels) + vi.spyOn(extension, 'fetchModels').mockResolvedValue([mockModels[0]]) + vi.spyOn(extension, 'updateModel').mockResolvedValue(undefined) + vi.spyOn(extension, 'importModel').mockResolvedValueOnce(mockModels[1]) + vi.spyOn(extension, 'fetchModels').mockResolvedValue([mockModels[0], mockModels[1]]) const result = await extension.getModels() - expect(scanModelsFolder).toHaveBeenCalled() + expect(legacy.scanModelsFolder).toHaveBeenCalled() expect(result).toEqual(mockModels) }) @@ -121,9 +115,8 @@ describe('JanModelExtension', () => { }, ] as any mockLocalStorage['downloadedModels'] = JSON.stringify(mockModels) - - extension.cortexAPI.getModels = jest.fn().mockResolvedValue([]) - extension.importModel = jest.fn().mockResolvedValue(undefined) + vi.spyOn(extension, 'updateModel').mockResolvedValue(undefined) + vi.spyOn(extension, 'importModel').mockResolvedValue(undefined) const result = await extension.getModels() @@ -155,12 +148,12 @@ describe('JanModelExtension', () => { }, ] as any mockLocalStorage['downloadedModels'] = JSON.stringify(mockModels) - - extension.cortexAPI.getModels = jest.fn().mockResolvedValue(mockModels) + vi.spyOn(extension, 'fetchModels').mockResolvedValue(mockModels) + extension.getModels = vi.fn().mockResolvedValue(mockModels) const result = await extension.getModels() - expect(extension.cortexAPI.getModels).toHaveBeenCalled() + expect(extension.getModels).toHaveBeenCalled() expect(result).toEqual(mockModels) }) }) diff --git a/extensions/model-extension/tsconfig.json b/extensions/model-extension/tsconfig.json index 0d3252934..1d3c112d4 100644 --- a/extensions/model-extension/tsconfig.json +++ b/extensions/model-extension/tsconfig.json @@ -11,5 +11,5 @@ "rootDir": "./src" }, "include": ["./src"], - "exclude": ["**/*.test.ts"] + "exclude": ["**/*.test.ts", "vite.config.ts"] } diff --git a/extensions/model-extension/vite.config.ts b/extensions/model-extension/vite.config.ts new file mode 100644 index 000000000..a8ad5615f --- /dev/null +++ b/extensions/model-extension/vite.config.ts @@ -0,0 +1,8 @@ +import { defineConfig } from "vite" +export default defineConfig(({ mode }) => ({ + define: process.env.VITEST ? {} : { global: 'window' }, + test: { + environment: 'jsdom', + }, +})) + diff --git a/extensions/yarn.lock b/extensions/yarn.lock index 547178451..b87f2b047 100644 --- a/extensions/yarn.lock +++ b/extensions/yarn.lock @@ -429,6 +429,181 @@ __metadata: languageName: node linkType: hard +"@esbuild/aix-ppc64@npm:0.24.2": + version: 0.24.2 + resolution: "@esbuild/aix-ppc64@npm:0.24.2" + conditions: os=aix & cpu=ppc64 + languageName: node + linkType: hard + +"@esbuild/android-arm64@npm:0.24.2": + version: 0.24.2 + resolution: "@esbuild/android-arm64@npm:0.24.2" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/android-arm@npm:0.24.2": + version: 0.24.2 + resolution: "@esbuild/android-arm@npm:0.24.2" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@esbuild/android-x64@npm:0.24.2": + version: 0.24.2 + resolution: "@esbuild/android-x64@npm:0.24.2" + conditions: os=android & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/darwin-arm64@npm:0.24.2": + version: 0.24.2 + resolution: "@esbuild/darwin-arm64@npm:0.24.2" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/darwin-x64@npm:0.24.2": + version: 0.24.2 + resolution: "@esbuild/darwin-x64@npm:0.24.2" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/freebsd-arm64@npm:0.24.2": + version: 0.24.2 + resolution: "@esbuild/freebsd-arm64@npm:0.24.2" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/freebsd-x64@npm:0.24.2": + version: 0.24.2 + resolution: "@esbuild/freebsd-x64@npm:0.24.2" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/linux-arm64@npm:0.24.2": + version: 0.24.2 + resolution: "@esbuild/linux-arm64@npm:0.24.2" + conditions: os=linux & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/linux-arm@npm:0.24.2": + version: 0.24.2 + resolution: "@esbuild/linux-arm@npm:0.24.2" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@esbuild/linux-ia32@npm:0.24.2": + version: 0.24.2 + resolution: "@esbuild/linux-ia32@npm:0.24.2" + conditions: os=linux & cpu=ia32 + languageName: node + linkType: hard + +"@esbuild/linux-loong64@npm:0.24.2": + version: 0.24.2 + resolution: "@esbuild/linux-loong64@npm:0.24.2" + conditions: os=linux & cpu=loong64 + languageName: node + linkType: hard + +"@esbuild/linux-mips64el@npm:0.24.2": + version: 0.24.2 + resolution: "@esbuild/linux-mips64el@npm:0.24.2" + conditions: os=linux & cpu=mips64el + languageName: node + linkType: hard + +"@esbuild/linux-ppc64@npm:0.24.2": + version: 0.24.2 + resolution: "@esbuild/linux-ppc64@npm:0.24.2" + conditions: os=linux & cpu=ppc64 + languageName: node + linkType: hard + +"@esbuild/linux-riscv64@npm:0.24.2": + version: 0.24.2 + resolution: "@esbuild/linux-riscv64@npm:0.24.2" + conditions: os=linux & cpu=riscv64 + languageName: node + linkType: hard + +"@esbuild/linux-s390x@npm:0.24.2": + version: 0.24.2 + resolution: "@esbuild/linux-s390x@npm:0.24.2" + conditions: os=linux & cpu=s390x + languageName: node + linkType: hard + +"@esbuild/linux-x64@npm:0.24.2": + version: 0.24.2 + resolution: "@esbuild/linux-x64@npm:0.24.2" + conditions: os=linux & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/netbsd-arm64@npm:0.24.2": + version: 0.24.2 + resolution: "@esbuild/netbsd-arm64@npm:0.24.2" + conditions: os=netbsd & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/netbsd-x64@npm:0.24.2": + version: 0.24.2 + resolution: "@esbuild/netbsd-x64@npm:0.24.2" + conditions: os=netbsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/openbsd-arm64@npm:0.24.2": + version: 0.24.2 + resolution: "@esbuild/openbsd-arm64@npm:0.24.2" + conditions: os=openbsd & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/openbsd-x64@npm:0.24.2": + version: 0.24.2 + resolution: "@esbuild/openbsd-x64@npm:0.24.2" + conditions: os=openbsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/sunos-x64@npm:0.24.2": + version: 0.24.2 + resolution: "@esbuild/sunos-x64@npm:0.24.2" + conditions: os=sunos & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/win32-arm64@npm:0.24.2": + version: 0.24.2 + resolution: "@esbuild/win32-arm64@npm:0.24.2" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/win32-ia32@npm:0.24.2": + version: 0.24.2 + resolution: "@esbuild/win32-ia32@npm:0.24.2" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@esbuild/win32-x64@npm:0.24.2": + version: 0.24.2 + resolution: "@esbuild/win32-x64@npm:0.24.2" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@isaacs/cliui@npm:^8.0.2": version: 8.0.2 resolution: "@isaacs/cliui@npm:8.0.2" @@ -509,61 +684,61 @@ __metadata: "@janhq/core@file:../../core/package.tgz::locator=%40janhq%2Fassistant-extension%40workspace%3Aassistant-extension": version: 0.1.10 - resolution: "@janhq/core@file:../../core/package.tgz#../../core/package.tgz::hash=4260f5&locator=%40janhq%2Fassistant-extension%40workspace%3Aassistant-extension" + resolution: "@janhq/core@file:../../core/package.tgz#../../core/package.tgz::hash=704042&locator=%40janhq%2Fassistant-extension%40workspace%3Aassistant-extension" dependencies: rxjs: "npm:^7.8.1" ulidx: "npm:^2.3.0" - checksum: 10c0/e5f93764b39cd7b6d01c9c3e4c6bc913d2755dfef28c5aab6102a1b2f3fecd83ed8a4bb4bb89f2c31ebc06284345b7c265a49add72b859c0d40e50802d052072 + checksum: 10c0/4c53e86e66a5aa291b56a7257a90b31cd06e624d56a1d114d05b2bed46eaa39da5d9ebc5a86131867b2ebda51089b09bdd8a0ed97f329630e1d35d3463e1ba37 languageName: node linkType: hard "@janhq/core@file:../../core/package.tgz::locator=%40janhq%2Fconversational-extension%40workspace%3Aconversational-extension": version: 0.1.10 - resolution: "@janhq/core@file:../../core/package.tgz#../../core/package.tgz::hash=4260f5&locator=%40janhq%2Fconversational-extension%40workspace%3Aconversational-extension" + resolution: "@janhq/core@file:../../core/package.tgz#../../core/package.tgz::hash=704042&locator=%40janhq%2Fconversational-extension%40workspace%3Aconversational-extension" dependencies: rxjs: "npm:^7.8.1" ulidx: "npm:^2.3.0" - checksum: 10c0/e5f93764b39cd7b6d01c9c3e4c6bc913d2755dfef28c5aab6102a1b2f3fecd83ed8a4bb4bb89f2c31ebc06284345b7c265a49add72b859c0d40e50802d052072 + checksum: 10c0/4c53e86e66a5aa291b56a7257a90b31cd06e624d56a1d114d05b2bed46eaa39da5d9ebc5a86131867b2ebda51089b09bdd8a0ed97f329630e1d35d3463e1ba37 languageName: node linkType: hard "@janhq/core@file:../../core/package.tgz::locator=%40janhq%2Fengine-management-extension%40workspace%3Aengine-management-extension": version: 0.1.10 - resolution: "@janhq/core@file:../../core/package.tgz#../../core/package.tgz::hash=4260f5&locator=%40janhq%2Fengine-management-extension%40workspace%3Aengine-management-extension" + resolution: "@janhq/core@file:../../core/package.tgz#../../core/package.tgz::hash=704042&locator=%40janhq%2Fengine-management-extension%40workspace%3Aengine-management-extension" dependencies: rxjs: "npm:^7.8.1" ulidx: "npm:^2.3.0" - checksum: 10c0/e5f93764b39cd7b6d01c9c3e4c6bc913d2755dfef28c5aab6102a1b2f3fecd83ed8a4bb4bb89f2c31ebc06284345b7c265a49add72b859c0d40e50802d052072 + checksum: 10c0/4c53e86e66a5aa291b56a7257a90b31cd06e624d56a1d114d05b2bed46eaa39da5d9ebc5a86131867b2ebda51089b09bdd8a0ed97f329630e1d35d3463e1ba37 languageName: node linkType: hard "@janhq/core@file:../../core/package.tgz::locator=%40janhq%2Fhardware-management-extension%40workspace%3Ahardware-management-extension": version: 0.1.10 - resolution: "@janhq/core@file:../../core/package.tgz#../../core/package.tgz::hash=4260f5&locator=%40janhq%2Fhardware-management-extension%40workspace%3Ahardware-management-extension" + resolution: "@janhq/core@file:../../core/package.tgz#../../core/package.tgz::hash=704042&locator=%40janhq%2Fhardware-management-extension%40workspace%3Ahardware-management-extension" dependencies: rxjs: "npm:^7.8.1" ulidx: "npm:^2.3.0" - checksum: 10c0/e5f93764b39cd7b6d01c9c3e4c6bc913d2755dfef28c5aab6102a1b2f3fecd83ed8a4bb4bb89f2c31ebc06284345b7c265a49add72b859c0d40e50802d052072 + checksum: 10c0/4c53e86e66a5aa291b56a7257a90b31cd06e624d56a1d114d05b2bed46eaa39da5d9ebc5a86131867b2ebda51089b09bdd8a0ed97f329630e1d35d3463e1ba37 languageName: node linkType: hard "@janhq/core@file:../../core/package.tgz::locator=%40janhq%2Finference-cortex-extension%40workspace%3Ainference-cortex-extension": version: 0.1.10 - resolution: "@janhq/core@file:../../core/package.tgz#../../core/package.tgz::hash=4260f5&locator=%40janhq%2Finference-cortex-extension%40workspace%3Ainference-cortex-extension" + resolution: "@janhq/core@file:../../core/package.tgz#../../core/package.tgz::hash=704042&locator=%40janhq%2Finference-cortex-extension%40workspace%3Ainference-cortex-extension" dependencies: rxjs: "npm:^7.8.1" ulidx: "npm:^2.3.0" - checksum: 10c0/e5f93764b39cd7b6d01c9c3e4c6bc913d2755dfef28c5aab6102a1b2f3fecd83ed8a4bb4bb89f2c31ebc06284345b7c265a49add72b859c0d40e50802d052072 + checksum: 10c0/4c53e86e66a5aa291b56a7257a90b31cd06e624d56a1d114d05b2bed46eaa39da5d9ebc5a86131867b2ebda51089b09bdd8a0ed97f329630e1d35d3463e1ba37 languageName: node linkType: hard "@janhq/core@file:../../core/package.tgz::locator=%40janhq%2Fmodel-extension%40workspace%3Amodel-extension": version: 0.1.10 - resolution: "@janhq/core@file:../../core/package.tgz#../../core/package.tgz::hash=4260f5&locator=%40janhq%2Fmodel-extension%40workspace%3Amodel-extension" + resolution: "@janhq/core@file:../../core/package.tgz#../../core/package.tgz::hash=704042&locator=%40janhq%2Fmodel-extension%40workspace%3Amodel-extension" dependencies: rxjs: "npm:^7.8.1" ulidx: "npm:^2.3.0" - checksum: 10c0/e5f93764b39cd7b6d01c9c3e4c6bc913d2755dfef28c5aab6102a1b2f3fecd83ed8a4bb4bb89f2c31ebc06284345b7c265a49add72b859c0d40e50802d052072 + checksum: 10c0/4c53e86e66a5aa291b56a7257a90b31cd06e624d56a1d114d05b2bed46eaa39da5d9ebc5a86131867b2ebda51089b09bdd8a0ed97f329630e1d35d3463e1ba37 languageName: node linkType: hard @@ -580,6 +755,7 @@ __metadata: run-script-os: "npm:^1.1.6" ts-loader: "npm:^9.5.0" typescript: "npm:^5.3.3" + vitest: "npm:^3.0.6" languageName: unknown linkType: soft @@ -612,7 +788,6 @@ __metadata: "@types/os-utils": "npm:^0.0.4" "@types/tcp-port-used": "npm:^1.0.4" cpx: "npm:^1.5.0" - decompress: "npm:^4.2.1" download-cli: "npm:^1.1.1" fetch-retry: "npm:^5.0.6" jest: "npm:^29.7.0" @@ -622,11 +797,10 @@ __metadata: rolldown: "npm:1.0.0-beta.1" run-script-os: "npm:^1.1.6" rxjs: "npm:^7.8.1" - tcp-port-used: "npm:^1.0.2" - terminate: "npm:2.6.1" ts-jest: "npm:^29.1.2" typescript: "npm:^5.3.3" ulidx: "npm:^2.3.0" + vitest: "npm:^3.0.8" languageName: unknown linkType: soft @@ -641,8 +815,8 @@ __metadata: rimraf: "npm:^3.0.2" rolldown: "npm:1.0.0-beta.1" run-script-os: "npm:^1.1.6" - ts-loader: "npm:^9.5.0" typescript: "npm:5.3.3" + vitest: "npm:^3.0.6" languageName: unknown linkType: soft @@ -901,7 +1075,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14": +"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14, @jridgewell/sourcemap-codec@npm:^1.5.0": version: 1.5.0 resolution: "@jridgewell/sourcemap-codec@npm:1.5.0" checksum: 10c0/2eb864f276eb1096c3c11da3e9bb518f6d9fc0023c78344cdc037abadc725172c70314bdb360f2d4b7bffec7f5d657ce006816bc5d4ecb35e61b66132db00c18 @@ -1729,6 +1903,139 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-android-arm-eabi@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-android-arm-eabi@npm:4.34.8" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@rollup/rollup-android-arm64@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-android-arm64@npm:4.34.8" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-darwin-arm64@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-darwin-arm64@npm:4.34.8" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-darwin-x64@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-darwin-x64@npm:4.34.8" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@rollup/rollup-freebsd-arm64@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-freebsd-arm64@npm:4.34.8" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-freebsd-x64@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-freebsd-x64@npm:4.34.8" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm-gnueabihf@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.34.8" + conditions: os=linux & cpu=arm & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm-musleabihf@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.34.8" + conditions: os=linux & cpu=arm & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm64-gnu@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.34.8" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm64-musl@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-linux-arm64-musl@npm:4.34.8" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-linux-loongarch64-gnu@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-linux-loongarch64-gnu@npm:4.34.8" + conditions: os=linux & cpu=loong64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-powerpc64le-gnu@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.34.8" + conditions: os=linux & cpu=ppc64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-riscv64-gnu@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.34.8" + conditions: os=linux & cpu=riscv64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-s390x-gnu@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.34.8" + conditions: os=linux & cpu=s390x & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-x64-gnu@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-linux-x64-gnu@npm:4.34.8" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-x64-musl@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-linux-x64-musl@npm:4.34.8" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-win32-arm64-msvc@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.34.8" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-win32-ia32-msvc@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.34.8" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@rollup/rollup-win32-x64-msvc@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-win32-x64-msvc@npm:4.34.8" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@sinclair/typebox@npm:^0.27.8": version: 0.27.8 resolution: "@sinclair/typebox@npm:0.27.8" @@ -1813,6 +2120,13 @@ __metadata: languageName: node linkType: hard +"@types/estree@npm:1.0.6, @types/estree@npm:^1.0.0": + version: 1.0.6 + resolution: "@types/estree@npm:1.0.6" + checksum: 10c0/cdfd751f6f9065442cd40957c07fd80361c962869aa853c1c2fd03e101af8b9389d8ff4955a43a6fcfa223dd387a089937f95be0f3eec21ca527039fd2d9859a + languageName: node + linkType: hard + "@types/graceful-fs@npm:^4.1.3": version: 4.1.9 resolution: "@types/graceful-fs@npm:4.1.9" @@ -1977,6 +2291,168 @@ __metadata: languageName: node linkType: hard +"@vitest/expect@npm:3.0.6": + version: 3.0.6 + resolution: "@vitest/expect@npm:3.0.6" + dependencies: + "@vitest/spy": "npm:3.0.6" + "@vitest/utils": "npm:3.0.6" + chai: "npm:^5.2.0" + tinyrainbow: "npm:^2.0.0" + checksum: 10c0/1273d80d3f523dd390016d89c037e6088688342cc1961f1b0b8b54103f94212c7f6efa275c263fbcfc77e1adcf0fc9faa7285782b85eb4fe49a3bc999e7a61d4 + languageName: node + linkType: hard + +"@vitest/expect@npm:3.0.8": + version: 3.0.8 + resolution: "@vitest/expect@npm:3.0.8" + dependencies: + "@vitest/spy": "npm:3.0.8" + "@vitest/utils": "npm:3.0.8" + chai: "npm:^5.2.0" + tinyrainbow: "npm:^2.0.0" + checksum: 10c0/48aebec816f5a1b1f64f82b474ccfba537801a654f9547c581ed1c2d30b5de72207b643d3db2ac2869809a63a585425df30f65481f86d2bbbf979d8f235661bd + languageName: node + linkType: hard + +"@vitest/mocker@npm:3.0.6": + version: 3.0.6 + resolution: "@vitest/mocker@npm:3.0.6" + dependencies: + "@vitest/spy": "npm:3.0.6" + estree-walker: "npm:^3.0.3" + magic-string: "npm:^0.30.17" + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 || ^6.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + checksum: 10c0/41911fbdf2c6afe099aa8d039079495dfd3dec2cd13e660fbc43488457181065c043d889ed17395bbc76e29e7253bcffbe9ad6a2fb407be33929470089e0b06b + languageName: node + linkType: hard + +"@vitest/mocker@npm:3.0.8": + version: 3.0.8 + resolution: "@vitest/mocker@npm:3.0.8" + dependencies: + "@vitest/spy": "npm:3.0.8" + estree-walker: "npm:^3.0.3" + magic-string: "npm:^0.30.17" + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 || ^6.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + checksum: 10c0/bc89a31a5ebba900bb965b05d1fab581ae2872b6ddc17734f2a8433b9a3c7ae1fa0efd5f13bf03cf8075864b47954e8fcf609cf3a8258f0451375d68b81f135b + languageName: node + linkType: hard + +"@vitest/pretty-format@npm:3.0.6, @vitest/pretty-format@npm:^3.0.6": + version: 3.0.6 + resolution: "@vitest/pretty-format@npm:3.0.6" + dependencies: + tinyrainbow: "npm:^2.0.0" + checksum: 10c0/339b47598f2c77da0d0b7d373c2ceb94995d6154cd30b7de778bbf396d21c570de0be765f1d66793d2a30a6cc673a471be45f093a074acb8a1a71d7665713dd9 + languageName: node + linkType: hard + +"@vitest/pretty-format@npm:3.0.8, @vitest/pretty-format@npm:^3.0.8": + version: 3.0.8 + resolution: "@vitest/pretty-format@npm:3.0.8" + dependencies: + tinyrainbow: "npm:^2.0.0" + checksum: 10c0/9133052605f16966db91d5e495afb5e32c3eb9215602248710bc3fd9034b1b511d1a7f1093571afee8664beb2a83303d42f1d5896fdba2a39adbb5ca9af788f7 + languageName: node + linkType: hard + +"@vitest/runner@npm:3.0.6": + version: 3.0.6 + resolution: "@vitest/runner@npm:3.0.6" + dependencies: + "@vitest/utils": "npm:3.0.6" + pathe: "npm:^2.0.3" + checksum: 10c0/a20cd27d6c91947866b35080db7b8f2fc4568c62878d4175cad38914c2bb769c49791be8601d5ffe27c80cefbc0310e6c0b4256c621581daecdc508d60270d31 + languageName: node + linkType: hard + +"@vitest/runner@npm:3.0.8": + version: 3.0.8 + resolution: "@vitest/runner@npm:3.0.8" + dependencies: + "@vitest/utils": "npm:3.0.8" + pathe: "npm:^2.0.3" + checksum: 10c0/9a9d48dc82ca7101209b21309e18a4720e77d6015bf00a60ace6130e362320158d110f48cf9aa221e5e744729fe8a198811dd69e598688ffbb78c2fce2a842a1 + languageName: node + linkType: hard + +"@vitest/snapshot@npm:3.0.6": + version: 3.0.6 + resolution: "@vitest/snapshot@npm:3.0.6" + dependencies: + "@vitest/pretty-format": "npm:3.0.6" + magic-string: "npm:^0.30.17" + pathe: "npm:^2.0.3" + checksum: 10c0/9baf575d23ef262de6ff180dca156ccd327c02a507d8380b3d59d3b714e3754c45aa588aaa57e3a115cec572a5dd552b8613736d14ac3759b98e068bfe220bed + languageName: node + linkType: hard + +"@vitest/snapshot@npm:3.0.8": + version: 3.0.8 + resolution: "@vitest/snapshot@npm:3.0.8" + dependencies: + "@vitest/pretty-format": "npm:3.0.8" + magic-string: "npm:^0.30.17" + pathe: "npm:^2.0.3" + checksum: 10c0/40564f60f7d166d10a03e9d1f8780daef164c76b2d85c1c8f5800168f907929c815395ac5c1f5c824da5ff29286f874e22dd8874b52044a53e0d858be67ceeb7 + languageName: node + linkType: hard + +"@vitest/spy@npm:3.0.6": + version: 3.0.6 + resolution: "@vitest/spy@npm:3.0.6" + dependencies: + tinyspy: "npm:^3.0.2" + checksum: 10c0/575cf28a370b9f9909e54578460a14234eddf449621b0d28f0fb22b872d2c5302c7ea7df39b680836efc729a1290fa562eee129cef73c5223dfe5b58e6a13b1b + languageName: node + linkType: hard + +"@vitest/spy@npm:3.0.8": + version: 3.0.8 + resolution: "@vitest/spy@npm:3.0.8" + dependencies: + tinyspy: "npm:^3.0.2" + checksum: 10c0/7a940e6fbf5e6903758dfd904dedc9223df72ffa2a3d8c988706c2626c0fd3f9b129452bcd7af40bda014831f15ddb23ad7c1a7e42900acf4f3432b0c2bc8fb5 + languageName: node + linkType: hard + +"@vitest/utils@npm:3.0.6": + version: 3.0.6 + resolution: "@vitest/utils@npm:3.0.6" + dependencies: + "@vitest/pretty-format": "npm:3.0.6" + loupe: "npm:^3.1.3" + tinyrainbow: "npm:^2.0.0" + checksum: 10c0/6b0e89e26c96fcfd825e0795f586336df6a02524a11e9ac3e576b7ed9738a9e4b69cd79d0b69b23c195cc4c6bdd907f1d8f7aa79a4ee0cb85393c94a1aa85267 + languageName: node + linkType: hard + +"@vitest/utils@npm:3.0.8": + version: 3.0.8 + resolution: "@vitest/utils@npm:3.0.8" + dependencies: + "@vitest/pretty-format": "npm:3.0.8" + loupe: "npm:^3.1.3" + tinyrainbow: "npm:^2.0.0" + checksum: 10c0/929e71582d27f5ec2fe422d72112471b36517620beb2c4398c116598ca55b36340b0fa97958d8584bc05153d92dbd60324664d5b623ec6eed8c72e50e226633c + languageName: node + linkType: hard + "abbrev@npm:^2.0.0": version: 2.0.0 resolution: "abbrev@npm:2.0.0" @@ -2142,6 +2618,13 @@ __metadata: languageName: node linkType: hard +"assertion-error@npm:^2.0.1": + version: 2.0.1 + resolution: "assertion-error@npm:2.0.1" + checksum: 10c0/bbbcb117ac6480138f8c93cf7f535614282dea9dc828f540cdece85e3c665e8f78958b96afac52f29ff883c72638e6a87d469ecc9fe5bc902df03ed24a55dba8 + languageName: node + linkType: hard + "assign-symbols@npm:^1.0.0": version: 1.0.0 resolution: "assign-symbols@npm:1.0.0" @@ -2492,6 +2975,13 @@ __metadata: languageName: node linkType: hard +"cac@npm:^6.7.14": + version: 6.7.14 + resolution: "cac@npm:6.7.14" + checksum: 10c0/4ee06aaa7bab8981f0d54e5f5f9d4adcd64058e9697563ce336d8a3878ed018ee18ebe5359b2430eceae87e0758e62ea2019c3f52ae6e211b1bd2e133856cd10 + languageName: node + linkType: hard + "cacache@npm:^19.0.1": version: 19.0.1 resolution: "cacache@npm:19.0.1" @@ -2586,6 +3076,19 @@ __metadata: languageName: node linkType: hard +"chai@npm:^5.2.0": + version: 5.2.0 + resolution: "chai@npm:5.2.0" + dependencies: + assertion-error: "npm:^2.0.1" + check-error: "npm:^2.1.1" + deep-eql: "npm:^5.0.1" + loupe: "npm:^3.1.0" + pathval: "npm:^2.0.0" + checksum: 10c0/dfd1cb719c7cebb051b727672d382a35338af1470065cb12adb01f4ee451bbf528e0e0f9ab2016af5fc1eea4df6e7f4504dc8443f8f00bd8fb87ad32dc516f7d + languageName: node + linkType: hard + "chalk@npm:^4.0.0, chalk@npm:^4.0.2, chalk@npm:^4.1.0": version: 4.1.2 resolution: "chalk@npm:4.1.2" @@ -2610,6 +3113,13 @@ __metadata: languageName: node linkType: hard +"check-error@npm:^2.1.1": + version: 2.1.1 + resolution: "check-error@npm:2.1.1" + checksum: 10c0/979f13eccab306cf1785fa10941a590b4e7ea9916ea2a4f8c87f0316fc3eab07eabefb6e587424ef0f88cbcd3805791f172ea739863ca3d7ce2afc54641c7f0e + languageName: node + linkType: hard + "chokidar@npm:^1.6.0": version: 1.7.0 resolution: "chokidar@npm:1.7.0" @@ -2884,7 +3394,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.4": +"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.4, debug@npm:^4.4.0": version: 4.4.0 resolution: "debug@npm:4.4.0" dependencies: @@ -2896,18 +3406,6 @@ __metadata: languageName: node linkType: hard -"debug@npm:4.3.1": - version: 4.3.1 - resolution: "debug@npm:4.3.1" - dependencies: - ms: "npm:2.1.2" - peerDependenciesMeta: - supports-color: - optional: true - checksum: 10c0/610bcc2eb07c533d6a9964478422f7d741095d67301888ee0b77b8f2ad0a15d115c93fb2adb13d10a9eda3d81f2d4d335405540b09596fb23aca070e77497d95 - languageName: node - linkType: hard - "debug@npm:^2.2.0, debug@npm:^2.3.3": version: 2.6.9 resolution: "debug@npm:2.6.9" @@ -2996,7 +3494,7 @@ __metadata: languageName: node linkType: hard -"decompress@npm:^4.0.0, decompress@npm:^4.2.1": +"decompress@npm:^4.0.0": version: 4.2.1 resolution: "decompress@npm:4.2.1" dependencies: @@ -3024,10 +3522,10 @@ __metadata: languageName: node linkType: hard -"deep-is@npm:^0.1.3": - version: 0.1.4 - resolution: "deep-is@npm:0.1.4" - checksum: 10c0/7f0ee496e0dff14a573dc6127f14c95061b448b87b995fc96c017ce0a1e66af1675e73f1d6064407975bc4ea6ab679497a29fff7b5b9c4e99cb10797c1ad0b4c +"deep-eql@npm:^5.0.1": + version: 5.0.2 + resolution: "deep-eql@npm:5.0.2" + checksum: 10c0/7102cf3b7bb719c6b9c0db2e19bf0aa9318d141581befe8c7ce8ccd39af9eaa4346e5e05adef7f9bd7015da0f13a3a25dcfe306ef79dc8668aedbecb658dd247 languageName: node linkType: hard @@ -3135,7 +3633,7 @@ __metadata: languageName: node linkType: hard -"duplexer@npm:^0.1.1, duplexer@npm:~0.1.1": +"duplexer@npm:^0.1.1": version: 0.1.2 resolution: "duplexer@npm:0.1.2" checksum: 10c0/c57bcd4bdf7e623abab2df43a7b5b23d18152154529d166c1e0da6bee341d84c432d157d7e97b32fecb1bf3a8b8857dd85ed81a915789f550637ed25b8e64fc2 @@ -3239,6 +3737,99 @@ __metadata: languageName: node linkType: hard +"es-module-lexer@npm:^1.6.0": + version: 1.6.0 + resolution: "es-module-lexer@npm:1.6.0" + checksum: 10c0/667309454411c0b95c476025929881e71400d74a746ffa1ff4cb450bd87f8e33e8eef7854d68e401895039ac0bac64e7809acbebb6253e055dd49ea9e3ea9212 + languageName: node + linkType: hard + +"esbuild@npm:^0.24.2": + version: 0.24.2 + resolution: "esbuild@npm:0.24.2" + dependencies: + "@esbuild/aix-ppc64": "npm:0.24.2" + "@esbuild/android-arm": "npm:0.24.2" + "@esbuild/android-arm64": "npm:0.24.2" + "@esbuild/android-x64": "npm:0.24.2" + "@esbuild/darwin-arm64": "npm:0.24.2" + "@esbuild/darwin-x64": "npm:0.24.2" + "@esbuild/freebsd-arm64": "npm:0.24.2" + "@esbuild/freebsd-x64": "npm:0.24.2" + "@esbuild/linux-arm": "npm:0.24.2" + "@esbuild/linux-arm64": "npm:0.24.2" + "@esbuild/linux-ia32": "npm:0.24.2" + "@esbuild/linux-loong64": "npm:0.24.2" + "@esbuild/linux-mips64el": "npm:0.24.2" + "@esbuild/linux-ppc64": "npm:0.24.2" + "@esbuild/linux-riscv64": "npm:0.24.2" + "@esbuild/linux-s390x": "npm:0.24.2" + "@esbuild/linux-x64": "npm:0.24.2" + "@esbuild/netbsd-arm64": "npm:0.24.2" + "@esbuild/netbsd-x64": "npm:0.24.2" + "@esbuild/openbsd-arm64": "npm:0.24.2" + "@esbuild/openbsd-x64": "npm:0.24.2" + "@esbuild/sunos-x64": "npm:0.24.2" + "@esbuild/win32-arm64": "npm:0.24.2" + "@esbuild/win32-ia32": "npm:0.24.2" + "@esbuild/win32-x64": "npm:0.24.2" + dependenciesMeta: + "@esbuild/aix-ppc64": + optional: true + "@esbuild/android-arm": + optional: true + "@esbuild/android-arm64": + optional: true + "@esbuild/android-x64": + optional: true + "@esbuild/darwin-arm64": + optional: true + "@esbuild/darwin-x64": + optional: true + "@esbuild/freebsd-arm64": + optional: true + "@esbuild/freebsd-x64": + optional: true + "@esbuild/linux-arm": + optional: true + "@esbuild/linux-arm64": + optional: true + "@esbuild/linux-ia32": + optional: true + "@esbuild/linux-loong64": + optional: true + "@esbuild/linux-mips64el": + optional: true + "@esbuild/linux-ppc64": + optional: true + "@esbuild/linux-riscv64": + optional: true + "@esbuild/linux-s390x": + optional: true + "@esbuild/linux-x64": + optional: true + "@esbuild/netbsd-arm64": + optional: true + "@esbuild/netbsd-x64": + optional: true + "@esbuild/openbsd-arm64": + optional: true + "@esbuild/openbsd-x64": + optional: true + "@esbuild/sunos-x64": + optional: true + "@esbuild/win32-arm64": + optional: true + "@esbuild/win32-ia32": + optional: true + "@esbuild/win32-x64": + optional: true + bin: + esbuild: bin/esbuild + checksum: 10c0/5a25bb08b6ba23db6e66851828d848bd3ff87c005a48c02d83e38879058929878a6baa5a414e1141faee0d1dece3f32b5fbc2a87b82ed6a7aa857cf40359aeb5 + languageName: node + linkType: hard + "escalade@npm:^3.1.1, escalade@npm:^3.2.0": version: 3.2.0 resolution: "escalade@npm:3.2.0" @@ -3270,18 +3861,12 @@ __metadata: languageName: node linkType: hard -"event-stream@npm:=3.3.4": - version: 3.3.4 - resolution: "event-stream@npm:3.3.4" +"estree-walker@npm:^3.0.3": + version: 3.0.3 + resolution: "estree-walker@npm:3.0.3" dependencies: - duplexer: "npm:~0.1.1" - from: "npm:~0" - map-stream: "npm:~0.1.0" - pause-stream: "npm:0.0.11" - split: "npm:0.3" - stream-combiner: "npm:~0.0.4" - through: "npm:~2.3.1" - checksum: 10c0/c3ec4e1efc27ab3e73a98923f0a2fa9a19051b87068fea2f3d53d2e4e8c5cfdadf8c8a115b17f3d90b16a46432d396bad91b6e8d0cceb3e449be717a03b75209 + "@types/estree": "npm:^1.0.0" + checksum: 10c0/c12e3c2b2642d2bcae7d5aa495c60fa2f299160946535763969a1c83fc74518ffa9c2cd3a8b69ac56aea547df6a8aac25f729a342992ef0bbac5f1c73e78995d languageName: node linkType: hard @@ -3363,6 +3948,13 @@ __metadata: languageName: node linkType: hard +"expect-type@npm:^1.1.0": + version: 1.1.0 + resolution: "expect-type@npm:1.1.0" + checksum: 10c0/5af0febbe8fe18da05a6d51e3677adafd75213512285408156b368ca471252565d5ca6e59e4bddab25121f3cfcbbebc6a5489f8cc9db131cc29e69dcdcc7ae15 + languageName: node + linkType: hard + "expect@npm:^29.0.0, expect@npm:^29.7.0": version: 29.7.0 resolution: "expect@npm:29.7.0" @@ -3680,13 +4272,6 @@ __metadata: languageName: node linkType: hard -"from@npm:~0": - version: 0.1.7 - resolution: "from@npm:0.1.7" - checksum: 10c0/3aab5aea8fe8e1f12a5dee7f390d46a93431ce691b6222dcd5701c5d34378e51ca59b44967da1105a0f90fcdf5d7629d963d51e7ccd79827d19693bdcfb688d4 - languageName: node - linkType: hard - "fs-constants@npm:^1.0.0": version: 1.0.0 resolution: "fs-constants@npm:1.0.0" @@ -3721,7 +4306,7 @@ __metadata: languageName: node linkType: hard -"fsevents@npm:^2.3.2": +"fsevents@npm:^2.3.2, fsevents@npm:~2.3.2, fsevents@npm:~2.3.3": version: 2.3.3 resolution: "fsevents@npm:2.3.3" dependencies: @@ -3741,7 +4326,7 @@ __metadata: languageName: node linkType: hard -"fsevents@patch:fsevents@npm%3A^2.3.2#optional!builtin": +"fsevents@patch:fsevents@npm%3A^2.3.2#optional!builtin, fsevents@patch:fsevents@npm%3A~2.3.2#optional!builtin, fsevents@patch:fsevents@npm%3A~2.3.3#optional!builtin": version: 2.3.3 resolution: "fsevents@patch:fsevents@npm%3A2.3.3#optional!builtin::version=2.3.3&hash=df0bf1" dependencies: @@ -4136,13 +4721,6 @@ __metadata: languageName: node linkType: hard -"ip-regex@npm:^4.1.0": - version: 4.3.0 - resolution: "ip-regex@npm:4.3.0" - checksum: 10c0/f9ef1f5d0df05b9133a882974e572ae525ccd205260cb103dae337f1fc7451ed783391acc6ad688e56dd2598f769e8e72ecbb650ec34763396af822a91768562 - languageName: node - linkType: hard - "is-accessor-descriptor@npm:^1.0.1": version: 1.0.1 resolution: "is-accessor-descriptor@npm:1.0.1" @@ -4386,13 +4964,6 @@ __metadata: languageName: node linkType: hard -"is-url@npm:^1.2.4": - version: 1.2.4 - resolution: "is-url@npm:1.2.4" - checksum: 10c0/0157a79874f8f95fdd63540e3f38c8583c2ef572661cd0693cda80ae3e42dfe8e9a4a972ec1b827f861d9a9acf75b37f7d58a37f94a8a053259642912c252bc3 - languageName: node - linkType: hard - "is-utf8@npm:^0.2.0": version: 0.2.1 resolution: "is-utf8@npm:0.2.1" @@ -4407,17 +4978,6 @@ __metadata: languageName: node linkType: hard -"is2@npm:^2.0.6": - version: 2.0.9 - resolution: "is2@npm:2.0.9" - dependencies: - deep-is: "npm:^0.1.3" - ip-regex: "npm:^4.1.0" - is-url: "npm:^1.2.4" - checksum: 10c0/51090a2ad046651c1523e6aec98843c2be4b61fdafa5a68d89966b7d3b7116fdc68cfb218cfc3825eb20175fa741de2f89249546352dbc4ac1d86847fa4a084a - languageName: node - linkType: hard - "isarray@npm:1.0.0, isarray@npm:~1.0.0": version: 1.0.0 resolution: "isarray@npm:1.0.0" @@ -5394,6 +5954,13 @@ __metadata: languageName: node linkType: hard +"loupe@npm:^3.1.0, loupe@npm:^3.1.3": + version: 3.1.3 + resolution: "loupe@npm:3.1.3" + checksum: 10c0/f5dab4144254677de83a35285be1b8aba58b3861439ce4ba65875d0d5f3445a4a496daef63100ccf02b2dbc25bf58c6db84c9cb0b96d6435331e9d0a33b48541 + languageName: node + linkType: hard + "lowercase-keys@npm:^1.0.0": version: 1.0.1 resolution: "lowercase-keys@npm:1.0.1" @@ -5417,6 +5984,15 @@ __metadata: languageName: node linkType: hard +"magic-string@npm:^0.30.17": + version: 0.30.17 + resolution: "magic-string@npm:0.30.17" + dependencies: + "@jridgewell/sourcemap-codec": "npm:^1.5.0" + checksum: 10c0/16826e415d04b88378f200fe022b53e638e3838b9e496edda6c0e086d7753a44a6ed187adc72d19f3623810589bf139af1a315541cd6a26ae0771a0193eaf7b8 + languageName: node + linkType: hard + "make-dir@npm:^1.0.0": version: 1.3.0 resolution: "make-dir@npm:1.3.0" @@ -5484,13 +6060,6 @@ __metadata: languageName: node linkType: hard -"map-stream@npm:~0.1.0": - version: 0.1.0 - resolution: "map-stream@npm:0.1.0" - checksum: 10c0/7dd6debe511c1b55d9da75e1efa65a28b1252a2d8357938d2e49b412713c478efbaefb0cdf0ee0533540c3bf733e8f9f71e1a15aa0fe74bf71b64e75bf1576bd - languageName: node - linkType: hard - "map-visit@npm:^1.0.0": version: 1.0.0 resolution: "map-visit@npm:1.0.0" @@ -5833,13 +6402,6 @@ __metadata: languageName: node linkType: hard -"ms@npm:2.1.2": - version: 2.1.2 - resolution: "ms@npm:2.1.2" - checksum: 10c0/a437714e2f90dbf881b5191d35a6db792efbca5badf112f87b9e1c712aace4b4b9b742dd6537f3edf90fd6f684de897cec230abde57e87883766712ddda297cc - languageName: node - linkType: hard - "ms@npm:^2.0.0, ms@npm:^2.1.1, ms@npm:^2.1.3": version: 2.1.3 resolution: "ms@npm:2.1.3" @@ -5865,6 +6427,15 @@ __metadata: languageName: node linkType: hard +"nanoid@npm:^3.3.8": + version: 3.3.8 + resolution: "nanoid@npm:3.3.8" + bin: + nanoid: bin/nanoid.cjs + checksum: 10c0/4b1bb29f6cfebf3be3bc4ad1f1296fb0a10a3043a79f34fbffe75d1621b4318319211cd420549459018ea3592f0d2f159247a6f874911d6d26eaaadda2478120 + languageName: node + linkType: hard + "nanomatch@npm:^1.2.9": version: 1.2.13 resolution: "nanomatch@npm:1.2.13" @@ -6389,12 +6960,17 @@ __metadata: languageName: node linkType: hard -"pause-stream@npm:0.0.11": - version: 0.0.11 - resolution: "pause-stream@npm:0.0.11" - dependencies: - through: "npm:~2.3" - checksum: 10c0/86f12c64cdaaa8e45ebaca4e39a478e1442db8b4beabc280b545bfaf79c0e2f33c51efb554aace5c069cc441c7b924ba484837b345eaa4ba6fc940d62f826802 +"pathe@npm:^2.0.3": + version: 2.0.3 + resolution: "pathe@npm:2.0.3" + checksum: 10c0/c118dc5a8b5c4166011b2b70608762e260085180bb9e33e80a50dcdb1e78c010b1624f4280c492c92b05fc276715a4c357d1f9edc570f8f1b3d90b6839ebaca1 + languageName: node + linkType: hard + +"pathval@npm:^2.0.0": + version: 2.0.0 + resolution: "pathval@npm:2.0.0" + checksum: 10c0/602e4ee347fba8a599115af2ccd8179836a63c925c23e04bd056d0674a64b39e3a081b643cc7bc0b84390517df2d800a46fcc5598d42c155fe4977095c2f77c5 languageName: node linkType: hard @@ -6415,7 +6991,7 @@ __metadata: languageName: node linkType: hard -"picocolors@npm:^1.0.0, picocolors@npm:^1.1.0": +"picocolors@npm:^1.0.0, picocolors@npm:^1.1.0, picocolors@npm:^1.1.1": version: 1.1.1 resolution: "picocolors@npm:1.1.1" checksum: 10c0/e2e3e8170ab9d7c7421969adaa7e1b31434f789afb9b3f115f6b96d91945041ac3ceb02e9ec6fe6510ff036bcc0bf91e69a1772edc0b707e12b19c0f2d6bcf58 @@ -6482,6 +7058,17 @@ __metadata: languageName: node linkType: hard +"postcss@npm:^8.5.2": + version: 8.5.3 + resolution: "postcss@npm:8.5.3" + dependencies: + nanoid: "npm:^3.3.8" + picocolors: "npm:^1.1.1" + source-map-js: "npm:^1.2.1" + checksum: 10c0/b75510d7b28c3ab728c8733dd01538314a18c52af426f199a3c9177e63eb08602a3938bfb66b62dc01350b9aed62087eabbf229af97a1659eb8d3513cec823b3 + languageName: node + linkType: hard + "prebuildify@npm:^6.0.1": version: 6.0.1 resolution: "prebuildify@npm:6.0.1" @@ -6564,17 +7151,6 @@ __metadata: languageName: node linkType: hard -"ps-tree@npm:^1.2.0": - version: 1.2.0 - resolution: "ps-tree@npm:1.2.0" - dependencies: - event-stream: "npm:=3.3.4" - bin: - ps-tree: ./bin/ps-tree.js - checksum: 10c0/9d1c159e0890db5aa05f84d125193c2190a6c4ecd457596fd25e7611f8f747292a846459dcc0244e27d45529d4cea6d1010c3a2a087fad02624d12fdb7d97c22 - languageName: node - linkType: hard - "pump@npm:^3.0.0": version: 3.0.2 resolution: "pump@npm:3.0.2" @@ -6946,6 +7522,78 @@ __metadata: languageName: node linkType: hard +"rollup@npm:^4.30.1": + version: 4.34.8 + resolution: "rollup@npm:4.34.8" + dependencies: + "@rollup/rollup-android-arm-eabi": "npm:4.34.8" + "@rollup/rollup-android-arm64": "npm:4.34.8" + "@rollup/rollup-darwin-arm64": "npm:4.34.8" + "@rollup/rollup-darwin-x64": "npm:4.34.8" + "@rollup/rollup-freebsd-arm64": "npm:4.34.8" + "@rollup/rollup-freebsd-x64": "npm:4.34.8" + "@rollup/rollup-linux-arm-gnueabihf": "npm:4.34.8" + "@rollup/rollup-linux-arm-musleabihf": "npm:4.34.8" + "@rollup/rollup-linux-arm64-gnu": "npm:4.34.8" + "@rollup/rollup-linux-arm64-musl": "npm:4.34.8" + "@rollup/rollup-linux-loongarch64-gnu": "npm:4.34.8" + "@rollup/rollup-linux-powerpc64le-gnu": "npm:4.34.8" + "@rollup/rollup-linux-riscv64-gnu": "npm:4.34.8" + "@rollup/rollup-linux-s390x-gnu": "npm:4.34.8" + "@rollup/rollup-linux-x64-gnu": "npm:4.34.8" + "@rollup/rollup-linux-x64-musl": "npm:4.34.8" + "@rollup/rollup-win32-arm64-msvc": "npm:4.34.8" + "@rollup/rollup-win32-ia32-msvc": "npm:4.34.8" + "@rollup/rollup-win32-x64-msvc": "npm:4.34.8" + "@types/estree": "npm:1.0.6" + fsevents: "npm:~2.3.2" + dependenciesMeta: + "@rollup/rollup-android-arm-eabi": + optional: true + "@rollup/rollup-android-arm64": + optional: true + "@rollup/rollup-darwin-arm64": + optional: true + "@rollup/rollup-darwin-x64": + optional: true + "@rollup/rollup-freebsd-arm64": + optional: true + "@rollup/rollup-freebsd-x64": + optional: true + "@rollup/rollup-linux-arm-gnueabihf": + optional: true + "@rollup/rollup-linux-arm-musleabihf": + optional: true + "@rollup/rollup-linux-arm64-gnu": + optional: true + "@rollup/rollup-linux-arm64-musl": + optional: true + "@rollup/rollup-linux-loongarch64-gnu": + optional: true + "@rollup/rollup-linux-powerpc64le-gnu": + optional: true + "@rollup/rollup-linux-riscv64-gnu": + optional: true + "@rollup/rollup-linux-s390x-gnu": + optional: true + "@rollup/rollup-linux-x64-gnu": + optional: true + "@rollup/rollup-linux-x64-musl": + optional: true + "@rollup/rollup-win32-arm64-msvc": + optional: true + "@rollup/rollup-win32-ia32-msvc": + optional: true + "@rollup/rollup-win32-x64-msvc": + optional: true + fsevents: + optional: true + bin: + rollup: dist/bin/rollup + checksum: 10c0/b9e711e33413112fbb761107c3fddc4561dfc74335c393542a829a85ccfb2763bfd17bf2422d84a2e9bee7646e5367018973e97005fdf64e49c2e209612f0eb6 + languageName: node + linkType: hard + "root-workspace-0b6124@workspace:.": version: 0.0.0-use.local resolution: "root-workspace-0b6124@workspace:." @@ -7075,6 +7723,13 @@ __metadata: languageName: node linkType: hard +"siginfo@npm:^2.0.0": + version: 2.0.0 + resolution: "siginfo@npm:2.0.0" + checksum: 10c0/3def8f8e516fbb34cb6ae415b07ccc5d9c018d85b4b8611e3dc6f8be6d1899f693a4382913c9ed51a06babb5201639d76453ab297d1c54a456544acf5c892e34 + languageName: node + linkType: hard + "signal-exit@npm:^3.0.0, signal-exit@npm:^3.0.3, signal-exit@npm:^3.0.7": version: 3.0.7 resolution: "signal-exit@npm:3.0.7" @@ -7185,6 +7840,13 @@ __metadata: languageName: node linkType: hard +"source-map-js@npm:^1.2.1": + version: 1.2.1 + resolution: "source-map-js@npm:1.2.1" + checksum: 10c0/7bda1fc4c197e3c6ff17de1b8b2c20e60af81b63a52cb32ec5a5d67a20a7d42651e2cb34ebe93833c5a2a084377e17455854fee3e21e7925c64a51b6a52b0faf + languageName: node + linkType: hard + "source-map-resolve@npm:^0.5.0": version: 0.5.3 resolution: "source-map-resolve@npm:0.5.3" @@ -7279,15 +7941,6 @@ __metadata: languageName: node linkType: hard -"split@npm:0.3": - version: 0.3.3 - resolution: "split@npm:0.3.3" - dependencies: - through: "npm:2" - checksum: 10c0/88c09b1b4de84953bf5d6c153123a1fbb20addfea9381f70d27b4eb6b2bfbadf25d313f8f5d3fd727d5679b97bfe54da04766b91010f131635bf49e51d5db3fc - languageName: node - linkType: hard - "sprintf-js@npm:^1.1.3": version: 1.1.3 resolution: "sprintf-js@npm:1.1.3" @@ -7320,6 +7973,13 @@ __metadata: languageName: node linkType: hard +"stackback@npm:0.0.2": + version: 0.0.2 + resolution: "stackback@npm:0.0.2" + checksum: 10c0/89a1416668f950236dd5ac9f9a6b2588e1b9b62b1b6ad8dff1bfc5d1a15dbf0aafc9b52d2226d00c28dffff212da464eaeebfc6b7578b9d180cef3e3782c5983 + languageName: node + linkType: hard + "static-extend@npm:^0.1.1": version: 0.1.2 resolution: "static-extend@npm:0.1.2" @@ -7330,12 +7990,10 @@ __metadata: languageName: node linkType: hard -"stream-combiner@npm:~0.0.4": - version: 0.0.4 - resolution: "stream-combiner@npm:0.0.4" - dependencies: - duplexer: "npm:~0.1.1" - checksum: 10c0/8075a94c0eb0f20450a8236cb99d4ce3ea6e6a4b36d8baa7440b1a08cde6ffd227debadffaecd80993bd334282875d0e927ab5b88484625e01970dd251004ff5 +"std-env@npm:^3.8.0": + version: 3.8.0 + resolution: "std-env@npm:3.8.0" + checksum: 10c0/f560a2902fd0fa3d648d7d0acecbd19d664006f7372c1fba197ed4c216b4c9e48db6e2769b5fe1616d42a9333c9f066c5011935035e85c59f45dc4f796272040 languageName: node linkType: hard @@ -7561,25 +8219,6 @@ __metadata: languageName: node linkType: hard -"tcp-port-used@npm:^1.0.2": - version: 1.0.2 - resolution: "tcp-port-used@npm:1.0.2" - dependencies: - debug: "npm:4.3.1" - is2: "npm:^2.0.6" - checksum: 10c0/a5fb29e35f1e452f1064e3671d02b6d65e7d9bffad98d8da688270b6ffdaa9a8351fe8321aedf131f3904af70b569d9c5f6d9fe75d57dda19c466abac2bc025a - languageName: node - linkType: hard - -"terminate@npm:2.6.1": - version: 2.6.1 - resolution: "terminate@npm:2.6.1" - dependencies: - ps-tree: "npm:^1.2.0" - checksum: 10c0/1174aa66462da601248d09a29243d81722b65d6b8ff198d7a9fdb50a4e90182ea2ea012ab73e19775538a09f01c99e52107654fd425b8048562ddf70d810886a - languageName: node - linkType: hard - "test-exclude@npm:^6.0.0": version: 6.0.0 resolution: "test-exclude@npm:6.0.0" @@ -7591,7 +8230,7 @@ __metadata: languageName: node linkType: hard -"through@npm:2, through@npm:^2.3.8, through@npm:~2.3, through@npm:~2.3.1": +"through@npm:^2.3.8": version: 2.3.8 resolution: "through@npm:2.3.8" checksum: 10c0/4b09f3774099de0d4df26d95c5821a62faee32c7e96fb1f4ebd54a2d7c11c57fe88b0a0d49cf375de5fee5ae6bf4eb56dbbf29d07366864e2ee805349970d3cc @@ -7605,6 +8244,41 @@ __metadata: languageName: node linkType: hard +"tinybench@npm:^2.9.0": + version: 2.9.0 + resolution: "tinybench@npm:2.9.0" + checksum: 10c0/c3500b0f60d2eb8db65250afe750b66d51623057ee88720b7f064894a6cb7eb93360ca824a60a31ab16dab30c7b1f06efe0795b352e37914a9d4bad86386a20c + languageName: node + linkType: hard + +"tinyexec@npm:^0.3.2": + version: 0.3.2 + resolution: "tinyexec@npm:0.3.2" + checksum: 10c0/3efbf791a911be0bf0821eab37a3445c2ba07acc1522b1fa84ae1e55f10425076f1290f680286345ed919549ad67527d07281f1c19d584df3b74326909eb1f90 + languageName: node + linkType: hard + +"tinypool@npm:^1.0.2": + version: 1.0.2 + resolution: "tinypool@npm:1.0.2" + checksum: 10c0/31ac184c0ff1cf9a074741254fe9ea6de95026749eb2b8ec6fd2b9d8ca94abdccda731f8e102e7f32e72ed3b36d32c6975fd5f5523df3f1b6de6c3d8dfd95e63 + languageName: node + linkType: hard + +"tinyrainbow@npm:^2.0.0": + version: 2.0.0 + resolution: "tinyrainbow@npm:2.0.0" + checksum: 10c0/c83c52bef4e0ae7fb8ec6a722f70b5b6fa8d8be1c85792e829f56c0e1be94ab70b293c032dc5048d4d37cfe678f1f5babb04bdc65fd123098800148ca989184f + languageName: node + linkType: hard + +"tinyspy@npm:^3.0.2": + version: 3.0.2 + resolution: "tinyspy@npm:3.0.2" + checksum: 10c0/55ffad24e346622b59292e097c2ee30a63919d5acb7ceca87fc0d1c223090089890587b426e20054733f97a58f20af2c349fb7cc193697203868ab7ba00bcea0 + languageName: node + linkType: hard + "tmpl@npm:1.0.5": version: 1.0.5 resolution: "tmpl@npm:1.0.5" @@ -7975,6 +8649,194 @@ __metadata: languageName: node linkType: hard +"vite-node@npm:3.0.6": + version: 3.0.6 + resolution: "vite-node@npm:3.0.6" + dependencies: + cac: "npm:^6.7.14" + debug: "npm:^4.4.0" + es-module-lexer: "npm:^1.6.0" + pathe: "npm:^2.0.3" + vite: "npm:^5.0.0 || ^6.0.0" + bin: + vite-node: vite-node.mjs + checksum: 10c0/bfef19ac659b453c31fc00b42f8d08b3f7539092f67b0b02504dc2f802af1fe9bcf3531a4ecd248bf8ce2f00b7f4b9a67e20cdd57c2e50d9ff8cea5ff941bedd + languageName: node + linkType: hard + +"vite-node@npm:3.0.8": + version: 3.0.8 + resolution: "vite-node@npm:3.0.8" + dependencies: + cac: "npm:^6.7.14" + debug: "npm:^4.4.0" + es-module-lexer: "npm:^1.6.0" + pathe: "npm:^2.0.3" + vite: "npm:^5.0.0 || ^6.0.0" + bin: + vite-node: vite-node.mjs + checksum: 10c0/1e7243ad04edc71ccff67b1a686cc85b59ad803645b83c524eab6cde92d6c8f06d595cc99cd3236b4017de27d6760808c419711cd728471eb36ec9a6734ef651 + languageName: node + linkType: hard + +"vite@npm:^5.0.0 || ^6.0.0": + version: 6.1.1 + resolution: "vite@npm:6.1.1" + dependencies: + esbuild: "npm:^0.24.2" + fsevents: "npm:~2.3.3" + postcss: "npm:^8.5.2" + rollup: "npm:^4.30.1" + peerDependencies: + "@types/node": ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: ">=1.21.0" + less: "*" + lightningcss: ^1.21.0 + sass: "*" + sass-embedded: "*" + stylus: "*" + sugarss: "*" + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + dependenciesMeta: + fsevents: + optional: true + peerDependenciesMeta: + "@types/node": + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + bin: + vite: bin/vite.js + checksum: 10c0/4ec5ddc9436951a68b213cd59c2a157663ef423658c387400774582ea33da40dcae18e55f3adb3b629173e2183b10d49db8370bc51a0aa89797e4ca5a34702a0 + languageName: node + linkType: hard + +"vitest@npm:^3.0.6": + version: 3.0.6 + resolution: "vitest@npm:3.0.6" + dependencies: + "@vitest/expect": "npm:3.0.6" + "@vitest/mocker": "npm:3.0.6" + "@vitest/pretty-format": "npm:^3.0.6" + "@vitest/runner": "npm:3.0.6" + "@vitest/snapshot": "npm:3.0.6" + "@vitest/spy": "npm:3.0.6" + "@vitest/utils": "npm:3.0.6" + chai: "npm:^5.2.0" + debug: "npm:^4.4.0" + expect-type: "npm:^1.1.0" + magic-string: "npm:^0.30.17" + pathe: "npm:^2.0.3" + std-env: "npm:^3.8.0" + tinybench: "npm:^2.9.0" + tinyexec: "npm:^0.3.2" + tinypool: "npm:^1.0.2" + tinyrainbow: "npm:^2.0.0" + vite: "npm:^5.0.0 || ^6.0.0" + vite-node: "npm:3.0.6" + why-is-node-running: "npm:^2.3.0" + peerDependencies: + "@edge-runtime/vm": "*" + "@types/debug": ^4.1.12 + "@types/node": ^18.0.0 || ^20.0.0 || >=22.0.0 + "@vitest/browser": 3.0.6 + "@vitest/ui": 3.0.6 + happy-dom: "*" + jsdom: "*" + peerDependenciesMeta: + "@edge-runtime/vm": + optional: true + "@types/debug": + optional: true + "@types/node": + optional: true + "@vitest/browser": + optional: true + "@vitest/ui": + optional: true + happy-dom: + optional: true + jsdom: + optional: true + bin: + vitest: vitest.mjs + checksum: 10c0/e50a08f8508a7dbda1ea985b2ba05483ab6f87e100a9388c6c4bc47ee76fcdebe89b33db320df177ea6d198fc50e98eb4b9650bb9d314dd8a7bfe885659b3d42 + languageName: node + linkType: hard + +"vitest@npm:^3.0.8": + version: 3.0.8 + resolution: "vitest@npm:3.0.8" + dependencies: + "@vitest/expect": "npm:3.0.8" + "@vitest/mocker": "npm:3.0.8" + "@vitest/pretty-format": "npm:^3.0.8" + "@vitest/runner": "npm:3.0.8" + "@vitest/snapshot": "npm:3.0.8" + "@vitest/spy": "npm:3.0.8" + "@vitest/utils": "npm:3.0.8" + chai: "npm:^5.2.0" + debug: "npm:^4.4.0" + expect-type: "npm:^1.1.0" + magic-string: "npm:^0.30.17" + pathe: "npm:^2.0.3" + std-env: "npm:^3.8.0" + tinybench: "npm:^2.9.0" + tinyexec: "npm:^0.3.2" + tinypool: "npm:^1.0.2" + tinyrainbow: "npm:^2.0.0" + vite: "npm:^5.0.0 || ^6.0.0" + vite-node: "npm:3.0.8" + why-is-node-running: "npm:^2.3.0" + peerDependencies: + "@edge-runtime/vm": "*" + "@types/debug": ^4.1.12 + "@types/node": ^18.0.0 || ^20.0.0 || >=22.0.0 + "@vitest/browser": 3.0.8 + "@vitest/ui": 3.0.8 + happy-dom: "*" + jsdom: "*" + peerDependenciesMeta: + "@edge-runtime/vm": + optional: true + "@types/debug": + optional: true + "@types/node": + optional: true + "@vitest/browser": + optional: true + "@vitest/ui": + optional: true + happy-dom: + optional: true + jsdom: + optional: true + bin: + vitest: vitest.mjs + checksum: 10c0/007a951c4e10ceda1eecad38e5bcc7aa25ed90269614e1394eb2c5fa5f51bbe05d915bcec27fc2e18da8bdea27cea80d428095ef818b97857c51422fddda34ff + languageName: node + linkType: hard + "walker@npm:^1.0.8": version: 1.0.8 resolution: "walker@npm:1.0.8" @@ -8037,6 +8899,18 @@ __metadata: languageName: node linkType: hard +"why-is-node-running@npm:^2.3.0": + version: 2.3.0 + resolution: "why-is-node-running@npm:2.3.0" + dependencies: + siginfo: "npm:^2.0.0" + stackback: "npm:0.0.2" + bin: + why-is-node-running: cli.js + checksum: 10c0/1cde0b01b827d2cf4cb11db962f3958b9175d5d9e7ac7361d1a7b0e2dc6069a263e69118bd974c4f6d0a890ef4eedfe34cf3d5167ec14203dbc9a18620537054 + languageName: node + linkType: hard + "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0, wrap-ansi@npm:^7.0.0": version: 7.0.0 resolution: "wrap-ansi@npm:7.0.0" diff --git a/joi/package.json b/joi/package.json index 69bdb243e..2f7d771d5 100644 --- a/joi/package.json +++ b/joi/package.json @@ -30,6 +30,7 @@ "dependencies": { "@radix-ui/react-accordion": "^1.1.2", "@radix-ui/react-dialog": "^1.0.5", + "@radix-ui/react-dropdown-menu": "^2.1.4", "@radix-ui/react-icons": "^1.3.0", "@radix-ui/react-scroll-area": "^1.0.5", "@radix-ui/react-select": "^2.0.0", diff --git a/joi/src/core/Dropdown/index.tsx b/joi/src/core/Dropdown/index.tsx new file mode 100644 index 000000000..6d9abcbea --- /dev/null +++ b/joi/src/core/Dropdown/index.tsx @@ -0,0 +1,45 @@ +import React, { Fragment, PropsWithChildren, ReactNode } from 'react' +import * as DropdownMenu from '@radix-ui/react-dropdown-menu' +import './styles.scss' +import { twMerge } from 'tailwind-merge' + +type Props = { + options?: { name: ReactNode; value: string; suffix?: ReactNode }[] + className?: string + onValueChanged?: (value: string) => void +} + +const Dropdown = (props: PropsWithChildren & Props) => { + return ( + + {props.children} + + + + {props.options?.map((e, i) => ( + + {i !== 0 && ( + + )} + props.onValueChanged?.(e.value)} + > + {e.name} +
+ {e.suffix} + + + ))} + + + + + ) +} + +export { Dropdown } diff --git a/joi/src/core/Dropdown/styles.scss b/joi/src/core/Dropdown/styles.scss new file mode 100644 index 000000000..d472578df --- /dev/null +++ b/joi/src/core/Dropdown/styles.scss @@ -0,0 +1,155 @@ +.DropdownMenuContent, +.DropdownMenuSubContent { + min-width: 220px; + background-color: white; + border-radius: 6px; + overflow: hidden; + padding: 0px; + box-shadow: + 0px 10px 38px -10px rgba(22, 23, 24, 0.35), + 0px 10px 20px -15px rgba(22, 23, 24, 0.2); + animation-duration: 400ms; + animation-timing-function: cubic-bezier(0.16, 1, 0.3, 1); + will-change: transform, opacity; +} +.DropdownMenuContent[data-side='top'], +.DropdownMenuSubContent[data-side='top'] { + animation-name: slideDownAndFade; +} +.DropdownMenuContent[data-side='right'], +.DropdownMenuSubContent[data-side='right'] { + animation-name: slideLeftAndFade; +} +.DropdownMenuContent[data-side='bottom'], +.DropdownMenuSubContent[data-side='bottom'] { + animation-name: slideUpAndFade; +} +.DropdownMenuContent[data-side='left'], +.DropdownMenuSubContent[data-side='left'] { + animation-name: slideRightAndFade; +} + +.DropdownMenuItem { + padding: 14px; + cursor: pointer; + outline: none; + flex: 1; + display: flex; + justify-content: space-between; /* Distribute space between children */ + align-items: center; /* Optional: Align items vertically */ + gap: 16px; + border-color: hsla(var(--app-border)); +} +.DropdownMenuCheckboxItem, +.DropdownMenuRadioItem, +.DropdownMenuSubTrigger { + font-size: 13px; + line-height: 1; + border-radius: 3px; + display: flex; + align-items: center; + height: 25px; + padding: 0 0; + position: relative; + padding-left: 25px; + user-select: none; + outline: none; +} +.DropdownMenuItem[data-disabled], +.DropdownMenuCheckboxItem[data-disabled], +.DropdownMenuRadioItem[data-disabled], +.DropdownMenuSubTrigger[data-disabled] { + pointer-events: none; +} +.DropdownMenuItem[data-highlighted], +.DropdownMenuCheckboxItem[data-highlighted], +.DropdownMenuRadioItem[data-highlighted], +.DropdownMenuSubTrigger[data-highlighted] { + background-color: hsla(var(--secondary-bg)); +} + +.DropdownMenuSeparator { + height: 1px; + width: '100%'; + background-color: hsla(var(--app-border)); +} + +.DropdownMenuItem::hover { + background-color: hsla(var(--secondary-bg)); +} + +.DropdownMenuLabel { + padding-left: 25px; + font-size: 12px; + line-height: 25px; + color: var(--mauve-11); +} + +.DropdownMenuItemIndicator { + position: absolute; + left: 0; + width: 25px; + display: inline-flex; + align-items: center; + justify-content: center; +} + +.DropdownMenuArrow { + fill: white; +} + +.RightSlot { + margin-left: auto; + padding-left: 20px; + color: var(--mauve-11); +} +[data-highlighted] > .RightSlot { + color: white; +} +[data-disabled] .RightSlot { + color: var(--mauve-8); +} + +@keyframes slideUpAndFade { + from { + opacity: 0; + transform: translateY(2px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +@keyframes slideRightAndFade { + from { + opacity: 0; + transform: translateX(-2px); + } + to { + opacity: 1; + transform: translateX(0); + } +} + +@keyframes slideDownAndFade { + from { + opacity: 0; + transform: translateY(-2px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +@keyframes slideLeftAndFade { + from { + opacity: 0; + transform: translateX(2px); + } + to { + opacity: 1; + transform: translateX(0); + } +} diff --git a/joi/src/core/ScrollArea/styles.scss b/joi/src/core/ScrollArea/styles.scss index fd8a43e53..99ee7de87 100644 --- a/joi/src/core/ScrollArea/styles.scss +++ b/joi/src/core/ScrollArea/styles.scss @@ -51,20 +51,3 @@ flex-direction: column; height: 8px; } - -::-webkit-scrollbar { - width: 8px; - height: 8px; -} -::-webkit-scrollbar-track, -::-webkit-scrollbar-thumb { - background-clip: content-box; - border-radius: inherit; -} -::-webkit-scrollbar-track { - background: hsla(var(--scrollbar-tracker)); -} -::-webkit-scrollbar-thumb { - background: hsla(var(--scrollbar-thumb)); - border-radius: 20px; -} diff --git a/joi/src/core/Select/index.tsx b/joi/src/core/Select/index.tsx index bce5473da..d8935bd83 100644 --- a/joi/src/core/Select/index.tsx +++ b/joi/src/core/Select/index.tsx @@ -1,24 +1,23 @@ -import React, { ReactNode } from 'react' +import React from 'react' import * as SelectPrimitive from '@radix-ui/react-select' -import { - CheckIcon, - ChevronDownIcon, - ChevronUpIcon, -} from '@radix-ui/react-icons' +import { CheckIcon, ChevronDownIcon } from '@radix-ui/react-icons' import './styles.scss' import { twMerge } from 'tailwind-merge' type Props = { - options?: { name: string; value: string }[] + options?: { name: string; value: string; recommend?: boolean }[] open?: boolean block?: boolean value?: string + side?: 'top' | 'right' | 'bottom' | 'left' + position?: 'item-aligned' | 'popper' placeholder?: string disabled?: boolean containerPortal?: HTMLDivElement | undefined | null className?: string + sideOffset?: number onValueChange?: (value: string) => void onOpenChange?: (open: boolean) => void } @@ -30,7 +29,10 @@ const Select = ({ disabled, containerPortal, block, + sideOffset, + position, className, + side, open, onValueChange, onOpenChange, @@ -56,7 +58,12 @@ const Select = ({ - + {options && options.map((item, i) => { @@ -66,9 +73,16 @@ const Select = ({ className="select__item" value={item.value} > - - {item.name} - +
+ + {item.name} + + {item.recommend && ( + + Recommended + + )} +
@@ -76,7 +90,6 @@ const Select = ({ ) })}
-
diff --git a/joi/src/core/Slider/Slider.test.tsx b/joi/src/core/Slider/Slider.test.tsx index 86bd8c623..e74bf5cac 100644 --- a/joi/src/core/Slider/Slider.test.tsx +++ b/joi/src/core/Slider/Slider.test.tsx @@ -29,7 +29,7 @@ jest.mock('@radix-ui/react-slider', () => ({ describe('@joi/core/Slider', () => { it('renders correctly with default props', () => { - render() + render() expect(screen.getByTestId('slider-root')).toBeInTheDocument() expect(screen.getByTestId('slider-track')).toBeInTheDocument() expect(screen.getByTestId('slider-range')).toBeInTheDocument() diff --git a/joi/src/core/Slider/index.tsx b/joi/src/core/Slider/index.tsx index 7f8c6cb89..ea3d8dfca 100644 --- a/joi/src/core/Slider/index.tsx +++ b/joi/src/core/Slider/index.tsx @@ -39,7 +39,9 @@ const Slider = ({ - + {value?.map((_, i) => ( + + ))} ) diff --git a/joi/src/index.test.ts b/joi/src/index.test.ts index 8bfba8d93..7937ea138 100644 --- a/joi/src/index.test.ts +++ b/joi/src/index.test.ts @@ -15,6 +15,7 @@ jest.mock('./core/Select/styles.scss', () => ({})) jest.mock('./core/TextArea/styles.scss', () => ({})) jest.mock('./core/Tabs/styles.scss', () => ({})) jest.mock('./core/Accordion/styles.scss', () => ({})) +jest.mock('./core/Dropdown/styles.scss', () => ({})) describe('Exports', () => { it('exports all components and hooks', () => { diff --git a/joi/src/index.ts b/joi/src/index.ts index 543162747..ebeb3ac4d 100644 --- a/joi/src/index.ts +++ b/joi/src/index.ts @@ -12,6 +12,7 @@ export * from './core/Select' export * from './core/TextArea' export * from './core/Tabs' export * from './core/Accordion' +export * from './core/Dropdown' export * from './hooks/useClipboard' export * from './hooks/usePageLeave' diff --git a/server/cortex.json b/server/cortex.json index 0a9b83efd..352c3a8a6 100644 --- a/server/cortex.json +++ b/server/cortex.json @@ -596,6 +596,11 @@ } }, "/healthz": { + "servers": [ + { + "url": "/" + } + ], "get": { "operationId": "HealthController_check", "summary": "Check health", @@ -613,6 +618,11 @@ } }, "/processManager/destroy": { + "servers": [ + { + "url": "/" + } + ], "delete": { "operationId": "Terminate server process", "summary": "Terminate server", @@ -2442,6 +2452,11 @@ } }, "/system": { + "servers": [ + { + "url": "/" + } + ], "delete": { "operationId": "SystemController_delete", "summary": "Stop api server", @@ -2468,6 +2483,11 @@ } }, "/system/events/download": { + "servers": [ + { + "url": "/" + } + ], "get": { "operationId": "SystemController_downloadEvent", "summary": "Get download status", @@ -2489,6 +2509,11 @@ } }, "/system/events/model": { + "servers": [ + { + "url": "/" + } + ], "get": { "operationId": "SystemController_modelEvent", "summary": "Get model status", @@ -2510,6 +2535,11 @@ } }, "/system/events/resources": { + "servers": [ + { + "url": "/" + } + ], "get": { "operationId": "SystemController_resourcesEvent", "summary": "Get resources status", @@ -2638,7 +2668,7 @@ }, "url": { "type": "string", - "example": "https://api.github.com/repos/janhq/cortex.llamacpp/releases/186479804" + "example": "https://api.github.com/repos/menloresearch/cortex.llamacpp/releases/186479804" } } } @@ -3603,238 +3633,6 @@ }, "tags": ["Files"] } - }, - "/configs": { - "get": { - "summary": "Get Configurations", - "description": "Retrieves the current configuration settings of the Cortex server.", - "responses": { - "200": { - "description": "Successful response", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "allowed_origins": { - "type": "array", - "items": { - "type": "string" - }, - "example": ["http://127.0.0.1:39281", "https://cortex.so"] - }, - "cors": { - "type": "boolean", - "example": false - }, - "proxy_username": { - "type": "string", - "example": "username" - }, - "proxy_password": { - "type": "string", - "example": "password" - }, - "proxy_url": { - "type": "string", - "example": "http://proxy.example.com:8080" - }, - "verify_proxy_ssl": { - "type": "boolean", - "description": "test", - "example": false - }, - "verify_proxy_host_ssl": { - "type": "boolean", - "example": false - }, - "verify_peer_ssl": { - "type": "boolean", - "example": false - }, - "verify_host_ssl": { - "type": "boolean", - "example": false - }, - "no_proxy": { - "type": "string", - "example": "localhost" - }, - "huggingface_token": { - "type": "string", - "example": "your_token" - } - } - }, - "example": { - "allowed_origins": [ - "http://127.0.0.1:39281", - "https://cortex.so" - ], - "cors": false, - "proxy_username": "username", - "proxy_password": "password", - "proxy_url": "http://proxy.example.com:8080", - "verify_proxy_ssl": false, - "verify_proxy_host_ssl": false, - "verify_peer_ssl": false, - "verify_host_ssl": false, - "no_proxy": "localhost", - "huggingface_token": "your_token" - } - } - } - } - }, - "tags": ["Configurations"] - }, - "patch": { - "tags": ["Configurations"], - "summary": "Update configuration settings", - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "cors": { - "type": "boolean", - "description": "Indicates whether CORS is enabled.", - "example": false - }, - "allowed_origins": { - "type": "array", - "items": { - "type": "string" - }, - "description": "List of allowed origins.", - "example": ["http://127.0.0.1:39281", "https://cortex.so"] - }, - "proxy_username": { - "type": "string", - "description": "Username for the proxy server.", - "example": "username" - }, - "proxy_password": { - "type": "string", - "description": "Password for the proxy server.", - "example": "password" - }, - "proxy_url": { - "type": "string", - "description": "URL for the proxy server.", - "example": "http://proxy.example.com:8080" - }, - "verify_proxy_ssl": { - "type": "boolean", - "description": "Indicates whether to verify the SSL certificate of the proxy server.", - "example": false - }, - "verify_proxy_host_ssl": { - "type": "boolean", - "description": "Indicates whether to verify the SSL certificate of the proxy server host.", - "example": false - }, - "verify_peer_ssl": { - "type": "boolean", - "description": "Indicates whether to verify the SSL certificate of the peer.", - "example": false - }, - "verify_host_ssl": { - "type": "boolean", - "description": "Indicates whether to verify the SSL certificate of the host.", - "example": false - }, - "no_proxy": { - "type": "string", - "description": "List of hosts that should not be proxied.", - "example": "localhost" - }, - "huggingface_token": { - "type": "string", - "description": "HuggingFace token to pull models.", - "example": "your_token" - } - } - } - } - } - }, - "responses": { - "200": { - "description": "Configuration updated successfully", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "config": { - "type": "object", - "properties": { - "allowed_origins": { - "type": "array", - "items": { - "type": "string" - }, - "example": [ - "http://127.0.0.1:39281", - "https://cortex.so" - ] - }, - "cors": { - "type": "boolean", - "example": false - }, - "proxy_username": { - "type": "string", - "example": "username" - }, - "proxy_password": { - "type": "string", - "example": "password" - }, - "proxy_url": { - "type": "string", - "example": "http://proxy.example.com:8080" - }, - "verify_proxy_ssl": { - "type": "boolean", - "example": false - }, - "verify_proxy_host_ssl": { - "type": "boolean", - "example": false - }, - "verify_peer_ssl": { - "type": "boolean", - "example": false - }, - "verify_host_ssl": { - "type": "boolean", - "example": false - }, - "no_proxy": { - "type": "string", - "example": "localhost" - }, - "huggingface_token": { - "type": "string", - "example": "your_token" - } - } - }, - "message": { - "type": "string", - "example": "Configuration updated successfully" - } - } - } - } - } - } - } - } } }, "info": { diff --git a/server/global.d.ts b/server/global.d.ts new file mode 100644 index 000000000..1fb95b9a0 --- /dev/null +++ b/server/global.d.ts @@ -0,0 +1 @@ +declare const CORTEX_API_URL: string \ No newline at end of file diff --git a/server/index.ts b/server/index.ts index 4008d7008..4ea927199 100644 --- a/server/index.ts +++ b/server/index.ts @@ -86,6 +86,14 @@ export const startServer = async (configs?: ServerConfig): Promise => { }, }) + const rewriteRequestHeaders = (req: any, headers: any) => { + if (req.url.includes('/configs')) return headers + return { + ...headers, + authorization: `Bearer ${process.env.appToken}`, // Add or modify Authorization header + } + } + // Register Swagger UI await server.register(require('@fastify/swagger-ui'), { routePrefix: '/', @@ -97,10 +105,41 @@ export const startServer = async (configs?: ServerConfig): Promise => { transformSpecificationClone: true, }) - server.register(require('@fastify/http-proxy'), { - upstream: 'http://127.0.0.1:39291/v1', + const proxy = require('@fastify/http-proxy') + server.register(proxy, { + upstream: `${CORTEX_API_URL}/v1`, prefix: configs?.prefix ?? '/v1', http2: false, + replyOptions: { + rewriteRequestHeaders, + }, + }) + + server.register(proxy, { + upstream: `${CORTEX_API_URL}/processManager`, + prefix: '/processManager', + http2: false, + replyOptions: { + rewriteRequestHeaders, + }, + }) + + server.register(proxy, { + upstream: `${CORTEX_API_URL}/system`, + prefix: '/system', + http2: false, + replyOptions: { + rewriteRequestHeaders, + }, + }) + + server.register(proxy, { + upstream: `${CORTEX_API_URL}/healthz`, + prefix: '/healthz', + http2: false, + replyOptions: { + rewriteRequestHeaders, + }, }) // Start listening for requests diff --git a/server/rolldown.config.mjs b/server/rolldown.config.mjs index c74655577..5f094a1af 100644 --- a/server/rolldown.config.mjs +++ b/server/rolldown.config.mjs @@ -14,5 +14,8 @@ export default defineConfig([ }, external: ['@fastify/swagger-ui'], platform: 'node', + define: { + CORTEX_API_URL: JSON.stringify(`http://127.0.0.1:${process.env.CORTEX_API_PORT ?? "39291"}`), + } }, ]) diff --git a/themes/dark-dimmed/theme.json b/themes/dark-dimmed/theme.json index 062469072..2ca59f226 100644 --- a/themes/dark-dimmed/theme.json +++ b/themes/dark-dimmed/theme.json @@ -8,8 +8,7 @@ "bg": "215, 25%, 9%, 1", "transparent": "0, 0%, 13%, 0.3", "border": "0, 0%, 100%, 0.1", - "link": "221, 79%, 59%, 1", - "code-block": "0, 0%, 10%, 1" + "link": "221, 79%, 59%, 1" }, "primary": { diff --git a/themes/joi-dark/theme.json b/themes/joi-dark/theme.json index c299e3b1e..30e01af79 100644 --- a/themes/joi-dark/theme.json +++ b/themes/joi-dark/theme.json @@ -8,8 +8,7 @@ "bg": "0, 0%, 13%, 1", "transparent": "0, 0%, 13%, 0.3", "border": "0, 0%, 100%, 0.1", - "link": "221, 83%, 53%, 1", - "code-block": "0, 0%, 17%, 1" + "link": "221, 83%, 53%, 1" }, "primary": { diff --git a/themes/joi-light/theme.json b/themes/joi-light/theme.json index 7468ff976..77654d1fd 100644 --- a/themes/joi-light/theme.json +++ b/themes/joi-light/theme.json @@ -8,8 +8,7 @@ "bg": "0, 0%, 100%, 1", "transparent": "0, 0%, 100%, 0.8", "border": "0, 0%, 0%, 0.1", - "link": "221, 83%, 53%, 1", - "code-block": "0, 0%, 17%, 1" + "link": "221, 83%, 53%, 1" }, "primary": { diff --git a/themes/night-blue/theme.json b/themes/night-blue/theme.json index 96d2e242c..65c907728 100644 --- a/themes/night-blue/theme.json +++ b/themes/night-blue/theme.json @@ -8,8 +8,7 @@ "bg": "211, 100%, 15%, 1", "transparent": "221, 79%, 59%, 0.08", "border": "0, 0%, 100%, 0.1", - "link": "142, 76%, 36%, 1", - "code-block": "222, 96%, 10%, 1" + "link": "142, 76%, 36%, 1" }, "primary": { diff --git a/web/app/layout.tsx b/web/app/layout.tsx index 5f14d6f5c..aaa905a49 100644 --- a/web/app/layout.tsx +++ b/web/app/layout.tsx @@ -13,10 +13,7 @@ export const metadata: Metadata = { export default function RootLayout({ children }: PropsWithChildren) { return ( - -
- {children} - + {children} ) } diff --git a/web/app/search/UserInput.tsx b/web/app/search/UserInput.tsx index cec694c90..fcabc8ea4 100644 --- a/web/app/search/UserInput.tsx +++ b/web/app/search/UserInput.tsx @@ -66,7 +66,7 @@ const UserInput = () => { - - - - - - - - - + + + + ) } diff --git a/web/app/search/page.tsx b/web/app/search/page.tsx index 947999e62..51cf04549 100644 --- a/web/app/search/page.tsx +++ b/web/app/search/page.tsx @@ -5,6 +5,7 @@ import UserInput from './UserInput' const Search = () => { return (
+
) diff --git a/web/containers/Layout/BottomPanel/InstallingExtension/InstallingExtensionModal.tsx b/web/containers/Layout/BottomPanel/InstallingExtension/InstallingExtensionModal.tsx deleted file mode 100644 index 0d5e4d4e3..000000000 --- a/web/containers/Layout/BottomPanel/InstallingExtension/InstallingExtensionModal.tsx +++ /dev/null @@ -1,79 +0,0 @@ -import { useCallback, useEffect } from 'react' - -import { abortDownload } from '@janhq/core' -import { Button, Modal, Progress } from '@janhq/joi' -import { atom, useAtom, useAtomValue } from 'jotai' - -import { - formatDownloadPercentage, - formatExtensionsName, -} from '@/utils/converter' - -import { - InstallingExtensionState, - installingExtensionAtom, -} from '@/helpers/atoms/Extension.atom' - -export const showInstallingExtensionModalAtom = atom(false) - -const InstallingExtensionModal = () => { - const [showInstallingExtensionModal, setShowInstallingExtensionModal] = - useAtom(showInstallingExtensionModalAtom) - const installingExtensions = useAtomValue(installingExtensionAtom) - - useEffect(() => { - if (installingExtensions.length === 0) { - setShowInstallingExtensionModal(false) - } - }, [installingExtensions, setShowInstallingExtensionModal]) - - const onAbortInstallingExtensionClick = useCallback( - (item: InstallingExtensionState) => { - if (item.localPath) { - abortDownload(item.localPath) - } - }, - [] - ) - - return ( - setShowInstallingExtensionModal(false)} - content={ -
- {Object.values(installingExtensions).map((item) => ( -
- -
-
-

- {formatExtensionsName(item.extensionId)} -

- {formatDownloadPercentage(item.percentage)} -
- -
-
- ))} -
- } - /> - ) -} - -export default InstallingExtensionModal diff --git a/web/containers/Layout/BottomPanel/InstallingExtension/index.tsx b/web/containers/Layout/BottomPanel/InstallingExtension/index.tsx deleted file mode 100644 index b41b64e22..000000000 --- a/web/containers/Layout/BottomPanel/InstallingExtension/index.tsx +++ /dev/null @@ -1,52 +0,0 @@ -import { Fragment, useCallback } from 'react' - -import { Progress } from '@janhq/joi' -import { useAtomValue, useSetAtom } from 'jotai' - -import { showInstallingExtensionModalAtom } from './InstallingExtensionModal' - -import { installingExtensionAtom } from '@/helpers/atoms/Extension.atom' - -const InstallingExtension = () => { - const installingExtensions = useAtomValue(installingExtensionAtom) - const setShowInstallingExtensionModal = useSetAtom( - showInstallingExtensionModalAtom - ) - const shouldShowInstalling = installingExtensions.length > 0 - - let totalPercentage = 0 - let totalExtensions = 0 - for (const installation of installingExtensions) { - totalPercentage += installation.percentage - totalExtensions++ - } - const progress = (totalPercentage / totalExtensions) * 100 - - const onClick = useCallback(() => { - setShowInstallingExtensionModal(true) - }, [setShowInstallingExtensionModal]) - - return ( - - {shouldShowInstalling ? ( -
-

- Installing Additional Dependencies -

- -
- - - {progress.toFixed(2)}% - -
-
- ) : null} -
- ) -} - -export default InstallingExtension diff --git a/web/containers/Layout/BottomPanel/SystemMonitor/TableActiveModel/index.tsx b/web/containers/Layout/BottomPanel/SystemMonitor/TableActiveModel/index.tsx index 7a7dd1e24..e47296ffc 100644 --- a/web/containers/Layout/BottomPanel/SystemMonitor/TableActiveModel/index.tsx +++ b/web/containers/Layout/BottomPanel/SystemMonitor/TableActiveModel/index.tsx @@ -6,7 +6,7 @@ import { useActiveModel } from '@/hooks/useActiveModel' import { useGetEngines } from '@/hooks/useEngineManagement' -import { toGibibytes } from '@/utils/converter' +import { toGigabytes } from '@/utils/converter' import { isLocalEngine } from '@/utils/modelEngine' @@ -34,7 +34,7 @@ const TableActiveModel = () => { {activeModel.metadata?.size - ? toGibibytes(activeModel.metadata?.size) + ? toGigabytes(activeModel.metadata?.size) : '-'} diff --git a/web/containers/Layout/BottomPanel/SystemMonitor/index.tsx b/web/containers/Layout/BottomPanel/SystemMonitor/index.tsx index bbced52f7..d9a0b289a 100644 --- a/web/containers/Layout/BottomPanel/SystemMonitor/index.tsx +++ b/web/containers/Layout/BottomPanel/SystemMonitor/index.tsx @@ -16,7 +16,7 @@ import useGetSystemResources from '@/hooks/useGetSystemResources' import { usePath } from '@/hooks/usePath' -import { toGibibytes } from '@/utils/converter' +import { toGigabytes } from '@/utils/converter' import { utilizedMemory } from '@/utils/memory' @@ -134,8 +134,8 @@ const SystemMonitor = () => {
Memory
- {toGibibytes(usedRam, { hideUnit: true })}GB /{' '} - {toGibibytes(totalRam, { hideUnit: true })}GB + {toGigabytes(usedRam, { hideUnit: true })}GB /{' '} + {toGigabytes(totalRam, { hideUnit: true })}GB
diff --git a/web/containers/Layout/BottomPanel/index.tsx b/web/containers/Layout/BottomPanel/index.tsx index 69894c9e3..90d9d84ba 100644 --- a/web/containers/Layout/BottomPanel/index.tsx +++ b/web/containers/Layout/BottomPanel/index.tsx @@ -7,7 +7,6 @@ import { twMerge } from 'tailwind-merge' import DownloadingState from './DownloadingState' import ImportingModelState from './ImportingModelState' -import InstallingExtension from './InstallingExtension' import SystemMonitor from './SystemMonitor' import UpdateApp from './UpdateApp' import UpdatedFailedModal from './UpdateFailedModal' @@ -49,7 +48,6 @@ const BottomPanel = () => { -
diff --git a/web/containers/Layout/index.tsx b/web/containers/Layout/index.tsx index 7d5f61ed3..db675d5eb 100644 --- a/web/containers/Layout/index.tsx +++ b/web/containers/Layout/index.tsx @@ -21,7 +21,6 @@ import { SUCCESS_SET_NEW_DESTINATION } from '@/screens/Settings/Advanced/DataFol import CancelModelImportModal from '@/screens/Settings/CancelModelImportModal' import ChooseWhatToImportModal from '@/screens/Settings/ChooseWhatToImportModal' import EditModelInfoModal from '@/screens/Settings/EditModelInfoModal' -import HuggingFaceRepoDetailModal from '@/screens/Settings/HuggingFaceRepoDetailModal' import ImportModelOptionModal from '@/screens/Settings/ImportModelOptionModal' import ImportingModelModal from '@/screens/Settings/ImportingModelModal' import SelectingModelModal from '@/screens/Settings/SelectingModelModal' @@ -32,13 +31,16 @@ import LoadingModal from '../LoadingModal' import MainViewContainer from '../MainViewContainer' -import InstallingExtensionModal from './BottomPanel/InstallingExtension/InstallingExtensionModal' +import ModalAppUpdaterChangelog from '../ModalAppUpdaterChangelog' + +import ModalAppUpdaterNotAvailable from '../ModalAppUpdaterNotAvailable' import { mainViewStateAtom } from '@/helpers/atoms/App.atom' import { productAnalyticAtom, productAnalyticPromptAtom, reduceTransparentAtom, + showScrollBarAtom, } from '@/helpers/atoms/Setting.atom' const BaseLayout = () => { @@ -49,6 +51,7 @@ const BaseLayout = () => { const [productAnalyticPrompt, setProductAnalyticPrompt] = useAtom( productAnalyticPromptAtom ) + const showScrollBar = useAtomValue(showScrollBarAtom) const [showProductAnalyticPrompt, setShowProductAnalyticPrompt] = useState(false) @@ -147,7 +150,12 @@ const BaseLayout = () => { )} > -
+
@@ -157,8 +165,6 @@ const BaseLayout = () => { {importModelStage === 'EDIT_MODEL_INFO' && } {importModelStage === 'CONFIRM_CANCEL' && } - - {showProductAnalyticPrompt && (
@@ -234,6 +240,8 @@ const BaseLayout = () => { )}
+ +
) } diff --git a/web/containers/LeftPanelContainer/index.tsx b/web/containers/LeftPanelContainer/index.tsx index 523af5ddb..ac4b8893f 100644 --- a/web/containers/LeftPanelContainer/index.tsx +++ b/web/containers/LeftPanelContainer/index.tsx @@ -12,7 +12,10 @@ import { atom, useAtom, useAtomValue } from 'jotai' import { twMerge } from 'tailwind-merge' import { showLeftPanelAtom } from '@/helpers/atoms/App.atom' -import { reduceTransparentAtom } from '@/helpers/atoms/Setting.atom' +import { + reduceTransparentAtom, + showScrollBarAtom, +} from '@/helpers/atoms/Setting.atom' type Props = PropsWithChildren @@ -27,6 +30,7 @@ const LeftPanelContainer = ({ children }: Props) => { const [showLeftPanel, setShowLeftPanel] = useAtom(showLeftPanelAtom) const matches = useMediaQuery('(max-width: 880px)') const reduceTransparent = useAtomValue(reduceTransparentAtom) + const showScrollBar = useAtomValue(showScrollBarAtom) useClickOutside( () => matches && showLeftPanel && setShowLeftPanel(false), @@ -101,7 +105,10 @@ const LeftPanelContainer = ({ children }: Props) => { style={{ width: showLeftPanel ? leftPanelWidth : 0 }} onMouseDown={(e) => isResizing && e.stopPropagation()} > - + {children} {showLeftPanel && !matches && ( diff --git a/web/containers/ListContainer/index.tsx b/web/containers/ListContainer/index.tsx index 44e5b2527..3184c171b 100644 --- a/web/containers/ListContainer/index.tsx +++ b/web/containers/ListContainer/index.tsx @@ -4,6 +4,7 @@ import { ScrollArea } from '@janhq/joi' import { useAtomValue } from 'jotai' +import { showScrollBarAtom } from '@/helpers/atoms/Setting.atom' import { activeThreadAtom } from '@/helpers/atoms/Thread.atom' const ListContainer = ({ children }: PropsWithChildren) => { @@ -12,6 +13,7 @@ const ListContainer = ({ children }: PropsWithChildren) => { const isUserManuallyScrollingUp = useRef(false) const activeThread = useAtomValue(activeThreadAtom) const prevActiveThread = useRef(activeThread) + const showScrollBar = useAtomValue(showScrollBarAtom) // Handle active thread changes useEffect(() => { @@ -59,6 +61,7 @@ const ListContainer = ({ children }: PropsWithChildren) => { return ( { + const radius = size / 2 - strokeWidth + const circumference = 2 * Math.PI * radius + + return ( + + {/* Static background circle */} + + {/* Smooth animated arc */} + + + ) +} + +export default Spinner diff --git a/web/containers/ModalAppUpdaterChangelog/index.tsx b/web/containers/ModalAppUpdaterChangelog/index.tsx new file mode 100644 index 000000000..705623a90 --- /dev/null +++ b/web/containers/ModalAppUpdaterChangelog/index.tsx @@ -0,0 +1,91 @@ +import React, { useEffect, useState } from 'react' + +import { Button, Modal } from '@janhq/joi' + +import { useAtom } from 'jotai' + +import { useGetLatestRelease } from '@/hooks/useGetLatestRelease' + +import { MarkdownTextMessage } from '@/screens/Thread/ThreadCenterPanel/TextMessage/MarkdownTextMessage' + +import LogoMark from '../Brand/Logo/Mark' + +import { appUpdateAvailableAtom } from '@/helpers/atoms/App.atom' + +const ModalAppUpdaterChangelog = () => { + const [appUpdateAvailable, setAppUpdateAvailable] = useAtom( + appUpdateAvailableAtom + ) + + const [open, setOpen] = useState(appUpdateAvailable) + + useEffect(() => { + setOpen(appUpdateAvailable) + }, [appUpdateAvailable]) + + const beta = VERSION.includes('beta') + const nightly = VERSION.includes('-') + + const { release } = useGetLatestRelease(beta ? true : false) + + return ( + +
+ +
App Update
+
+ {!nightly && ( +

+ Version {release?.name} is available and ready to install. +

+ )} + + } + open={open} + onOpenChange={() => setOpen(!open)} + content={ +
+ {nightly ? ( +

+ You are using a nightly build. This version is built from the + latest development branch and may not have release notes. +

+ ) : ( + <> +
+ +
+ + )} +
+ + +
+
+ } + /> + ) +} + +export default ModalAppUpdaterChangelog diff --git a/web/containers/ModalAppUpdaterNotAvailable/index.tsx b/web/containers/ModalAppUpdaterNotAvailable/index.tsx new file mode 100644 index 000000000..5f2b25fda --- /dev/null +++ b/web/containers/ModalAppUpdaterNotAvailable/index.tsx @@ -0,0 +1,57 @@ +import React, { useEffect, useState } from 'react' + +import { Button, Modal } from '@janhq/joi' + +import { useAtom } from 'jotai' + +import LogoMark from '../Brand/Logo/Mark' + +import { appUpdateNotAvailableAtom } from '@/helpers/atoms/App.atom' + +const ModalAppUpdaterNotAvailable = () => { + const [appUpdateNotAvailable, setAppUpdateNotAvailable] = useAtom( + appUpdateNotAvailableAtom + ) + + const [open, setOpen] = useState(appUpdateNotAvailable) + + useEffect(() => { + setOpen(appUpdateNotAvailable) + }, [appUpdateNotAvailable]) + + return ( + +
+ +
App Update
+
+ + } + open={open} + onOpenChange={() => setOpen(!open)} + content={ +
+

+ You’re up to date! No new updates available +

+
+ +
+
+ } + /> + ) +} + +export default ModalAppUpdaterNotAvailable diff --git a/web/containers/ModalCancelDownload/index.tsx b/web/containers/ModalCancelDownload/index.tsx index 1826c78a7..886eb3b68 100644 --- a/web/containers/ModalCancelDownload/index.tsx +++ b/web/containers/ModalCancelDownload/index.tsx @@ -1,7 +1,5 @@ import { useCallback } from 'react' -import { Model } from '@janhq/core' - import { Modal, Button, Progress, ModalClose } from '@janhq/joi' import { useAtomValue, useSetAtom } from 'jotai' @@ -16,22 +14,22 @@ import { import { formatDownloadPercentage } from '@/utils/converter' type Props = { - model: Model + modelId: string isFromList?: boolean } -const ModalCancelDownload = ({ model, isFromList }: Props) => { +const ModalCancelDownload = ({ modelId, isFromList }: Props) => { const { abortModelDownload } = useDownloadModel() const removeDownloadState = useSetAtom(removeDownloadStateAtom) const allDownloadStates = useAtomValue(modelDownloadStateAtom) - const downloadState = allDownloadStates[model.id] + const downloadState = allDownloadStates[modelId] const cancelText = `Cancel ${formatDownloadPercentage(downloadState?.percent ?? 0)}` const onAbortDownloadClick = useCallback(() => { - removeDownloadState(model.id) - abortModelDownload(downloadState?.modelId ?? model.id) - }, [downloadState, abortModelDownload, removeDownloadState, model]) + removeDownloadState(modelId) + abortModelDownload(downloadState?.modelId ?? modelId) + }, [downloadState, abortModelDownload, removeDownloadState, modelId]) return ( { {cancelText} ) : ( - + ) + const downloadingButton = !hideProgress && ( + + ) + + const downloadedButton = ( + + Use + + } + content="Threads are disabled while the server is running" + disabled={!serverEnabled} + /> + ) + return ( + <> + {isDownloading + ? downloadingButton + : isDownloaded + ? downloadedButton + : defaultButton} + + ) +} + +export default ModelDownloadButton diff --git a/web/containers/ModelDropdown/index.tsx b/web/containers/ModelDropdown/index.tsx index 28be2fb74..d95a114c4 100644 --- a/web/containers/ModelDropdown/index.tsx +++ b/web/containers/ModelDropdown/index.tsx @@ -15,6 +15,7 @@ import { import { atom, useAtom, useAtomValue, useSetAtom } from 'jotai' import { + CheckIcon, ChevronDownIcon, ChevronUpIcon, DownloadCloudIcon, @@ -35,15 +36,17 @@ import useDownloadModel from '@/hooks/useDownloadModel' import { modelDownloadStateAtom } from '@/hooks/useDownloadState' import { useGetEngines } from '@/hooks/useEngineManagement' +import { useGetFeaturedSources } from '@/hooks/useModelSource' import useRecommendedModel from '@/hooks/useRecommendedModel' import useUpdateModelParameters from '@/hooks/useUpdateModelParameters' -import { formatDownloadPercentage, toGibibytes } from '@/utils/converter' +import { formatDownloadPercentage, toGigabytes } from '@/utils/converter' -import { manualRecommendationModel } from '@/utils/model' import { getLogoEngine, getTitleByEngine } from '@/utils/modelEngine' +import { extractModelName } from '@/utils/modelSource' + import { activeAssistantAtom } from '@/helpers/atoms/Assistant.atom' import { configuredModelsAtom, @@ -52,6 +55,7 @@ import { showEngineListModelAtom, } from '@/helpers/atoms/Model.atom' +import { showScrollBarAtom } from '@/helpers/atoms/Setting.atom' import { activeThreadAtom, setThreadModelParamsAtom, @@ -74,6 +78,7 @@ const ModelDropdown = ({ const [modelDropdownState, setModelDropdownState] = useAtom( modelDropdownStateAtom ) + const showScrollBar = useAtomValue(showScrollBarAtom) const [searchFilter, setSearchFilter] = useState('local') const [searchText, setSearchText] = useState('') @@ -87,6 +92,7 @@ const ModelDropdown = ({ const [dropdownOptions, setDropdownOptions] = useState( null ) + const { sources: featuredModels } = useGetFeaturedSources() const { engines } = useGetEngines() @@ -97,12 +103,6 @@ const ModelDropdown = ({ const configuredModels = useAtomValue(configuredModelsAtom) const { stopModel } = useActiveModel() - const featuredModels = configuredModels.filter( - (x) => - manualRecommendationModel.includes(x.id) && - x.metadata?.tags?.includes('Featured') && - x.metadata?.size < 5000000000 - ) const { updateThreadMetadata } = useCreateNewThread() const engineList = useMemo( @@ -384,7 +384,10 @@ const ModelDropdown = ({ } />
- + {engineList .filter((e) => e.type === searchFilter) .filter( @@ -464,9 +467,9 @@ const ModelDropdown = ({ showModel && !searchText.length && (
    - {featuredModels.map((model) => { + {featuredModels?.map((model) => { const isDownloading = downloadingModels.some( - (md) => md === model.id + (md) => md === (model.models[0]?.id ?? model.id) ) return (
  • - {model.name} + {extractModelName(model.id)}

    - {toGibibytes(model.metadata?.size)} + {toGigabytes(model.models[0]?.size)} {!isDownloading ? ( - downloadModel( - model.sources[0].url, - model.id - ) + downloadModel(model.models[0]?.id) } /> ) : ( Object.values(downloadStates) - .filter((x) => x.modelId === model.id) + .filter( + (x) => + x.modelId === + (model.models[0]?.id ?? model.id) + ) .map((item) => (
    + {selectedModel?.id === model.id && ( + + )} {!isDownloaded && ( - {toGibibytes(model.metadata?.size)} + {toGigabytes(model.metadata?.size)} )} {!isDownloading && !isDownloaded ? ( diff --git a/web/containers/ModelLabel/ModelLabel.test.tsx b/web/containers/ModelLabel/ModelLabel.test.tsx index a4d8e82a7..545fc30d8 100644 --- a/web/containers/ModelLabel/ModelLabel.test.tsx +++ b/web/containers/ModelLabel/ModelLabel.test.tsx @@ -1,8 +1,7 @@ import React from 'react' -import { render, waitFor, screen } from '@testing-library/react' +import { render } from '@testing-library/react' import { useAtomValue } from 'jotai' import { useActiveModel } from '@/hooks/useActiveModel' -import { useSettings } from '@/hooks/useSettings' import ModelLabel from '@/containers/ModelLabel' jest.mock('jotai', () => ({ @@ -14,14 +13,9 @@ jest.mock('@/hooks/useActiveModel', () => ({ useActiveModel: jest.fn(), })) -jest.mock('@/hooks/useSettings', () => ({ - useSettings: jest.fn(), -})) - describe('ModelLabel', () => { const mockUseAtomValue = useAtomValue as jest.Mock const mockUseActiveModel = useActiveModel as jest.Mock - const mockUseSettings = useSettings as jest.Mock const defaultProps: any = { metadata: { @@ -36,46 +30,6 @@ describe('ModelLabel', () => { jest.clearAllMocks() }) - it('renders NotEnoughMemoryLabel when minimumRamModel is greater than totalRam', async () => { - mockUseAtomValue - .mockReturnValueOnce(0) - .mockReturnValueOnce(0) - .mockReturnValueOnce(0) - mockUseActiveModel.mockReturnValue({ - activeModel: { metadata: { size: 0 } }, - }) - mockUseSettings.mockReturnValue({ settings: { run_mode: 'cpu' } }) - - render() - await waitFor(() => { - expect(screen.getByText('Not enough RAM')).toBeDefined() - }) - }) - - it('renders SlowOnYourDeviceLabel when minimumRamModel is less than totalRam but greater than availableRam', async () => { - mockUseAtomValue - .mockReturnValueOnce(50) - .mockReturnValueOnce(50) - .mockReturnValueOnce(10) - mockUseActiveModel.mockReturnValue({ - activeModel: { metadata: { size: 0 } }, - }) - mockUseSettings.mockReturnValue({ settings: { run_mode: 'cpu' } }) - - const props = { - ...defaultProps, - metadata: { - ...defaultProps.metadata, - size: 50, - }, - } - - render() - await waitFor(() => { - expect(screen.getByText('Slow on your device')).toBeDefined() - }) - }) - it('renders nothing when minimumRamModel is less than availableRam', () => { mockUseAtomValue .mockReturnValueOnce(100) @@ -84,7 +38,6 @@ describe('ModelLabel', () => { mockUseActiveModel.mockReturnValue({ activeModel: { metadata: { size: 0 } }, }) - mockUseSettings.mockReturnValue({ settings: { run_mode: 'cpu' } }) const props = { ...defaultProps, diff --git a/web/containers/ModelLabel/index.tsx b/web/containers/ModelLabel/index.tsx index 711913616..6c6c3cfda 100644 --- a/web/containers/ModelLabel/index.tsx +++ b/web/containers/ModelLabel/index.tsx @@ -1,13 +1,9 @@ import React from 'react' -import { ModelMetadata } from '@janhq/core' -import { Badge } from '@janhq/joi' import { useAtomValue } from 'jotai' import { useActiveModel } from '@/hooks/useActiveModel' -import { useSettings } from '@/hooks/useSettings' - import NotEnoughMemoryLabel from './NotEnoughMemoryLabel' import SlowOnYourDeviceLabel from './SlowOnYourDeviceLabel' @@ -19,39 +15,32 @@ import { } from '@/helpers/atoms/SystemBar.atom' type Props = { - metadata: ModelMetadata + size?: number compact?: boolean } -const UnsupportedModel = () => { - return ( - - Coming Soon - - ) -} -const ModelLabel = ({ metadata, compact }: Props) => { +const ModelLabel = ({ size, compact }: Props) => { const { activeModel } = useActiveModel() const totalRam = useAtomValue(totalRamAtom) const usedRam = useAtomValue(usedRamAtom) const availableVram = useAtomValue(availableVramAtom) - const { settings } = useSettings() const getLabel = (size: number) => { const minimumRamModel = (size * 1.25) / (1024 * 1024) - const availableRam = settings?.gpus?.some((gpu) => gpu.activated) - ? availableVram * 1000000 // MB to bytes - : totalRam - - (usedRam + - (activeModel?.metadata?.size - ? (activeModel.metadata.size * 1.25) / (1024 * 1024) - : 0)) + const availableRam = + availableVram > 0 + ? availableVram * 1000000 // MB to bytes + : totalRam - + (usedRam + + (activeModel?.metadata?.size + ? (activeModel.metadata.size * 1.25) / (1024 * 1024) + : 0)) if (minimumRamModel > totalRam) { return ( gpu.activated) ? 'VRAM' : 'RAM'} + unit={availableVram > 0 ? 'VRAM' : 'RAM'} compact={compact} /> ) @@ -64,11 +53,7 @@ const ModelLabel = ({ metadata, compact }: Props) => { return null } - return metadata?.tags?.includes('Coming Soon') ? ( - - ) : ( - getLabel(metadata?.size ?? 0) - ) + return getLabel(size ?? 0) } export default React.memo(ModelLabel) diff --git a/web/containers/ModelSearch/index.tsx b/web/containers/ModelSearch/index.tsx index 9c3ca1cb0..aa40f8331 100644 --- a/web/containers/ModelSearch/index.tsx +++ b/web/containers/ModelSearch/index.tsx @@ -1,18 +1,16 @@ -import React, { ChangeEvent, useCallback, useState } from 'react' +import React, { ChangeEvent, useCallback, useState, useRef } from 'react' import { Input } from '@janhq/joi' -import { useSetAtom } from 'jotai' import { SearchIcon } from 'lucide-react' + import { useDebouncedCallback } from 'use-debounce' -import { toaster } from '@/containers/Toast' - -import { useGetHFRepoData } from '@/hooks/useGetHFRepoData' - import { - importHuggingFaceModelStageAtom, - importingHuggingFaceRepoDataAtom, -} from '@/helpers/atoms/HuggingFace.atom' + useGetModelSources, + useModelSourcesMutation, +} from '@/hooks/useModelSource' + +import Spinner from '../Loader/Spinner' type Props = { onSearchLocal?: (searchText: string) => void @@ -20,37 +18,28 @@ type Props = { const ModelSearch = ({ onSearchLocal }: Props) => { const [searchText, setSearchText] = useState('') - const { getHfRepoData } = useGetHFRepoData() - - const setImportingHuggingFaceRepoData = useSetAtom( - importingHuggingFaceRepoDataAtom - ) - const setImportHuggingFaceModelStage = useSetAtom( - importHuggingFaceModelStageAtom - ) - + const [isSearching, setSearching] = useState(false) + const { mutate } = useGetModelSources() + const { addModelSource } = useModelSourcesMutation() + const inputRef = useRef(null) const debounced = useDebouncedCallback(async () => { if (searchText.indexOf('/') === -1) { // If we don't find / in the text, perform a local search onSearchLocal?.(searchText) return } + // Attempt to search local + onSearchLocal?.(searchText) - try { - const data = await getHfRepoData(searchText) - setImportingHuggingFaceRepoData(data) - setImportHuggingFaceModelStage('REPO_DETAIL') - } catch (err) { - let errMessage = 'Unexpected Error' - if (err instanceof Error) { - errMessage = err.message - } - toaster({ - title: errMessage, - type: 'error', + setSearching(true) + // Attempt to search model source + addModelSource(searchText) + .then(() => mutate()) + .then(() => onSearchLocal?.(searchText)) + .catch((e) => { + console.debug(e) }) - console.error(err) - } + .finally(() => setSearching(false)) }, 300) const onSearchChanged = useCallback( @@ -80,13 +69,24 @@ const ModelSearch = ({ onSearchLocal }: Props) => { return ( } - placeholder="Search or paste Hugging Face URL" + ref={inputRef} + prefixIcon={ + isSearching ? ( + + ) : ( + + ) + } + placeholder="Search or enter Hugging Face URL" onChange={onSearchChanged} onKeyDown={onKeyDown} value={searchText} clearable={searchText.length > 0} onClear={onClear} + className="border-0 bg-[hsla(var(--app-bg))]" + onClick={() => { + onSearchLocal?.(inputRef.current?.value ?? '') + }} /> ) } diff --git a/web/containers/Providers/AppUpdateListener.tsx b/web/containers/Providers/AppUpdateListener.tsx index 4d05f6010..39b78aac7 100644 --- a/web/containers/Providers/AppUpdateListener.tsx +++ b/web/containers/Providers/AppUpdateListener.tsx @@ -5,12 +5,16 @@ import { useSetAtom } from 'jotai' import { appDownloadProgressAtom, + appUpdateAvailableAtom, updateVersionErrorAtom, + appUpdateNotAvailableAtom, } from '@/helpers/atoms/App.atom' const AppUpdateListener = () => { const setProgress = useSetAtom(appDownloadProgressAtom) const setUpdateVersionError = useSetAtom(updateVersionErrorAtom) + const setAppUpdateAvailable = useSetAtom(appUpdateAvailableAtom) + const setAppUpdateNotvailable = useSetAtom(appUpdateNotAvailableAtom) useEffect(() => { if (window && window.electronAPI) { @@ -36,8 +40,17 @@ const AppUpdateListener = () => { window.electronAPI.onAppUpdateDownloadSuccess(() => { setProgress(-1) }) + + window.electronAPI.onAppUpdateAvailable(() => { + setAppUpdateAvailable(true) + }) + + window.electronAPI.onAppUpdateNotAvailable(() => { + setAppUpdateAvailable(false) + setAppUpdateNotvailable(true) + }) } - }, [setProgress, setUpdateVersionError]) + }, [setProgress, setUpdateVersionError, setAppUpdateAvailable]) return } diff --git a/web/containers/Providers/DataLoader.tsx b/web/containers/Providers/DataLoader.tsx index 832e47d1a..1174150f4 100644 --- a/web/containers/Providers/DataLoader.tsx +++ b/web/containers/Providers/DataLoader.tsx @@ -15,6 +15,7 @@ import { useDebouncedCallback } from 'use-debounce' import useAssistants from '@/hooks/useAssistants' import { useGetEngines } from '@/hooks/useEngineManagement' import useGetSystemResources from '@/hooks/useGetSystemResources' +import { useGetHardwareInfo } from '@/hooks/useHardwareManagement' import useModels from '@/hooks/useModels' import useThreads from '@/hooks/useThreads' @@ -34,6 +35,7 @@ const DataLoader: React.FC = () => { const setJanSettingScreen = useSetAtom(janSettingScreenAtom) const { getData: loadModels } = useModels() const { mutate } = useGetEngines() + const { mutate: getHardwareInfo } = useGetHardwareInfo(false) useThreads() useAssistants() @@ -42,6 +44,7 @@ const DataLoader: React.FC = () => { useEffect(() => { // Load data once loadModels() + getHardwareInfo() // eslint-disable-next-line react-hooks/exhaustive-deps }, []) const reloadData = useDebouncedCallback(() => { diff --git a/web/containers/Providers/DeepLinkListener.tsx b/web/containers/Providers/DeepLinkListener.tsx index b991996a2..41a8d9e24 100644 --- a/web/containers/Providers/DeepLinkListener.tsx +++ b/web/containers/Providers/DeepLinkListener.tsx @@ -4,25 +4,25 @@ import { useSetAtom } from 'jotai' import { useDebouncedCallback } from 'use-debounce' -import { useGetHFRepoData } from '@/hooks/useGetHFRepoData' +import { MainViewState } from '@/constants/screens' + +import { + useGetModelSources, + useModelSourcesMutation, +} from '@/hooks/useModelSource' import { loadingModalInfoAtom } from '../LoadingModal' import { toaster } from '../Toast' -import { - importHuggingFaceModelStageAtom, - importingHuggingFaceRepoDataAtom, -} from '@/helpers/atoms/HuggingFace.atom' +import { mainViewStateAtom } from '@/helpers/atoms/App.atom' +import { modelDetailAtom } from '@/helpers/atoms/Model.atom' const DeepLinkListener: React.FC = () => { - const { getHfRepoData } = useGetHFRepoData() + const { addModelSource } = useModelSourcesMutation() const setLoadingInfo = useSetAtom(loadingModalInfoAtom) - const setImportingHuggingFaceRepoData = useSetAtom( - importingHuggingFaceRepoDataAtom - ) - const setImportHuggingFaceModelStage = useSetAtom( - importHuggingFaceModelStageAtom - ) + const setMainView = useSetAtom(mainViewStateAtom) + const setModelDetail = useSetAtom(modelDetailAtom) + const { mutate } = useGetModelSources() const handleDeepLinkAction = useDebouncedCallback( async (deepLinkAction: DeepLinkAction) => { @@ -38,17 +38,17 @@ const DeepLinkListener: React.FC = () => { try { setLoadingInfo({ - title: 'Getting Hugging Face models', + title: 'Getting Hugging Face model details', message: 'Please wait..', }) - const data = await getHfRepoData(deepLinkAction.resource) - setImportingHuggingFaceRepoData(data) - setImportHuggingFaceModelStage('REPO_DETAIL') + await addModelSource(deepLinkAction.resource).then(() => mutate()) setLoadingInfo(undefined) + setMainView(MainViewState.Hub) + setModelDetail(deepLinkAction.resource) } catch (err) { setLoadingInfo(undefined) toaster({ - title: 'Failed to get Hugging Face models', + title: 'Failed to get Hugging Face model details', description: err instanceof Error ? err.message : 'Unexpected Error', type: 'error', }) diff --git a/web/containers/Providers/EventListener.tsx b/web/containers/Providers/EventListener.tsx index 55c172beb..27764bcdc 100644 --- a/web/containers/Providers/EventListener.tsx +++ b/web/containers/Providers/EventListener.tsx @@ -4,8 +4,8 @@ import React from 'react' import { DownloadEvent, - events, DownloadState, + events, ModelEvent, ExtensionTypeEnum, ModelExtension, @@ -17,23 +17,15 @@ import { useSetAtom } from 'jotai' import { setDownloadStateAtom } from '@/hooks/useDownloadState' -import { formatExtensionsName } from '@/utils/converter' - import { toaster } from '../Toast' import AppUpdateListener from './AppUpdateListener' import ClipboardListener from './ClipboardListener' import ModelHandler from './ModelHandler' -import ModelImportListener from './ModelImportListener' import QuickAskListener from './QuickAskListener' import { extensionManager } from '@/extension' -import { - InstallingExtensionState, - removeInstallingExtensionAtom, - setInstallingExtensionAtom, -} from '@/helpers/atoms/Extension.atom' import { addDownloadingModelAtom, removeDownloadingModelAtom, @@ -41,109 +33,76 @@ import { const EventListener = () => { const setDownloadState = useSetAtom(setDownloadStateAtom) - const setInstallingExtension = useSetAtom(setInstallingExtensionAtom) - const removeInstallingExtension = useSetAtom(removeInstallingExtensionAtom) const addDownloadingModel = useSetAtom(addDownloadingModelAtom) const removeDownloadingModel = useSetAtom(removeDownloadingModelAtom) const onFileDownloadUpdate = useCallback( async (state: DownloadState) => { console.debug('onFileDownloadUpdate', state) - if (state.downloadType === 'extension') { - const installingExtensionState: InstallingExtensionState = { - extensionId: state.extensionId!, - percentage: state.percent, - localPath: state.localPath, - } - setInstallingExtension(state.extensionId!, installingExtensionState) - } else { - addDownloadingModel(state.modelId) - setDownloadState(state) - } + addDownloadingModel(state.modelId) + setDownloadState(state) }, - [addDownloadingModel, setDownloadState, setInstallingExtension] + [addDownloadingModel, setDownloadState] ) const onFileDownloadError = useCallback( (state: DownloadState) => { console.debug('onFileDownloadError', state) - if (state.downloadType === 'extension') { - removeInstallingExtension(state.extensionId!) - } else { - state.downloadState = 'error' - setDownloadState(state) - removeDownloadingModel(state.modelId) - } + state.downloadState = 'error' + setDownloadState(state) + removeDownloadingModel(state.modelId) }, - [removeInstallingExtension, setDownloadState, removeDownloadingModel] + [setDownloadState, removeDownloadingModel] ) const onFileDownloadStopped = useCallback( (state: DownloadState) => { console.debug('onFileDownloadError', state) - if (state.downloadType === 'extension') { - removeInstallingExtension(state.extensionId!) - } else { - state.downloadState = 'error' - state.error = 'aborted' - setDownloadState(state) - removeDownloadingModel(state.modelId) - } + + state.downloadState = 'error' + state.error = 'aborted' + setDownloadState(state) + removeDownloadingModel(state.modelId) }, - [removeInstallingExtension, setDownloadState, removeDownloadingModel] + [setDownloadState, removeDownloadingModel] ) const onFileDownloadSuccess = useCallback( async (state: DownloadState) => { console.debug('onFileDownloadSuccess', state) - if (state.downloadType !== 'extension') { - // Update model metadata accordingly - const model = ModelManager.instance().models.get(state.modelId) - if (model) { - await extensionManager - .get(ExtensionTypeEnum.Model) - ?.updateModel({ - id: model.id, - ...model.settings, - ...model.parameters, - } as Partial) - .catch((e) => console.debug(e)) - toaster({ - title: 'Download Completed', - description: `Download ${state.modelId} completed`, - type: 'success', - }) - } - state.downloadState = 'end' - setDownloadState(state) - removeDownloadingModel(state.modelId) - events.emit(ModelEvent.OnModelsUpdate, { fetch: true }) + // Update model metadata accordingly + const model = ModelManager.instance().models.get(state.modelId) + if (model) { + await extensionManager + .get(ExtensionTypeEnum.Model) + ?.updateModel({ + id: model.id, + ...model.settings, + ...model.parameters, + } as Partial) + .catch((e) => console.debug(e)) + + toaster({ + title: 'Download Completed', + description: `Download ${state.modelId} completed`, + type: 'success', + }) } + state.downloadState = 'end' + setDownloadState(state) + removeDownloadingModel(state.modelId) + events.emit(ModelEvent.OnModelsUpdate, { fetch: true }) }, [removeDownloadingModel, setDownloadState] ) - const onFileUnzipSuccess = useCallback( - (state: DownloadState) => { - console.debug('onFileUnzipSuccess', state) - toaster({ - title: 'Success', - description: `Install ${formatExtensionsName(state.extensionId!)} successfully.`, - type: 'success', - }) - removeInstallingExtension(state.extensionId!) - }, - [removeInstallingExtension] - ) - useEffect(() => { console.debug('EventListenerWrapper: registering event listeners...') events.on(DownloadEvent.onFileDownloadUpdate, onFileDownloadUpdate) events.on(DownloadEvent.onFileDownloadError, onFileDownloadError) events.on(DownloadEvent.onFileDownloadSuccess, onFileDownloadSuccess) events.on(DownloadEvent.onFileDownloadStopped, onFileDownloadStopped) - events.on(DownloadEvent.onFileUnzipSuccess, onFileUnzipSuccess) return () => { console.debug('EventListenerWrapper: unregistering event listeners...') @@ -151,13 +110,11 @@ const EventListener = () => { events.off(DownloadEvent.onFileDownloadError, onFileDownloadError) events.off(DownloadEvent.onFileDownloadSuccess, onFileDownloadSuccess) events.off(DownloadEvent.onFileDownloadStopped, onFileDownloadStopped) - events.off(DownloadEvent.onFileUnzipSuccess, onFileUnzipSuccess) } }, [ onFileDownloadUpdate, onFileDownloadError, onFileDownloadSuccess, - onFileUnzipSuccess, onFileDownloadStopped, ]) @@ -165,7 +122,6 @@ const EventListener = () => { <> - diff --git a/web/containers/Providers/ModelHandler.tsx b/web/containers/Providers/ModelHandler.tsx index cceb88a4c..786dbd4f0 100644 --- a/web/containers/Providers/ModelHandler.tsx +++ b/web/containers/Providers/ModelHandler.tsx @@ -18,7 +18,7 @@ import { extractInferenceParams, ModelExtension, } from '@janhq/core' -import { useAtomValue, useSetAtom } from 'jotai' +import { useAtom, useAtomValue, useSetAtom } from 'jotai' import { ulid } from 'ulidx' import { activeModelAtom, stateModelAtom } from '@/hooks/useActiveModel' @@ -75,8 +75,10 @@ export default function ModelHandler() { const activeThreadRef = useRef(activeThread) const activeModelParams = useAtomValue(getActiveThreadModelParamsAtom) const activeModelParamsRef = useRef(activeModelParams) - const setTokenSpeed = useSetAtom(tokenSpeedAtom) + + const [tokenSpeed, setTokenSpeed] = useAtom(tokenSpeedAtom) const { engines } = useGetEngines() + const tokenSpeedRef = useRef(tokenSpeed) useEffect(() => { activeThreadRef.current = activeThread @@ -106,6 +108,10 @@ export default function ModelHandler() { messageGenerationSubscriber.current = subscribedGeneratingMessage }, [subscribedGeneratingMessage]) + useEffect(() => { + tokenSpeedRef.current = tokenSpeed + }, [tokenSpeed]) + const onNewMessageResponse = useCallback( async (message: ThreadMessage) => { if (message.type === MessageRequestType.Thread) { @@ -227,6 +233,7 @@ export default function ModelHandler() { tokenSpeed: averageTokenSpeed, tokenCount: totalTokenCount, message: message.id, + model: activeModelRef.current?.name, } }) return @@ -275,6 +282,13 @@ export default function ModelHandler() { metadata, }) + // Update message's metadata with token usage + message.metadata = { + ...message.metadata, + token_speed: tokenSpeedRef.current?.tokenSpeed, + model: activeModelRef.current?.name, + } + if (message.status === MessageStatus.Error) { message.metadata = { ...message.metadata, diff --git a/web/containers/Providers/ModelImportListener.tsx b/web/containers/Providers/ModelImportListener.tsx deleted file mode 100644 index e99b1e6fc..000000000 --- a/web/containers/Providers/ModelImportListener.tsx +++ /dev/null @@ -1,109 +0,0 @@ -import { Fragment, useCallback, useEffect } from 'react' - -import { - ImportingModel, - LocalImportModelEvent, - Model, - ModelEvent, - events, -} from '@janhq/core' -import { useSetAtom } from 'jotai' - -import { snackbar } from '../Toast' - -import { - setImportingModelErrorAtom, - setImportingModelSuccessAtom, - updateImportingModelProgressAtom, -} from '@/helpers/atoms/Model.atom' - -const ModelImportListener = () => { - const updateImportingModelProgress = useSetAtom( - updateImportingModelProgressAtom - ) - const setImportingModelSuccess = useSetAtom(setImportingModelSuccessAtom) - const setImportingModelFailed = useSetAtom(setImportingModelErrorAtom) - - const onImportModelUpdate = useCallback( - async (state: ImportingModel) => { - if (!state.importId) return - updateImportingModelProgress(state.importId, state.percentage ?? 0) - }, - [updateImportingModelProgress] - ) - - const onImportModelFailed = useCallback( - async (state: ImportingModel) => { - if (!state.importId) return - setImportingModelFailed(state.importId, state.error ?? '') - }, - [setImportingModelFailed] - ) - - const onImportModelSuccess = useCallback( - (state: ImportingModel) => { - if (!state.modelId) return - events.emit(ModelEvent.OnModelsUpdate, { fetch: true }) - setImportingModelSuccess(state.importId, state.modelId) - }, - [setImportingModelSuccess] - ) - - const onImportModelFinished = useCallback((importedModels: Model[]) => { - const modelText = importedModels.length === 1 ? 'model' : 'models' - snackbar({ - description: `Successfully imported ${importedModels.length} ${modelText}`, - type: 'success', - }) - }, []) - - useEffect(() => { - console.debug('ModelImportListener: registering event listeners..') - - events.on( - LocalImportModelEvent.onLocalImportModelUpdate, - onImportModelUpdate - ) - events.on( - LocalImportModelEvent.onLocalImportModelSuccess, - onImportModelSuccess - ) - events.on( - LocalImportModelEvent.onLocalImportModelFinished, - onImportModelFinished - ) - events.on( - LocalImportModelEvent.onLocalImportModelFailed, - onImportModelFailed - ) - - return () => { - console.debug('ModelImportListener: unregistering event listeners...') - events.off( - LocalImportModelEvent.onLocalImportModelUpdate, - onImportModelUpdate - ) - events.off( - LocalImportModelEvent.onLocalImportModelSuccess, - onImportModelSuccess - ) - events.off( - LocalImportModelEvent.onLocalImportModelFinished, - onImportModelFinished - ) - events.off( - LocalImportModelEvent.onLocalImportModelFailed, - onImportModelFailed - ) - } - }, [ - onImportModelUpdate, - onImportModelSuccess, - onImportModelFinished, - onImportModelFailed, - ]) - - return -} - -export default ModelImportListener diff --git a/web/containers/Providers/QuickAskConfigurator.tsx b/web/containers/Providers/QuickAskConfigurator.tsx new file mode 100644 index 000000000..40e5caf8e --- /dev/null +++ b/web/containers/Providers/QuickAskConfigurator.tsx @@ -0,0 +1,17 @@ +'use client' + +import { PropsWithChildren, useEffect, useState } from 'react' + +import { setupCoreServices } from '@/services/coreService' + +export const QuickAskConfigurator = ({ children }: PropsWithChildren) => { + const [setupCore, setSetupCore] = useState(false) + + // Services Setup + useEffect(() => { + setupCoreServices() + setSetupCore(true) + }, []) + + return <>{setupCore && <>{children}} +} diff --git a/web/containers/Providers/index.tsx b/web/containers/Providers/index.tsx index 5d14ea95a..78cb76d78 100644 --- a/web/containers/Providers/index.tsx +++ b/web/containers/Providers/index.tsx @@ -14,28 +14,39 @@ import DataLoader from './DataLoader' import DeepLinkListener from './DeepLinkListener' import KeyListener from './KeyListener' +import { QuickAskConfigurator } from './QuickAskConfigurator' import Responsive from './Responsive' import SWRConfigProvider from './SWRConfigProvider' import SettingsHandler from './SettingsHandler' const Providers = ({ children }: PropsWithChildren) => { + const isQuickAsk = + typeof window !== 'undefined' && window.electronAPI?.isQuickAsk() return ( - + {isQuickAsk && ( <> - - - - - - - - {children} + {children} - + )} + {!isQuickAsk && ( + + <> + + + + + + + +
    + {children} + + + )} diff --git a/web/containers/RightPanelContainer/index.tsx b/web/containers/RightPanelContainer/index.tsx index 7443ab61a..6d474d557 100644 --- a/web/containers/RightPanelContainer/index.tsx +++ b/web/containers/RightPanelContainer/index.tsx @@ -12,7 +12,10 @@ import { atom, useAtom, useAtomValue } from 'jotai' import { twMerge } from 'tailwind-merge' import { showRightPanelAtom } from '@/helpers/atoms/App.atom' -import { reduceTransparentAtom } from '@/helpers/atoms/Setting.atom' +import { + reduceTransparentAtom, + showScrollBarAtom, +} from '@/helpers/atoms/Setting.atom' type Props = PropsWithChildren @@ -28,6 +31,7 @@ const RightPanelContainer = ({ children }: Props) => { null ) const reduceTransparent = useAtomValue(reduceTransparentAtom) + const showScrollBar = useAtomValue(showScrollBarAtom) const [showRightPanel, setShowRightPanel] = useAtom(showRightPanelAtom) const matches = useMediaQuery('(max-width: 880px)') @@ -105,7 +109,10 @@ const RightPanelContainer = ({ children }: Props) => { style={{ width: showRightPanel ? rightPanelWidth : 0 }} onMouseDown={(e) => isResizing && e.preventDefault()} > - + {children} {showRightPanel && !matches && ( diff --git a/web/containers/ServerLogs/index.tsx b/web/containers/ServerLogs/index.tsx index b89a4c237..c9074808c 100644 --- a/web/containers/ServerLogs/index.tsx +++ b/web/containers/ServerLogs/index.tsx @@ -14,6 +14,7 @@ import { useLogs } from '@/hooks/useLogs' import { usePath } from '@/hooks/usePath' import { serverEnabledAtom } from '@/helpers/atoms/LocalServer.atom' +import { showScrollBarAtom } from '@/helpers/atoms/Setting.atom' type ServerLogsProps = { limit?: number; withCopy?: boolean } @@ -25,6 +26,7 @@ const ServerLogs = (props: ServerLogsProps) => { const listRef = useRef(null) const prevScrollTop = useRef(0) const isUserManuallyScrollingUp = useRef(false) + const showScrollBar = useAtomValue(showScrollBarAtom) const updateLogs = useCallback( () => @@ -136,6 +138,7 @@ const ServerLogs = (props: ServerLogsProps) => { )}
    ('') export const LocalEngineDefaultVariantAtom = atom('') +export const RecommendEngineVariantAtom = atomWithStorage( + 'recommendEngineVariant', + '', + undefined, + { getOnInit: true } +) + const SHOW_RIGHT_PANEL = 'showRightPanel' // Store panel atom @@ -25,6 +32,8 @@ export const showRightPanelAtom = atomWithStorage( export const showSystemMonitorPanelAtom = atom(false) export const appDownloadProgressAtom = atom(-1) export const updateVersionErrorAtom = atom(undefined) +export const appUpdateAvailableAtom = atom(false) +export const appUpdateNotAvailableAtom = atom(false) const COPY_OVER_INSTRUCTION_ENABLED = 'copy_over_instruction_enabled' @@ -32,3 +41,30 @@ export const copyOverInstructionEnabledAtom = atomWithStorage( COPY_OVER_INSTRUCTION_ENABLED, false ) + +/** + * App Banner Hub Atom - storage last banner setting - default undefined + */ +const appBannerHubStorageAtom = atomWithStorage( + 'appBannerHub', + undefined, + undefined, + { + getOnInit: true, + } +) +/** + * App Hub Banner configured image - Retrieve from appBannerHubStorageAtom - fallback a random banner + */ +export const getAppBannerHubAtom = atom( + (get) => + get(appBannerHubStorageAtom) ?? + `./images/HubBanner/banner-${Math.floor(Math.random() * 30) + 1}.jpg` +) + +/** + * Set App Hub Banner - store in appBannerHubStorageAtom + */ +export const setAppBannerHubAtom = atom(null, (get, set, banner: string) => { + set(appBannerHubStorageAtom, banner) +}) diff --git a/web/helpers/atoms/Extension.atom.test.ts b/web/helpers/atoms/Extension.atom.test.ts index 2a12cd7db..d41290eea 100644 --- a/web/helpers/atoms/Extension.atom.test.ts +++ b/web/helpers/atoms/Extension.atom.test.ts @@ -9,54 +9,6 @@ describe('Extension.atom.ts', () => { jest.clearAllMocks() }) - describe('installingExtensionAtom', () => { - it('should initialize as an empty array', () => { - const { result } = renderHook(() => useAtomValue(ExtensionAtoms.installingExtensionAtom)) - expect(result.current).toEqual([]) - }) - }) - - describe('setInstallingExtensionAtom', () => { - it('should add a new installing extension', () => { - const { result: setAtom } = renderHook(() => useSetAtom(ExtensionAtoms.setInstallingExtensionAtom)) - const { result: getAtom } = renderHook(() => useAtomValue(ExtensionAtoms.installingExtensionAtom)) - - act(() => { - setAtom.current('ext1', { extensionId: 'ext1', percentage: 0 }) - }) - - expect(getAtom.current).toEqual([{ extensionId: 'ext1', percentage: 0 }]) - }) - - it('should update an existing installing extension', () => { - const { result: setAtom } = renderHook(() => useSetAtom(ExtensionAtoms.setInstallingExtensionAtom)) - const { result: getAtom } = renderHook(() => useAtomValue(ExtensionAtoms.installingExtensionAtom)) - - act(() => { - setAtom.current('ext1', { extensionId: 'ext1', percentage: 0 }) - setAtom.current('ext1', { extensionId: 'ext1', percentage: 50 }) - }) - - expect(getAtom.current).toEqual([{ extensionId: 'ext1', percentage: 50 }]) - }) - }) - - describe('removeInstallingExtensionAtom', () => { - it('should remove an installing extension', () => { - const { result: setAtom } = renderHook(() => useSetAtom(ExtensionAtoms.setInstallingExtensionAtom)) - const { result: removeAtom } = renderHook(() => useSetAtom(ExtensionAtoms.removeInstallingExtensionAtom)) - const { result: getAtom } = renderHook(() => useAtomValue(ExtensionAtoms.installingExtensionAtom)) - - act(() => { - setAtom.current('ext1', { extensionId: 'ext1', percentage: 0 }) - setAtom.current('ext2', { extensionId: 'ext2', percentage: 50 }) - removeAtom.current('ext1') - }) - - expect(getAtom.current).toEqual([{ extensionId: 'ext2', percentage: 50 }]) - }) - }) - describe('inActiveEngineProviderAtom', () => { it('should initialize as an empty array', () => { const { result } = renderHook(() => useAtomValue(ExtensionAtoms.inActiveEngineProviderAtom)) diff --git a/web/helpers/atoms/Extension.atom.ts b/web/helpers/atoms/Extension.atom.ts index 3f1843dc4..7e008df85 100644 --- a/web/helpers/atoms/Extension.atom.ts +++ b/web/helpers/atoms/Extension.atom.ts @@ -1,45 +1,5 @@ -import { atom } from 'jotai' import { atomWithStorage } from 'jotai/utils' -type ExtensionId = string - -export type InstallingExtensionState = { - extensionId: ExtensionId - percentage: number - localPath?: string -} - -export const installingExtensionAtom = atom([]) - -export const setInstallingExtensionAtom = atom( - null, - (get, set, extensionId: string, state: InstallingExtensionState) => { - const current = get(installingExtensionAtom) - - const isExists = current.some((e) => e.extensionId === extensionId) - if (isExists) { - const newCurrent = current.map((e) => { - if (e.extensionId === extensionId) { - return state - } - return e - }) - set(installingExtensionAtom, newCurrent) - } else { - set(installingExtensionAtom, [...current, state]) - } - } -) - -export const removeInstallingExtensionAtom = atom( - null, - (get, set, extensionId: string) => { - const current = get(installingExtensionAtom) - const newCurrent = current.filter((e) => e.extensionId !== extensionId) - set(installingExtensionAtom, newCurrent) - } -) - const INACTIVE_ENGINE_PROVIDER = 'inActiveEngineProvider' export const inActiveEngineProviderAtom = atomWithStorage( INACTIVE_ENGINE_PROVIDER, diff --git a/web/helpers/atoms/HuggingFace.atom.test.ts b/web/helpers/atoms/HuggingFace.atom.test.ts deleted file mode 100644 index 134d19947..000000000 --- a/web/helpers/atoms/HuggingFace.atom.test.ts +++ /dev/null @@ -1,14 +0,0 @@ - -import { importHuggingFaceModelStageAtom } from './HuggingFace.atom'; -import { importingHuggingFaceRepoDataAtom } from './HuggingFace.atom'; - -test('importHuggingFaceModelStageAtom should have initial value of NONE', () => { - const result = importHuggingFaceModelStageAtom.init; - expect(result).toBe('NONE'); -}); - - -test('importingHuggingFaceRepoDataAtom should have initial value of undefined', () => { - const result = importingHuggingFaceRepoDataAtom.init; - expect(result).toBeUndefined(); -}); diff --git a/web/helpers/atoms/HuggingFace.atom.ts b/web/helpers/atoms/HuggingFace.atom.ts deleted file mode 100644 index 09f7870a3..000000000 --- a/web/helpers/atoms/HuggingFace.atom.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { HuggingFaceRepoData } from '@janhq/core' -import { atom } from 'jotai' - -// modals -export type ImportHuggingFaceModelStage = 'NONE' | 'REPO_DETAIL' - -export const importingHuggingFaceRepoDataAtom = atom< - HuggingFaceRepoData | undefined ->(undefined) - -export const importHuggingFaceModelStageAtom = - atom('NONE') diff --git a/web/helpers/atoms/Model.atom.ts b/web/helpers/atoms/Model.atom.ts index 445e36a4a..22f277294 100644 --- a/web/helpers/atoms/Model.atom.ts +++ b/web/helpers/atoms/Model.atom.ts @@ -60,6 +60,11 @@ export const showEngineListModelAtom = atom([ InferenceEngine.cortex_tensorrtllm, ]) +/** + * Atom to store the current model detail page of a certain model id + */ +export const modelDetailAtom = atom(undefined) + /// End Models Atom /// Model Download Atom diff --git a/web/helpers/atoms/Setting.atom.ts b/web/helpers/atoms/Setting.atom.ts index 3568d87d0..d8ad38a6d 100644 --- a/web/helpers/atoms/Setting.atom.ts +++ b/web/helpers/atoms/Setting.atom.ts @@ -11,6 +11,7 @@ export const janSettingScreenAtom = atom([]) export const THEME = 'themeAppearance' export const REDUCE_TRANSPARENT = 'reduceTransparent' export const SPELL_CHECKING = 'spellChecking' +export const SCROLL_BAR = 'scrollBar' export const PRODUCT_ANALYTIC = 'productAnalytic' export const PRODUCT_ANALYTIC_PROMPT = 'productAnalyticPrompt' export const THEME_DATA = 'themeData' @@ -45,6 +46,12 @@ export const spellCheckAtom = atomWithStorage( undefined, { getOnInit: true } ) +export const showScrollBarAtom = atomWithStorage( + SCROLL_BAR, + false, + undefined, + { getOnInit: true } +) export const productAnalyticAtom = atomWithStorage( PRODUCT_ANALYTIC, false, diff --git a/web/hooks/useApp.ts b/web/hooks/useApp.ts new file mode 100644 index 000000000..f30b9e3c5 --- /dev/null +++ b/web/hooks/useApp.ts @@ -0,0 +1,10 @@ +import { extensionManager } from '@/extension' + +export function useApp() { + async function relaunch() { + const extensions = extensionManager.getAll() + await Promise.all(extensions.map((e) => e.onUnload())) + window.core?.api?.relaunch() + } + return { relaunch } +} diff --git a/web/hooks/useEngineManagement.ts b/web/hooks/useEngineManagement.ts index fec5eb0ed..02044ec65 100644 --- a/web/hooks/useEngineManagement.ts +++ b/web/hooks/useEngineManagement.ts @@ -1,4 +1,4 @@ -import { useMemo } from 'react' +import { useCallback, useMemo, useState } from 'react' import { ExtensionTypeEnum, @@ -10,12 +10,17 @@ import { EngineEvent, Model, ModelEvent, + ModelSource, + ModelSibling, } from '@janhq/core' -import { useAtom } from 'jotai' +import { useAtom, useAtomValue } from 'jotai' import { atomWithStorage } from 'jotai/utils' import useSWR from 'swr' +import { getDescriptionByEngine, getTitleByEngine } from '@/utils/modelEngine' + import { extensionManager } from '@/extension/ExtensionManager' +import { downloadedModelsAtom } from '@/helpers/atoms/Model.atom' export const releasedEnginesCacheAtom = atomWithStorage<{ data: EngineReleased[] @@ -27,6 +32,13 @@ export const releasedEnginesLatestCacheAtom = atomWithStorage<{ timestamp: number } | null>('releasedEnginesLatestCache', null, undefined, { getOnInit: true }) +export interface RemoteModelList { + data?: { + id?: string + name?: string + }[] +} + // fetcher function async function fetchExtensionData( extension: EngineManagementExtension | null, @@ -83,8 +95,12 @@ export function useGetRemoteModels(name: string) { error, mutate, } = useSWR( - extension ? 'remoteModels' : null, - () => fetchExtensionData(extension, (ext) => ext.getRemoteModels(name)), + extension ? `remoteModels_${name}` : null, + () => + fetchExtensionData( + extension, + (ext) => ext.getRemoteModels(name) as Promise + ), { revalidateOnFocus: false, revalidateOnReconnect: true, @@ -415,3 +431,69 @@ export const addRemoteEngineModel = async (name: string, engine: string) => { throw error } } + +/** + * Remote model sources + * @returns A Promise that resolves to an object of model sources. + */ +export const useGetEngineModelSources = () => { + const { engines } = useGetEngines() + const downloadedModels = useAtomValue(downloadedModelsAtom) + + return { + sources: Object.entries(engines ?? {}) + ?.filter((e) => e?.[1]?.[0]?.type === 'remote') + .map( + ([key, values]) => + ({ + id: key, + models: ( + downloadedModels.filter((e) => e.engine === values[0]?.engine) ?? + [] + ).map( + (e) => + ({ + id: e.id, + size: e.metadata?.size, + }) as unknown as ModelSibling + ), + metadata: { + id: getTitleByEngine(key as InferenceEngine), + description: getDescriptionByEngine(key as InferenceEngine), + apiKey: values[0]?.api_key, + }, + type: 'cloud', + }) as unknown as ModelSource + ), + } +} + +/** + * Refresh model list + * @param engine + * @returns + */ +export const useRefreshModelList = (engine: string) => { + const [refreshingModels, setRefreshingModels] = useState(false) + const { mutate: fetchRemoteModels } = useGetRemoteModels(engine) + + const refreshModels = useCallback( + (engine: string) => { + setRefreshingModels(true) + fetchRemoteModels() + .then((remoteModelList) => + Promise.all( + remoteModelList?.data?.map((model: { id?: string }) => + model?.id + ? addRemoteEngineModel(model.id, engine).catch(() => {}) + : {} + ) ?? [] + ) + ) + .finally(() => setRefreshingModels(false)) + }, + [fetchRemoteModels] + ) + + return { refreshingModels, refreshModels } +} diff --git a/web/hooks/useGetLatestRelease.ts b/web/hooks/useGetLatestRelease.ts new file mode 100644 index 000000000..58de2ddb8 --- /dev/null +++ b/web/hooks/useGetLatestRelease.ts @@ -0,0 +1,35 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +import useSWR from 'swr' + +const fetchLatestRelease = async (includeBeta: boolean) => { + const res = await fetch( + 'https://api.github.com/repos/menloresearch/jan/releases' + ) + if (!res.ok) throw new Error('Failed to fetch releases') + + const releases = await res.json() + + // Filter stable and beta releases + const stableRelease = releases.find( + (release: { prerelease: any; draft: any }) => + !release.prerelease && !release.draft + ) + const betaRelease = releases.find( + (release: { prerelease: any }) => release.prerelease + ) + + return includeBeta ? (betaRelease ?? stableRelease) : stableRelease +} + +export function useGetLatestRelease(includeBeta = false) { + const { data, error, mutate } = useSWR( + ['latestRelease', includeBeta], + () => fetchLatestRelease(includeBeta), + { + revalidateOnFocus: false, + revalidateOnReconnect: true, + } + ) + + return { release: data, error, mutate } +} diff --git a/web/hooks/useHardwareManagement.ts b/web/hooks/useHardwareManagement.ts index d39b3c1fc..90dbdb2b5 100644 --- a/web/hooks/useHardwareManagement.ts +++ b/web/hooks/useHardwareManagement.ts @@ -32,7 +32,7 @@ const getExtension = () => /** * @returns A Promise that resolves to an object of list engines. */ -export function useGetHardwareInfo() { +export function useGetHardwareInfo(updatePeriodically: boolean = true) { const setCpuUsage = useSetAtom(cpuUsageAtom) const setUsedRam = useSetAtom(usedRamAtom) const setTotalRam = useSetAtom(totalRamAtom) @@ -56,7 +56,7 @@ export function useGetHardwareInfo() { { revalidateOnFocus: false, revalidateOnReconnect: false, - refreshInterval: 2000, + refreshInterval: updatePeriodically ? 2000 : undefined, } ) diff --git a/web/hooks/useImportModel.ts b/web/hooks/useImportModel.ts index 84c6a5126..94d11b455 100644 --- a/web/hooks/useImportModel.ts +++ b/web/hooks/useImportModel.ts @@ -3,8 +3,8 @@ import { useCallback } from 'react' import { ExtensionTypeEnum, ImportingModel, - LocalImportModelEvent, Model, + ModelEvent, ModelExtension, OptionType, events, @@ -25,6 +25,7 @@ import { downloadedModelsAtom, importingModelsAtom, removeDownloadingModelAtom, + setImportingModelSuccessAtom, } from '@/helpers/atoms/Model.atom' export type ImportModelStage = @@ -59,6 +60,7 @@ const useImportModel = () => { const addDownloadingModel = useSetAtom(addDownloadingModelAtom) const removeDownloadingModel = useSetAtom(removeDownloadingModelAtom) const downloadedModels = useAtomValue(downloadedModelsAtom) + const setImportingModelSuccess = useSetAtom(setImportingModelSuccessAtom) const incrementalModelName = useCallback( (name: string, startIndex: number = 0): string => { @@ -83,10 +85,9 @@ const useImportModel = () => { ?.importModel(modelId, model.path, model.name, optionType) .finally(() => { removeDownloadingModel(modelId) - events.emit(LocalImportModelEvent.onLocalImportModelSuccess, { - importId: model.importId, - modelId: modelId, - }) + + events.emit(ModelEvent.OnModelsUpdate, { fetch: true }) + setImportingModelSuccess(model.importId, modelId) }) } }) diff --git a/web/hooks/useModelSource.ts b/web/hooks/useModelSource.ts new file mode 100644 index 000000000..f9e01802a --- /dev/null +++ b/web/hooks/useModelSource.ts @@ -0,0 +1,88 @@ +import { useMemo } from 'react' + +import { ExtensionTypeEnum, ModelExtension } from '@janhq/core' +import useSWR from 'swr' + +import { extensionManager } from '@/extension/ExtensionManager' + +/** + * @returns A Promise that resolves to an object of model sources. + */ +export function useGetModelSources() { + const extension = useMemo( + () => extensionManager.get(ExtensionTypeEnum.Model), + [] + ) + + const { + data: sources, + error, + mutate, + } = useSWR( + extension ? 'getSources' : null, + () => + extension?.getSources().then((e) => + e.map((m) => ({ + ...m, + models: m.models.sort((a, b) => a.size - b.size), + })) + ), + { + revalidateOnFocus: false, + revalidateOnReconnect: true, + } + ) + + return { sources, error, mutate } +} + +/** + * @returns A Promise that resolves to featured model sources. + */ +export function useGetFeaturedSources() { + const { sources, error, mutate } = useGetModelSources() + + return { + sources: sources?.filter((e) => e.metadata?.tags?.includes('featured')), + error, + mutate, + } +} + +/** + * @returns A Promise that resolves to model source mutation. + */ +export const useModelSourcesMutation = () => { + const extension = useMemo( + () => extensionManager.get(ExtensionTypeEnum.Model), + [] + ) + /** + * Add a new model source + * @returns A Promise that resolves to intall of engine. + */ + const addModelSource = async (source: string) => { + try { + // Call the extension's method + return await extension?.addSource(source) + } catch (error) { + console.error('Failed to install engine variant:', error) + throw error + } + } + + /** + * Delete a new model source + * @returns A Promise that resolves to intall of engine. + */ + const deleteModelSource = async (source: string) => { + try { + // Call the extension's method + return await extension?.deleteSource(source) + } catch (error) { + console.error('Failed to install engine variant:', error) + throw error + } + } + return { addModelSource, deleteModelSource } +} diff --git a/web/hooks/useModels.ts b/web/hooks/useModels.ts index 40586462b..ec03e2158 100644 --- a/web/hooks/useModels.ts +++ b/web/hooks/useModels.ts @@ -32,12 +32,15 @@ const useModels = () => { const getData = useCallback(() => { const getDownloadedModels = async () => { - const localModels = (await getModels()).map((e) => ({ - ...e, - name: ModelManager.instance().models.get(e.id)?.name ?? e.name ?? e.id, - metadata: - ModelManager.instance().models.get(e.id)?.metadata ?? e.metadata, - })) + const localModels = (await getModels()) + .map((e) => ({ + ...e, + name: + ModelManager.instance().models.get(e.id)?.name ?? e.name ?? e.id, + metadata: + ModelManager.instance().models.get(e.id)?.metadata ?? e.metadata, + })) + .filter((e) => !('status' in e) || e.status !== 'downloadable') const remoteModels = ModelManager.instance() .models.values() diff --git a/web/hooks/useSettings.ts b/web/hooks/useSettings.ts deleted file mode 100644 index a9635aa93..000000000 --- a/web/hooks/useSettings.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { useCallback, useEffect, useState } from 'react' - -import { fs, GpuSettingInfo, joinPath } from '@janhq/core' - -export type AppSettings = { - vulkan: boolean - gpus: GpuSettingInfo[] -} - -export const useSettings = () => { - const [settings, setSettings] = useState() - - useEffect(() => { - readSettings().then((settings) => setSettings(settings as AppSettings)) - - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []) - - const readSettings = useCallback(async () => { - if (!window?.core?.api) { - return - } - const settingsFile = await joinPath(['file://settings', 'settings.json']) - if (await fs.existsSync(settingsFile)) { - const settings = await fs.readFileSync(settingsFile, 'utf-8') - return typeof settings === 'object' ? settings : JSON.parse(settings) - } - return {} - }, []) - - const saveSettings = async ({ vulkan }: { vulkan?: boolean | undefined }) => { - const settingsFile = await joinPath(['file://settings', 'settings.json']) - const settings = await readSettings() - if (vulkan != null) { - settings.vulkan = vulkan - // GPU enabled, set run_mode to 'gpu' - if (settings.vulkan === true) { - settings?.gpus?.some((gpu: { activated: boolean }) => - gpu.activated === true ? 'gpu' : 'cpu' - ) - } - } - await fs.writeFileSync(settingsFile, JSON.stringify(settings)) - } - - return { - readSettings, - saveSettings, - settings, - } -} diff --git a/web/jest.config.js b/web/jest.config.js index 96bfb2356..dea8827cd 100644 --- a/web/jest.config.js +++ b/web/jest.config.js @@ -40,5 +40,5 @@ const config = { // module.exports = createJestConfig(config) module.exports = async () => ({ ...(await createJestConfig(config)()), - transformIgnorePatterns: ['/node_modules/(?!(layerr|nanoid|@uppy|preact)/)'], + transformIgnorePatterns: ['/node_modules/(?!((.*))/)'], }) diff --git a/web/next.config.js b/web/next.config.js index b6da1780c..dfb336a2d 100644 --- a/web/next.config.js +++ b/web/next.config.js @@ -35,7 +35,8 @@ const nextConfig = { POSTHOG_HOST: JSON.stringify(process.env.POSTHOG_HOST), ANALYTICS_HOST: JSON.stringify(process.env.ANALYTICS_HOST), API_BASE_URL: JSON.stringify( - process.env.API_BASE_URL ?? 'http://127.0.0.1:39291' + process.env.API_BASE_URL ?? + `http://127.0.0.1:${process.env.CORTEX_API_PORT ?? '39291'}` ), isMac: process.platform === 'darwin', isWindows: process.platform === 'win32', diff --git a/web/package.json b/web/package.json index 41386c587..1d5cef480 100644 --- a/web/package.json +++ b/web/package.json @@ -1,6 +1,6 @@ { "name": "@janhq/web", - "version": "0.5.13", + "version": "0.5.15", "private": true, "homepage": "./", "scripts": { @@ -49,6 +49,8 @@ "rehype-highlight": "^7.0.1", "rehype-highlight-code-lines": "^1.0.4", "rehype-katex": "^7.0.1", + "rehype-raw": "^7.0.0", + "remark-gfm": "^4.0.0", "remark-math": "^6.0.0", "sass": "^1.69.4", "slate": "latest", diff --git a/web/public/icons/huggingFace.svg b/web/public/icons/huggingFace.svg new file mode 100644 index 000000000..8570b2049 --- /dev/null +++ b/web/public/icons/huggingFace.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/web/public/images/HubBanner/banner-1.jpg b/web/public/images/HubBanner/banner-1.jpg new file mode 100644 index 000000000..230920d16 Binary files /dev/null and b/web/public/images/HubBanner/banner-1.jpg differ diff --git a/web/public/images/HubBanner/banner-10.jpg b/web/public/images/HubBanner/banner-10.jpg new file mode 100644 index 000000000..8ce5b5ec5 Binary files /dev/null and b/web/public/images/HubBanner/banner-10.jpg differ diff --git a/web/public/images/HubBanner/banner-11.jpg b/web/public/images/HubBanner/banner-11.jpg new file mode 100644 index 000000000..66748dba6 Binary files /dev/null and b/web/public/images/HubBanner/banner-11.jpg differ diff --git a/web/public/images/HubBanner/banner-12.jpg b/web/public/images/HubBanner/banner-12.jpg new file mode 100644 index 000000000..d59699a89 Binary files /dev/null and b/web/public/images/HubBanner/banner-12.jpg differ diff --git a/web/public/images/HubBanner/banner-13.jpg b/web/public/images/HubBanner/banner-13.jpg new file mode 100644 index 000000000..6e8ccf690 Binary files /dev/null and b/web/public/images/HubBanner/banner-13.jpg differ diff --git a/web/public/images/HubBanner/banner-14.jpg b/web/public/images/HubBanner/banner-14.jpg new file mode 100644 index 000000000..b6afaa6c2 Binary files /dev/null and b/web/public/images/HubBanner/banner-14.jpg differ diff --git a/web/public/images/HubBanner/banner-15.jpg b/web/public/images/HubBanner/banner-15.jpg new file mode 100644 index 000000000..30237060f Binary files /dev/null and b/web/public/images/HubBanner/banner-15.jpg differ diff --git a/web/public/images/HubBanner/banner-16.jpg b/web/public/images/HubBanner/banner-16.jpg new file mode 100644 index 000000000..dbd11da2c Binary files /dev/null and b/web/public/images/HubBanner/banner-16.jpg differ diff --git a/web/public/images/HubBanner/banner-17.jpg b/web/public/images/HubBanner/banner-17.jpg new file mode 100644 index 000000000..828c0df67 Binary files /dev/null and b/web/public/images/HubBanner/banner-17.jpg differ diff --git a/web/public/images/HubBanner/banner-18.jpg b/web/public/images/HubBanner/banner-18.jpg new file mode 100644 index 000000000..4f8f4a9fb Binary files /dev/null and b/web/public/images/HubBanner/banner-18.jpg differ diff --git a/web/public/images/HubBanner/banner-19.jpg b/web/public/images/HubBanner/banner-19.jpg new file mode 100644 index 000000000..9da970f7a Binary files /dev/null and b/web/public/images/HubBanner/banner-19.jpg differ diff --git a/web/public/images/HubBanner/banner-2.jpg b/web/public/images/HubBanner/banner-2.jpg new file mode 100644 index 000000000..7241f7ee0 Binary files /dev/null and b/web/public/images/HubBanner/banner-2.jpg differ diff --git a/web/public/images/HubBanner/banner-20.jpg b/web/public/images/HubBanner/banner-20.jpg new file mode 100644 index 000000000..58348eea7 Binary files /dev/null and b/web/public/images/HubBanner/banner-20.jpg differ diff --git a/web/public/images/HubBanner/banner-21.jpg b/web/public/images/HubBanner/banner-21.jpg new file mode 100644 index 000000000..3f4f3cd59 Binary files /dev/null and b/web/public/images/HubBanner/banner-21.jpg differ diff --git a/web/public/images/HubBanner/banner-22.jpg b/web/public/images/HubBanner/banner-22.jpg new file mode 100644 index 000000000..54aa38834 Binary files /dev/null and b/web/public/images/HubBanner/banner-22.jpg differ diff --git a/web/public/images/HubBanner/banner-23.jpg b/web/public/images/HubBanner/banner-23.jpg new file mode 100644 index 000000000..fbac14352 Binary files /dev/null and b/web/public/images/HubBanner/banner-23.jpg differ diff --git a/web/public/images/HubBanner/banner-24.jpg b/web/public/images/HubBanner/banner-24.jpg new file mode 100644 index 000000000..0d1ac23c9 Binary files /dev/null and b/web/public/images/HubBanner/banner-24.jpg differ diff --git a/web/public/images/HubBanner/banner-25.jpg b/web/public/images/HubBanner/banner-25.jpg new file mode 100644 index 000000000..a3a7e7ead Binary files /dev/null and b/web/public/images/HubBanner/banner-25.jpg differ diff --git a/web/public/images/HubBanner/banner-26.jpg b/web/public/images/HubBanner/banner-26.jpg new file mode 100644 index 000000000..41ecc74a4 Binary files /dev/null and b/web/public/images/HubBanner/banner-26.jpg differ diff --git a/web/public/images/HubBanner/banner-27.jpg b/web/public/images/HubBanner/banner-27.jpg new file mode 100644 index 000000000..d1d05325a Binary files /dev/null and b/web/public/images/HubBanner/banner-27.jpg differ diff --git a/web/public/images/HubBanner/banner-28.jpg b/web/public/images/HubBanner/banner-28.jpg new file mode 100644 index 000000000..fa48c2559 Binary files /dev/null and b/web/public/images/HubBanner/banner-28.jpg differ diff --git a/web/public/images/HubBanner/banner-29.jpg b/web/public/images/HubBanner/banner-29.jpg new file mode 100644 index 000000000..2e3ccaa85 Binary files /dev/null and b/web/public/images/HubBanner/banner-29.jpg differ diff --git a/web/public/images/HubBanner/banner-3.jpg b/web/public/images/HubBanner/banner-3.jpg new file mode 100644 index 000000000..91dc1e499 Binary files /dev/null and b/web/public/images/HubBanner/banner-3.jpg differ diff --git a/web/public/images/HubBanner/banner-30.jpg b/web/public/images/HubBanner/banner-30.jpg new file mode 100644 index 000000000..464f8225c Binary files /dev/null and b/web/public/images/HubBanner/banner-30.jpg differ diff --git a/web/public/images/HubBanner/banner-4.jpg b/web/public/images/HubBanner/banner-4.jpg new file mode 100644 index 000000000..582daf089 Binary files /dev/null and b/web/public/images/HubBanner/banner-4.jpg differ diff --git a/web/public/images/HubBanner/banner-5.jpg b/web/public/images/HubBanner/banner-5.jpg new file mode 100644 index 000000000..8e732a2f0 Binary files /dev/null and b/web/public/images/HubBanner/banner-5.jpg differ diff --git a/web/public/images/HubBanner/banner-6.jpg b/web/public/images/HubBanner/banner-6.jpg new file mode 100644 index 000000000..c2c807cba Binary files /dev/null and b/web/public/images/HubBanner/banner-6.jpg differ diff --git a/web/public/images/HubBanner/banner-7.jpg b/web/public/images/HubBanner/banner-7.jpg new file mode 100644 index 000000000..9453023ed Binary files /dev/null and b/web/public/images/HubBanner/banner-7.jpg differ diff --git a/web/public/images/HubBanner/banner-8.jpg b/web/public/images/HubBanner/banner-8.jpg new file mode 100644 index 000000000..e056b50d5 Binary files /dev/null and b/web/public/images/HubBanner/banner-8.jpg differ diff --git a/web/public/images/HubBanner/banner-9.jpg b/web/public/images/HubBanner/banner-9.jpg new file mode 100644 index 000000000..6ff9b9190 Binary files /dev/null and b/web/public/images/HubBanner/banner-9.jpg differ diff --git a/web/public/images/hub-banner.png b/web/public/images/hub-banner.png deleted file mode 100644 index 2467b0c01..000000000 Binary files a/web/public/images/hub-banner.png and /dev/null differ diff --git a/web/screens/Hub/ModelFilter/ContextLength/index.tsx b/web/screens/Hub/ModelFilter/ContextLength/index.tsx new file mode 100644 index 000000000..a0886e247 --- /dev/null +++ b/web/screens/Hub/ModelFilter/ContextLength/index.tsx @@ -0,0 +1,84 @@ +import { useState } from 'react' + +import { Slider, Input, Tooltip } from '@janhq/joi' + +import { atom, useAtom } from 'jotai' +import { InfoIcon } from 'lucide-react' + +export const hubCtxLenAtom = atom(0) + +export default function ContextLengthFilter() { + const [value, setValue] = useAtom(hubCtxLenAtom) + const [inputingValue, setInputingValue] = useState(false) + + const normalizeTextValue = (value: number) => { + return value === 100 ? '1M' : value === 0 ? 0 : `${value}K` + } + + return ( +
    +
    +

    Context length

    + + } + content="Controls how much text the model can consider at once. Longer context allows the model to handle more input but uses more memory and runs slower." + /> +
    +
    +
    + { + setValue(Number(e[0])) + }} + min={0} + max={100} + step={1} + /> +
    +

    0

    +

    1M

    +
    +
    + + setInputingValue(true)} + onBlur={(e) => { + setInputingValue(false) + const numericValue = e.target.value.replace(/\D/g, '') + const value = Number(numericValue) + setValue(value > 100 ? 100 : value) + }} + onChange={(e) => { + // Passthru since it validates again onBlur + if (/^\d*\.?\d*$/.test(e.target.value)) { + setValue(Number(e.target.value)) + } + + // Should not accept invalid value or NaN + // E.g. anything changes that trigger onValueChanged + // Which is incorrect + if ( + Number(e.target.value) > 100 || + Number(e.target.value) < 0 || + Number.isNaN(Number(e.target.value)) + ) + return + setValue(Number(e.target.value)) + }} + /> +
    +
    + ) +} diff --git a/web/screens/Hub/ModelFilter/ModelSize/index.tsx b/web/screens/Hub/ModelFilter/ModelSize/index.tsx new file mode 100644 index 000000000..b95d57f8b --- /dev/null +++ b/web/screens/Hub/ModelFilter/ModelSize/index.tsx @@ -0,0 +1,118 @@ +import { useRef, useState } from 'react' + +import { Slider, Input, Tooltip } from '@janhq/joi' + +import { atom, useAtom } from 'jotai' +import { InfoIcon } from 'lucide-react' + +export const hubModelSizeMinAtom = atom(0) +export const hubModelSizeMaxAtom = atom(100) + +export default function ModelSizeFilter({ max }: { max: number }) { + const [value, setValue] = useAtom(hubModelSizeMinAtom) + const [valueMax, setValueMax] = useAtom(hubModelSizeMaxAtom) + const [inputingMinValue, setInputingMinValue] = useState(false) + const [inputingMaxValue, setInputingMaxValue] = useState(false) + + const normalizeTextValue = (value: number) => { + return value === 0 ? 0 : `${value}GB` + } + + return ( +
    +
    +

    Model size

    +
    +
    +
    + { + setValue(Number(e[0])) + setValueMax(Number(e[1])) + }} + min={0} + max={max} + step={1} + /> +
    +
    +
    +
    +
    +

    from

    + + setInputingMinValue(true)} + onBlur={(e) => { + setInputingMinValue(false) + const numericValue = e.target.value.replace(/\D/g, '') + const value = Number(numericValue) + setValue(value > valueMax ? valueMax : value) + }} + onChange={(e) => { + // Passthru since it validates again onBlur + if (/^\d*\.?\d*$/.test(e.target.value)) { + setValue(Number(e.target.value)) + } + + // Should not accept invalid value or NaN + // E.g. anything changes that trigger onValueChanged + // Which is incorrect + if ( + Number(e.target.value) > max || + Number(e.target.value) < 0 || + Number.isNaN(Number(e.target.value)) + ) + return + setValue(Number(e.target.value)) + }} + /> +
    +
    +

    to

    + + setInputingMaxValue(true)} + onBlur={(e) => { + setInputingMaxValue(false) + const numericValue = e.target.value.replace(/\D/g, '') + const value = Number(numericValue) + setValueMax(value > max ? max : value) + }} + onChange={(e) => { + // Passthru since it validates again onBlur + if (/^\d*\.?\d*$/.test(e.target.value)) { + setValueMax(Number(e.target.value)) + } + + // Should not accept invalid value or NaN + // E.g. anything changes that trigger onValueChanged + // Which is incorrect + if ( + Number(e.target.value) > max || + Number(e.target.value) < 0 || + Number.isNaN(Number(e.target.value)) + ) + return + setValueMax(Number(e.target.value)) + }} + /> +
    +
    +
    +
    + ) +} diff --git a/web/screens/Hub/ModelList/ModelHeader/index.tsx b/web/screens/Hub/ModelList/ModelHeader/index.tsx index 254ce0682..5fe0993ff 100644 --- a/web/screens/Hub/ModelList/ModelHeader/index.tsx +++ b/web/screens/Hub/ModelList/ModelHeader/index.tsx @@ -1,28 +1,29 @@ -import { useCallback } from 'react' +import { useCallback, useMemo } from 'react' -import { Model } from '@janhq/core' -import { Button, Badge, Tooltip } from '@janhq/joi' +import Image from 'next/image' + +import { InferenceEngine, ModelSource } from '@janhq/core' + +import { Button, Tooltip, Dropdown, Badge } from '@janhq/joi' import { useAtomValue, useSetAtom } from 'jotai' - import { ChevronDownIcon } from 'lucide-react' import { twMerge } from 'tailwind-merge' import ModalCancelDownload from '@/containers/ModalCancelDownload' -import ModelLabel from '@/containers/ModelLabel' - -import { toaster } from '@/containers/Toast' - import { MainViewState } from '@/constants/screens' import { useCreateNewThread } from '@/hooks/useCreateNewThread' import useDownloadModel from '@/hooks/useDownloadModel' -import { useSettings } from '@/hooks/useSettings' +import { toGigabytes } from '@/utils/converter' -import { toGibibytes } from '@/utils/converter' +import { getLogoEngine } from '@/utils/modelEngine' +import { extractModelName } from '@/utils/modelSource' + +import { fuzzySearch } from '@/utils/search' import { mainViewStateAtom } from '@/helpers/atoms/App.atom' import { assistantsAtom } from '@/helpers/atoms/Assistant.atom' @@ -32,68 +33,95 @@ import { downloadedModelsAtom, getDownloadingModelAtom, } from '@/helpers/atoms/Model.atom' -import { - nvidiaTotalVramAtom, - totalRamAtom, -} from '@/helpers/atoms/SystemBar.atom' +import { selectedSettingAtom } from '@/helpers/atoms/Setting.atom' type Props = { - model: Model - onClick: () => void - open: string + model: ModelSource + onSelectedModel: () => void } -const ModelItemHeader = ({ model, onClick, open }: Props) => { +const ModelItemHeader = ({ model, onSelectedModel }: Props) => { const { downloadModel } = useDownloadModel() const downloadingModels = useAtomValue(getDownloadingModelAtom) const downloadedModels = useAtomValue(downloadedModelsAtom) + const setSelectedSetting = useSetAtom(selectedSettingAtom) const { requestCreateNewThread } = useCreateNewThread() - const totalRam = useAtomValue(totalRamAtom) - const { settings } = useSettings() - // const [imageLoaded, setImageLoaded] = useState(true) - const nvidiaTotalVram = useAtomValue(nvidiaTotalVramAtom) const setMainViewState = useSetAtom(mainViewStateAtom) - // Default nvidia returns vram in MB, need to convert to bytes to match the unit of totalRamW - let ram = nvidiaTotalVram * 1024 * 1024 - if (ram === 0 || settings?.gpus?.some((gpu) => gpu.activated !== true)) { - ram = totalRam - } const serverEnabled = useAtomValue(serverEnabledAtom) const assistants = useAtomValue(assistantsAtom) const onDownloadClick = useCallback(() => { - downloadModel(model.sources[0].url, model.id, model.name) + downloadModel(model.models?.[0].id) }, [model, downloadModel]) - const isDownloaded = downloadedModels.find((md) => md.id === model.id) != null + const isDownloaded = downloadedModels.some((md) => + model.models.some((m) => m.id === md.id) + ) + const defaultModel = useMemo(() => { + return model.models?.find( + (e) => e.id.includes('q4-km') || fuzzySearch('q4km', e.id) + ) + }, [model]) let downloadButton = ( - +
    +
    + Download +
    + ({ + name: ( +
    + + {e.id} + + {e.id === defaultModel?.id && ( + + Default + + )} +
    + ), + value: e.id, + suffix: toGigabytes(e.size), + }))} + onValueChanged={(e) => downloadModel(e)} + > +
    + +
    +
    +
    ) - const isDownloading = downloadingModels.some((md) => md === model.id) + const isDownloading = downloadingModels.some((md) => + model.models.some((m) => m.id === md) + ) const onUseModelClick = useCallback(async () => { - if (assistants.length === 0) { - toaster({ - title: 'No assistant available.', - description: `Could not use Model ${model.name} as no assistant is available.`, - type: 'error', - }) - return + const downloadedModel = downloadedModels.find((e) => + model.models.some((m) => m.id === e.id) + ) + if (downloadedModel) { + await requestCreateNewThread(assistants[0], downloadedModel) + setMainViewState(MainViewState.Thread) } - await requestCreateNewThread(assistants[0], model) - setMainViewState(MainViewState.Thread) - }, [assistants, model, requestCreateNewThread, setMainViewState]) + }, [ + assistants, + model, + requestCreateNewThread, + setMainViewState, + downloadedModels, + ]) if (isDownloaded) { downloadButton = ( @@ -104,6 +132,7 @@ const ModelItemHeader = ({ model, onClick, open }: Props) => { disabled={serverEnabled} data-testid={`use-model-btn-${model.id}`} variant="outline" + theme="ghost" className="min-w-[98px]" > Use @@ -114,54 +143,68 @@ const ModelItemHeader = ({ model, onClick, open }: Props) => { /> ) } else if (isDownloading) { - downloadButton = + downloadButton = ( + model.models.some((m) => m.id === e)) ?? + model.id + } + /> + ) } return ( -
    -
    -
    - - {model.name} +
    +
    +
    + + {model.type === 'cloud' && ( + <> + logo + + )} + {extractModelName(model.metadata?.id)} -
    - - {toGibibytes(model.metadata?.size)} + + {toGigabytes(model.models?.[0]?.size)} -
    - {downloadButton} - + {model.type !== 'cloud' ? ( + downloadButton + ) : ( + <> + {!model.metadata?.apiKey?.length && ( + + )} + + )}
    ) } -type EngineBadgeProps = { - engine: string -} - -const EngineBadge = ({ engine }: EngineBadgeProps) => { - const title = 'TensorRT-LLM' - - switch (engine) { - case 'nitro-tensorrt-llm': - return {title} - default: - return null - } -} - export default ModelItemHeader diff --git a/web/screens/Hub/ModelList/ModelItem/index.tsx b/web/screens/Hub/ModelList/ModelItem/index.tsx index a077dbffc..e96021c20 100644 --- a/web/screens/Hub/ModelList/ModelItem/index.tsx +++ b/web/screens/Hub/ModelList/ModelItem/index.tsx @@ -1,98 +1,83 @@ -import { useState } from 'react' +import Markdown from 'react-markdown' -import { Model } from '@janhq/core' -import { Badge } from '@janhq/joi' +import Image from 'next/image' -import { twMerge } from 'tailwind-merge' +import { ModelSource } from '@janhq/core' + +import { DownloadIcon, FileJson } from 'lucide-react' +import rehypeRaw from 'rehype-raw' import ModelLabel from '@/containers/ModelLabel' import ModelItemHeader from '@/screens/Hub/ModelList/ModelHeader' -import { toGibibytes } from '@/utils/converter' +import { markdownComponents } from '@/screens/Thread/ThreadCenterPanel/TextMessage/MarkdownUtils' + +import { toGigabytes } from '@/utils/converter' +import { extractDescription } from '@/utils/modelSource' +import '@/styles/components/model.scss' type Props = { - model: Model + model: ModelSource + onSelectedModel: () => void } -const ModelItem: React.FC = ({ model }) => { - const [open, setOpen] = useState('') - - const handleToggle = () => { - if (open === model.id) { - setOpen('') - } else { - setOpen(model.id) - } - } - +const ModelItem: React.FC = ({ model, onSelectedModel }) => { return ( -
    - - {open === model.id && ( -
    -
    -
    - - {toGibibytes(model.metadata?.size)} - - -
    -
    - About -

    - {model.description || '-'} -

    -
    -
    -
    - Author -

    - {model.metadata?.author} -

    -
    -
    - Model ID -

    - {model.id} -

    -
    -
    - Tags -
    - {model.metadata?.tags?.map((tag: string) => ( - - {tag} - - ))} -
    -
    -
    -
    +
    + -
    -
    - Format +
    +
    +
    + {toGigabytes(model.models?.[0]?.size)} + +
    +
    + + {extractDescription(model.metadata?.description) || '-'} + +
    +
    + {(model?.author ?? model?.metadata?.author) && (

    - {model.format} + {model.id?.includes('huggingface.co') && ( + <> + {' '} + + )}{' '} + {model?.author ?? model?.metadata?.author}

    -
    + )} + {model.models?.length > 0 && ( +

    + + {model.models?.length}{' '} + {model.type === 'cloud' ? 'models' : 'versions'} +

    + )} + {model.metadata?.downloads > 0 && ( +

    + + {model.metadata?.downloads} +

    + )}
    - )} +
    ) } diff --git a/web/screens/Hub/ModelList/index.tsx b/web/screens/Hub/ModelList/index.tsx index 4c6c7d993..b8bafa61a 100644 --- a/web/screens/Hub/ModelList/index.tsx +++ b/web/screens/Hub/ModelList/index.tsx @@ -1,53 +1,33 @@ -import { useMemo } from 'react' - -import { Model } from '@janhq/core' - -import { useAtomValue } from 'jotai' - -import { useGetEngines } from '@/hooks/useEngineManagement' +import { ModelSource } from '@janhq/core' import ModelItem from '@/screens/Hub/ModelList/ModelItem' -import { downloadedModelsAtom } from '@/helpers/atoms/Model.atom' - type Props = { - models: Model[] + models: ModelSource[] + onSelectedModel: (model: ModelSource) => void + filterOption?: string } -const ModelList = ({ models }: Props) => { - const downloadedModels = useAtomValue(downloadedModelsAtom) - const { engines } = useGetEngines() - const sortedModels: Model[] = useMemo(() => { - const featuredModels: Model[] = [] - const remoteModels: Model[] = [] - const localModels: Model[] = [] - const remainingModels: Model[] = [] - models.forEach((m) => { - if (m.metadata?.tags?.includes('Featured')) { - featuredModels.push(m) - } else if (engines?.[m.engine]?.[0]?.type === 'remote') { - remoteModels.push(m) - } else if (downloadedModels.map((m) => m.id).includes(m.id)) { - localModels.push(m) - } else { - remainingModels.push(m) - } - }) - featuredModels.sort((m1, m2) => m1.metadata?.size - m2.metadata?.size) - localModels.sort((m1, m2) => m1.metadata?.size - m2.metadata?.size) - remainingModels.sort((m1, m2) => m1.metadata?.size - m2.metadata?.size) - remoteModels.sort((m1, m2) => m1.name.localeCompare(m2.name)) - return [ - ...featuredModels, - ...localModels, - ...remainingModels, - ...remoteModels, - ] - }, [models, downloadedModels, engines]) - +const ModelList = ({ models, onSelectedModel, filterOption }: Props) => { return ( -
    - {sortedModels?.map((model) => )} +
    + {models.length === 0 && filterOption === 'on-device' ? ( +
    + + No results found + +
    + ) : ( + <> + {models.map((model) => ( + onSelectedModel(model)} + /> + ))} + + )}
    ) } diff --git a/web/screens/Hub/ModelPage/RemoteModelRefresh.tsx b/web/screens/Hub/ModelPage/RemoteModelRefresh.tsx new file mode 100644 index 000000000..d091b97b5 --- /dev/null +++ b/web/screens/Hub/ModelPage/RemoteModelRefresh.tsx @@ -0,0 +1,29 @@ +import { Button } from '@janhq/joi' + +import { RefreshCwIcon } from 'lucide-react' + +import Spinner from '@/containers/Loader/Spinner' + +import { useRefreshModelList } from '@/hooks/useEngineManagement' + +function RemoteModelRefresh({ engine }: { engine: string }) { + const { refreshingModels, refreshModels } = useRefreshModelList(engine) + + return ( + + ) +} + +export default RemoteModelRefresh diff --git a/web/screens/Hub/ModelPage/index.tsx b/web/screens/Hub/ModelPage/index.tsx new file mode 100644 index 000000000..dcd0c833b --- /dev/null +++ b/web/screens/Hub/ModelPage/index.tsx @@ -0,0 +1,232 @@ +import Image from 'next/image' + +import { ModelSource } from '@janhq/core' +import { Badge, Button, ScrollArea } from '@janhq/joi' +import { useAtomValue, useSetAtom } from 'jotai' +import { + ArrowLeftIcon, + DownloadIcon, + FileJson, + SettingsIcon, +} from 'lucide-react' + +import ModelDownloadButton from '@/containers/ModelDownloadButton' + +import ModelLabel from '@/containers/ModelLabel' + +import { MainViewState } from '@/constants/screens' + +import { MarkdownTextMessage } from '@/screens/Thread/ThreadCenterPanel/TextMessage/MarkdownTextMessage' + +import { toGigabytes } from '@/utils/converter' +import { extractModelName, removeYamlFrontMatter } from '@/utils/modelSource' + +import RemoteModelRefresh from './RemoteModelRefresh' + +import { mainViewStateAtom } from '@/helpers/atoms/App.atom' +import { + selectedSettingAtom, + showScrollBarAtom, +} from '@/helpers/atoms/Setting.atom' + +type Props = { + model: ModelSource + onGoBack: () => void +} + +const ModelPage = ({ model, onGoBack }: Props) => { + const setSelectedSetting = useSetAtom(selectedSettingAtom) + const setMainViewState = useSetAtom(mainViewStateAtom) + const showScrollBar = useAtomValue(showScrollBarAtom) + + return ( + +
    +
    +
    +
    + +
    +
    +
    + {/* Header */} +
    + + {model.type !== 'cloud' + ? extractModelName(model.metadata.id) + : model.metadata.id} + +
    + {model.type === 'cloud' && ( + <> + {!model.metadata?.apiKey?.length ? ( + + ) : ( + + )} + + )} +
    +
    +
    + {(model?.author ?? model?.metadata?.author) && ( +

    + {model.id?.includes('huggingface.co') && ( + <> + {' '} + + )} + {model?.author ?? model?.metadata?.author} +

    + )} + {model.models?.length > 0 && ( +

    + + {model.models?.length}{' '} + {model.type === 'cloud' ? 'models' : 'versions'} +

    + )} + {model.metadata?.downloads > 0 && ( +

    + + {model.metadata?.downloads} +

    + )} +
    + {/* Table of versions */} +
    +
    + + + + + {model.type !== 'cloud' && ( + <> + + + + + )} + + + + + {model.models?.map((item, i) => { + return ( + + + {model.type !== 'cloud' && ( + <> + + + + + )} + + + ) + })} + +
    + {model.type !== 'cloud' ? 'Version' : 'Models'} + + Format + + Size + + {model.type === 'cloud' && ( + + )} +
    + + {model.type === 'cloud' + ? item.id + : item.id?.split(':')?.pop()} + + {i === 0 && model.type !== 'cloud' && ( + + Default + + )} + + + + GGUF + + {toGigabytes(item.size)} + + {(model.type !== 'cloud' || + (model.metadata?.apiKey?.length ?? 0) > 0) && ( + + )} +
    +
    +
    + {/* README */} +
    + +
    +
    +
    +
    +
    + ) +} + +export default ModelPage diff --git a/web/screens/Hub/index.tsx b/web/screens/Hub/index.tsx index 382cf5667..ff6bf3a77 100644 --- a/web/screens/Hub/index.tsx +++ b/web/screens/Hub/index.tsx @@ -1,116 +1,599 @@ -import { useCallback, useState } from 'react' +/* eslint-disable @typescript-eslint/naming-convention */ +import { useCallback, useMemo, useRef, useState, useEffect } from 'react' + +import { useDropzone } from 'react-dropzone' import Image from 'next/image' -import { ScrollArea, Button, Select } from '@janhq/joi' +import { ModelSource } from '@janhq/core' -import { useAtomValue, useSetAtom } from 'jotai' -import { UploadIcon } from 'lucide-react' +import { + ScrollArea, + Button, + Select, + Tabs, + useClickOutside, + Switch, +} from '@janhq/joi' +import { motion as m } from 'framer-motion' + +import { atom, useAtom, useAtomValue, useSetAtom } from 'jotai' +import { ImagePlusIcon, UploadCloudIcon, UploadIcon } from 'lucide-react' + +import { twMerge } from 'tailwind-merge' -import BlankState from '@/containers/BlankState' import CenterPanelContainer from '@/containers/CenterPanelContainer' import ModelSearch from '@/containers/ModelSearch' +import { useGetEngineModelSources } from '@/hooks/useEngineManagement' import { setImportModelStageAtom } from '@/hooks/useImportModel' +import { + useGetModelSources, + useModelSourcesMutation, +} from '@/hooks/useModelSource' + import ModelList from '@/screens/Hub/ModelList' +import { toGigabytes } from '@/utils/converter' +import { extractModelRepo } from '@/utils/modelSource' +import { fuzzySearch } from '@/utils/search' + +import ContextLengthFilter, { hubCtxLenAtom } from './ModelFilter/ContextLength' +import ModelSizeFilter, { + hubModelSizeMaxAtom, + hubModelSizeMinAtom, +} from './ModelFilter/ModelSize' +import ModelPage from './ModelPage' + import { - configuredModelsAtom, - downloadedModelsAtom, -} from '@/helpers/atoms/Model.atom' + getAppBannerHubAtom, + setAppBannerHubAtom, +} from '@/helpers/atoms/App.atom' +import { modelDetailAtom } from '@/helpers/atoms/Model.atom' + +import { showScrollBarAtom } from '@/helpers/atoms/Setting.atom' +import { totalRamAtom } from '@/helpers/atoms/SystemBar.atom' const sortMenus = [ { - name: 'All Models', - value: 'all-models', + name: 'Most downloaded', + value: 'most-downloaded', }, { - name: 'Featured', - value: 'featured', + name: 'Newest', + value: 'newest', + }, +] +const filterOptions = [ + { + name: 'All', + value: 'all', }, { - name: 'Downloaded', - value: 'downloaded', + name: 'On-device', + value: 'on-device', + }, + { + name: 'Cloud', + value: 'cloud', }, ] +const hubCompatibleAtom = atom(false) + const HubScreen = () => { - const configuredModels = useAtomValue(configuredModelsAtom) - const downloadedModels = useAtomValue(downloadedModelsAtom) - const [searchValue, setsearchValue] = useState('') - const [sortSelected, setSortSelected] = useState('all-models') - + const { sources } = useGetModelSources() + const { sources: remoteModelSources } = useGetEngineModelSources() + const { addModelSource } = useModelSourcesMutation() + const [searchValue, setSearchValue] = useState('') + const [sortSelected, setSortSelected] = useState('newest') + const [filterOption, setFilterOption] = useState('all') + const [hubBannerOption, setHubBannerOption] = useState('gallery') + const [showHubBannerSetting, setShowHubBannerSetting] = useState(false) + const appBannerHub = useAtomValue(getAppBannerHubAtom) + const setAppBannerHub = useSetAtom(setAppBannerHubAtom) + const [selectedModel, setSelectedModel] = useState( + undefined + ) + const showScrollBar = useAtomValue(showScrollBarAtom) + const [modelDetail, setModelDetail] = useAtom(modelDetailAtom) const setImportModelStage = useSetAtom(setImportModelStageAtom) + const dropdownRef = useRef(null) + const imageInputRef = useRef(null) + const hubBannerSettingRef = useRef(null) - const filteredModels = configuredModels.filter((x) => { - if (sortSelected === 'downloaded') { - return ( - x.name.toLowerCase().includes(searchValue.toLowerCase()) && - downloadedModels.some((y) => y.id === x.id) - ) - } else if (sortSelected === 'featured') { - return ( - x.name.toLowerCase().includes(searchValue.toLowerCase()) && - x.metadata?.tags?.includes('Featured') - ) - } else { - return x.name.toLowerCase().includes(searchValue.toLowerCase()) + const [compatible, setCompatible] = useAtom(hubCompatibleAtom) + const totalRam = useAtomValue(totalRamAtom) + const [ctxLenFilter, setCtxLenFilter] = useAtom(hubCtxLenAtom) + const [minModelSizeFilter, setMinModelSizeFilter] = + useAtom(hubModelSizeMinAtom) + const [maxModelSizeFilter, setMaxModelSizeFilter] = + useAtom(hubModelSizeMaxAtom) + + const largestModel = + sources && + sources + .flatMap((model) => model.models) + .reduce((max, model) => (model.size > max.size ? model : max), { + size: 0, + }) + + const searchedModels = useMemo( + () => + searchValue.length + ? (sources?.filter((e) => + fuzzySearch( + searchValue.replaceAll(' ', '').toLowerCase(), + e.id.toLowerCase() + ) + ) ?? []) + : [], + [sources, searchValue] + ) + + const filteredModels = useMemo(() => { + return (sources ?? []).filter((model) => { + const isCompatible = + !compatible || + model.models?.some((e) => e.size * 1.5 < totalRam * (1 << 20)) + const matchesCtxLen = + !ctxLenFilter || + model.metadata?.gguf?.context_length > ctxLenFilter * 1000 + const matchesMinSize = + !minModelSizeFilter || + model.models.some((e) => e.size >= minModelSizeFilter * (1 << 30)) + const matchesMaxSize = + maxModelSizeFilter === largestModel?.size || + model.models.some((e) => e.size <= maxModelSizeFilter * (1 << 30)) + + return isCompatible && matchesCtxLen && matchesMinSize && matchesMaxSize + }) + }, [ + sources, + compatible, + ctxLenFilter, + minModelSizeFilter, + maxModelSizeFilter, + totalRam, + ]) + + const sortedModels = useMemo(() => { + return filteredModels.sort((a, b) => { + if (sortSelected === 'most-downloaded') { + return b.metadata.downloads - a.metadata.downloads + } else { + return ( + new Date(b.metadata.createdAt).getTime() - + new Date(a.metadata.createdAt).getTime() + ) + } + }) + }, [sortSelected, filteredModels]) + + useEffect(() => { + if (modelDetail) { + setSelectedModel(sources?.find((e) => e.id === modelDetail)) + setModelDetail(undefined) } - }) + }, [modelDetail, sources, setModelDetail, addModelSource]) + + useEffect(() => { + if (largestModel) { + setMaxModelSizeFilter( + Number( + toGigabytes(Number(largestModel?.size), { + hideUnit: true, + toFixed: 0, + }) + ) + ) + } + }, [largestModel]) + + useEffect(() => { + if (selectedModel) { + // Try add the model source again to update it's data + addModelSource(selectedModel.id).catch(console.debug) + } + }, [sources, selectedModel, addModelSource, setSelectedModel]) + + useClickOutside( + () => { + setSearchValue('') + }, + null, + [dropdownRef.current] + ) + + useClickOutside( + () => { + setShowHubBannerSetting(false) + }, + null, + [hubBannerSettingRef.current] + ) const onImportModelClick = useCallback(() => { setImportModelStage('SELECTING_MODEL') }, [setImportModelStage]) const onSearchUpdate = useCallback((input: string) => { - setsearchValue(input) + setSearchValue(input) }, []) + const setBannerHubImage = (image: string) => { + setShowHubBannerSetting(false) + setAppBannerHub(image) + } + + /** + * Handles the change event of the extension file input element by setting the file name state. + * Its to be used to display the extension file name of the selected file. + * @param event - The change event object. + */ + const handleFileChange = (event: React.ChangeEvent) => { + const file = event.target.files?.[0] + if (!file) return + + const fileType = file.type + if (!fileType.startsWith('image/')) { + alert('Please upload an image file.') + return + } + + const reader = new FileReader() + reader.onload = () => { + // FileReader result is already in a valid Base64 format + setBannerHubImage(reader.result as string) + } + reader.readAsDataURL(file) + } + + const { isDragActive, getRootProps } = useDropzone({ + noClick: true, + multiple: true, + accept: { + 'image/jpeg': ['.jpeg'], + 'image/png': ['.png'], + 'image/jpg': ['.jpg'], + }, + onDrop: (files) => { + const reader = new FileReader() + reader.onload = () => { + // FileReader result is already in a valid Base64 format + setBannerHubImage(reader.result as string) + } + reader.readAsDataURL(files[0]) + }, + }) + return ( - -
    - Hub Banner -
    -
    -
    - -
    -
    - -
    -
    -
    -
    -
    - {!filteredModels.length ? ( - - ) : ( + + {!selectedModel && ( + <> -
    - +
    +
    +
    + )} +
    +
    +
    +
    +
    +
    +
    + +
    0 && 'visible' + )} + > + {searchedModels.length === 0 ? ( +
    + + No results found + +
    + ) : ( +
    + {searchedModels.map((model) => ( +
    { + setSelectedModel(model) + e.stopPropagation() + }} + > + + {searchValue.includes('huggingface.co') && ( + <> + {' '} + + )} + {extractModelRepo(model.id)} + +
    + ))} +
    + )} +
    +
    +
    +
    +
    + +
    +
    + {/* Filters and Model List */} +
    + {/* Filters */} +
    +
    + Filters + +
    +
    + setCompatible(!compatible)} + className="w-9" + /> + Compatible with my device +
    +
    + +
    +
    + +
    +
    + + {/* Model List */} +
    + <> +
    +
    +
    + {filterOptions.map((e) => ( +
    + +
    + ))} +
    +
    +
    + handleClickTheme(e)} - /> -
    - {themeData?.reduceTransparent && ( + +
    -
    Interface theme
    +
    Appearance
    +

    + Select a color theme. +

    -
    - - -
    -
    - )} -
    -
    -
    -
    Chat Width
    -
    -

    - Choose the width of the chat area to customize your conversation - view. -

    -
    -
    -
    - {chatWidthOption.map((option) => { - return ( -
    - -
    - ) - })} -
    -
    -
    -
    -
    -
    -
    Spell Check
    -
    -

    - Turn on to enable spell check. -

    -
    -
    - setSpellCheck(e.target.checked)} + {

    {editingModel.name}

    - {toGibibytes(editingModel.size)} + {toGigabytes(editingModel.size)}
    Format: diff --git a/web/screens/Settings/Engines/LocalEngineSettings.tsx b/web/screens/Settings/Engines/LocalEngineSettings.tsx index 433a01f14..d1b68a02b 100644 --- a/web/screens/Settings/Engines/LocalEngineSettings.tsx +++ b/web/screens/Settings/Engines/LocalEngineSettings.tsx @@ -9,7 +9,7 @@ import { } from '@janhq/core' import { Button, ScrollArea, Badge, Select, Progress } from '@janhq/joi' -import { useAtom } from 'jotai' +import { useAtom, useAtomValue } from 'jotai' import { twMerge } from 'tailwind-merge' import { useActiveModel } from '@/hooks/useActiveModel' @@ -29,7 +29,11 @@ import ExtensionSetting from '../ExtensionSetting' import DeleteEngineVariant from './DeleteEngineVariant' -import { LocalEngineDefaultVariantAtom } from '@/helpers/atoms/App.atom' +import { + LocalEngineDefaultVariantAtom, + RecommendEngineVariantAtom, +} from '@/helpers/atoms/App.atom' +import { showScrollBarAtom } from '@/helpers/atoms/Setting.atom' const os = () => { switch (PLATFORM) { case 'win32': @@ -53,18 +57,28 @@ const LocalEngineSettings = ({ engine }: { engine: InferenceEngine }) => { defaultEngineVariant?.version as string, os() ) + const showScrollBar = useAtomValue(showScrollBarAtom) const [installingEngines, setInstallingEngines] = useState< Map >(new Map()) const { stopModel } = useActiveModel() - const isEngineUpdated = - latestReleasedEngine && - latestReleasedEngine.some((item) => - item.name.includes( - defaultEngineVariant?.version.replace(/^v/, '') as string - ) + const [recommendEngineVariant, setRecommendEngineVariant] = useAtom( + RecommendEngineVariantAtom + ) + + const isEngineUpdated = useMemo(() => { + if (!latestReleasedEngine || !defaultEngineVariant) return false + const latestVariant = latestReleasedEngine.find((item) => + item.name.includes(defaultEngineVariant.variant) ) + if (!latestVariant) return false + const latestVersion = latestVariant.name + .replace(defaultEngineVariant.variant, '') + .replaceAll('-', '') + const currentVersion = defaultEngineVariant.version.replace(/^v/, '') + return latestVersion <= currentVersion + }, [latestReleasedEngine, defaultEngineVariant]) const availableVariants = useMemo( () => @@ -83,6 +97,7 @@ const LocalEngineSettings = ({ engine }: { engine: InferenceEngine }) => { .map((x: any) => ({ name: x.name, value: x.name, + recommend: recommendEngineVariant === x.name, })) const installedEngineByVersion = installedEngines?.filter( @@ -105,7 +120,10 @@ const LocalEngineSettings = ({ engine }: { engine: InferenceEngine }) => { if (defaultEngineVariant?.variant) { setSelectedVariants(defaultEngineVariant.variant || '') } - }, [defaultEngineVariant, setSelectedVariants]) + if (!recommendEngineVariant.length) { + setRecommendEngineVariant(defaultEngineVariant?.variant || '') + } + }, [defaultEngineVariant, setSelectedVariants, setRecommendEngineVariant]) const handleEngineUpdate = useCallback( async (event: { id: string; type: DownloadEvent; percent: number }) => { @@ -169,7 +187,10 @@ const LocalEngineSettings = ({ engine }: { engine: InferenceEngine }) => { } return ( - +
    diff --git a/web/screens/Settings/Engines/RemoteEngineItem.tsx b/web/screens/Settings/Engines/RemoteEngineItem.tsx index 449cf9966..c4e0fe2cc 100644 --- a/web/screens/Settings/Engines/RemoteEngineItem.tsx +++ b/web/screens/Settings/Engines/RemoteEngineItem.tsx @@ -6,7 +6,7 @@ import { Button, Switch } from '@janhq/joi' import { useAtom, useSetAtom } from 'jotai' import { SettingsIcon } from 'lucide-react' -import { getTitleByEngine } from '@/utils/modelEngine' +import { getDescriptionByEngine, getTitleByEngine } from '@/utils/modelEngine' import { getLogoEngine } from '@/utils/modelEngine' @@ -52,10 +52,7 @@ const RemoteEngineItems = ({
    -

    - Access models from {getTitleByEngine(engine as InferenceEngine)}{' '} - via their API. -

    +

    {getDescriptionByEngine(engine as InferenceEngine)}

    diff --git a/web/screens/Settings/Engines/RemoteEngineSettings.tsx b/web/screens/Settings/Engines/RemoteEngineSettings.tsx index d198f5984..1ddacd432 100644 --- a/web/screens/Settings/Engines/RemoteEngineSettings.tsx +++ b/web/screens/Settings/Engines/RemoteEngineSettings.tsx @@ -1,5 +1,5 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -/* eslint-disable react/no-unescaped-entities */ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable react/no-unescaped-entities */ /* eslint-disable @typescript-eslint/no-unused-vars */ import React, { useCallback, useRef, useState, useEffect } from 'react' @@ -15,15 +15,27 @@ interface EngineConfig extends OriginalEngineConfig { [key: string]: any } -import { ScrollArea, Input, TextArea } from '@janhq/joi' +import { ScrollArea, Input, TextArea, Button } from '@janhq/joi' import { useAtomValue, useSetAtom } from 'jotai' import { set } from 'lodash' -import { ChevronDown, ChevronRight, Eye, EyeOff } from 'lucide-react' +import { + ChevronDown, + ChevronRight, + Eye, + EyeOff, + RefreshCwIcon, +} from 'lucide-react' import { twMerge } from 'tailwind-merge' -import { updateEngine, useGetEngines } from '@/hooks/useEngineManagement' +import Spinner from '@/containers/Loader/Spinner' + +import { + updateEngine, + useGetEngines, + useRefreshModelList, +} from '@/hooks/useEngineManagement' import { getTitleByEngine } from '@/utils/modelEngine' @@ -36,26 +48,29 @@ import { downloadedModelsAtom, selectedModelAtom, } from '@/helpers/atoms/Model.atom' +import { showScrollBarAtom } from '@/helpers/atoms/Setting.atom' import { threadsAtom } from '@/helpers/atoms/Thread.atom' const RemoteEngineSettings = ({ - engine: name, + engine: engineName, }: { engine: InferenceEngine }) => { const { engines, mutate } = useGetEngines() const downloadedModels = useAtomValue(downloadedModelsAtom) const [showApiKey, setShowApiKey] = useState(false) - const remoteModels = downloadedModels.filter((e) => e.engine === name) + const remoteModels = downloadedModels.filter((e) => e.engine === engineName) const [isActiveAdvanceSetting, setisActiveAdvanceSetting] = useState(false) const setSelectedModel = useSetAtom(selectedModelAtom) - const customEngineLogo = getLogoEngine(name) + const customEngineLogo = getLogoEngine(engineName) const threads = useAtomValue(threadsAtom) + const { refreshingModels, refreshModels } = useRefreshModelList(engineName) + const showScrollBar = useAtomValue(showScrollBarAtom) const engine = engines && Object.entries(engines) - .filter(([key]) => key === name) + .filter(([key]) => key === engineName) .flatMap(([_, engineArray]) => engineArray as EngineConfig)[0] const debounceRef = useRef(null) @@ -77,12 +92,12 @@ const RemoteEngineSettings = ({ debounceRef.current = setTimeout(async () => { const updatedEngine = { ...engine } set(updatedEngine, field, value) - await updateEngine(name, updatedEngine) + await updateEngine(engineName, updatedEngine) mutate() events.emit(EngineEvent.OnEngineUpdate, {}) }, 300) }, - [engine, name, mutate] + [engine, engineName, mutate] ) const [data, setData] = useState({ @@ -137,7 +152,10 @@ const RemoteEngineSettings = ({ if (!engine) return null return ( - +
    @@ -148,7 +166,8 @@ const RemoteEngineSettings = ({

    {!customEngineLogo ? ( - Enter your authentication key to activate this engine.{' '} + Enter your authentication key to activate this + engine.{' '} ) : ( @@ -214,7 +233,21 @@ const RemoteEngineSettings = ({

    Model
    - +
    + + +
    diff --git a/web/screens/Settings/Engines/index.tsx b/web/screens/Settings/Engines/index.tsx index ded8b5a90..1375d4d29 100644 --- a/web/screens/Settings/Engines/index.tsx +++ b/web/screens/Settings/Engines/index.tsx @@ -3,6 +3,8 @@ import React from 'react' import { InferenceEngine } from '@janhq/core' import { ScrollArea } from '@janhq/joi' +import { useAtomValue } from 'jotai' + import { useGetEngines } from '@/hooks/useEngineManagement' import { isLocalEngine } from '@/utils/modelEngine' @@ -11,11 +13,17 @@ import LocalEngineItems from './LocalEngineItem' import ModalAddRemoteEngine from './ModalAddRemoteEngine' import RemoteEngineItems from './RemoteEngineItem' +import { showScrollBarAtom } from '@/helpers/atoms/Setting.atom' + const Engines = () => { const { engines } = useGetEngines() + const showScrollBar = useAtomValue(showScrollBarAtom) return ( - +
    diff --git a/web/screens/Settings/ExtensionSetting/index.tsx b/web/screens/Settings/ExtensionSetting/index.tsx index d73f1674d..2d134d3dd 100644 --- a/web/screens/Settings/ExtensionSetting/index.tsx +++ b/web/screens/Settings/ExtensionSetting/index.tsx @@ -1,14 +1,9 @@ import React, { Fragment, useEffect, useMemo, useState } from 'react' -import { - BaseExtension, - InstallationState, - SettingComponentProps, -} from '@janhq/core' +import { SettingComponentProps } from '@janhq/core' import { useAtomValue } from 'jotai' -import ExtensionItem from '../CoreExtensions/ExtensionItem' import SettingDetailItem from '../SettingDetail/SettingDetailItem' import { extensionManager } from '@/extension' @@ -17,11 +12,6 @@ import { selectedSettingAtom } from '@/helpers/atoms/Setting.atom' const ExtensionSetting = ({ extensionName }: { extensionName?: string }) => { const selectedExtensionName = useAtomValue(selectedSettingAtom) const [settings, setSettings] = useState([]) - const [installationState, setInstallationState] = - useState('NotRequired') - const [baseExtension, setBaseExtension] = useState( - undefined - ) const currentExtensionName = useMemo( () => extensionName ?? selectedExtensionName, @@ -35,14 +25,11 @@ const ExtensionSetting = ({ extensionName }: { extensionName?: string }) => { const baseExtension = extensionManager.getByName(currentExtensionName) if (!baseExtension) return - setBaseExtension(baseExtension) if (typeof baseExtension.getSettings === 'function') { const setting = await baseExtension.getSettings() if (setting) allSettings.push(...setting) } setSettings(allSettings) - - setInstallationState(await baseExtension.installationState()) } getExtensionSettings() }, [currentExtensionName]) @@ -75,9 +62,6 @@ const ExtensionSetting = ({ extensionName }: { extensionName?: string }) => { onValueUpdated={onValueChanged} /> )} - {baseExtension && installationState !== 'NotRequired' && ( - - )} ) } diff --git a/web/screens/Settings/Hardware/index.tsx b/web/screens/Settings/Hardware/index.tsx index 1576e85b0..41ef50073 100644 --- a/web/screens/Settings/Hardware/index.tsx +++ b/web/screens/Settings/Hardware/index.tsx @@ -6,22 +6,24 @@ import { useState } from 'react' import { DragDropContext, Draggable, Droppable } from '@hello-pangea/dnd' import { Progress, ScrollArea, Switch } from '@janhq/joi' -import { useAtom, useAtomValue } from 'jotai' +import { useAtom, useAtomValue, useSetAtom } from 'jotai' import { atomWithStorage } from 'jotai/utils' import { ChevronDownIcon, GripVerticalIcon } from 'lucide-react' import { twMerge } from 'tailwind-merge' +import { activeModelAtom } from '@/hooks/useActiveModel' import { useGetHardwareInfo, setActiveGpus, } from '@/hooks/useHardwareManagement' -import { toGibibytes } from '@/utils/converter' +import { toGigabytes } from '@/utils/converter' import { utilizedMemory } from '@/utils/memory' +import { showScrollBarAtom } from '@/helpers/atoms/Setting.atom' import { cpuUsageAtom, ramUtilitizedAtom, @@ -44,8 +46,9 @@ const Hardware = () => { const totalRam = useAtomValue(totalRamAtom) const usedRam = useAtomValue(usedRamAtom) const ramUtilitized = useAtomValue(ramUtilitizedAtom) - + const showScrollBar = useAtomValue(showScrollBarAtom) const [gpus, setGpus] = useAtom(gpusAtom) + const setActiveModel = useSetAtom(activeModelAtom) const [orderGpus, setOrderGpus] = useAtom(orderGpusAtom) @@ -69,11 +72,15 @@ const Hardware = () => { .filter((gpu: any) => gpu.activated) .map((gpu: any) => Number(gpu.id)) await setActiveGpus({ gpus: activeGpuIds }) + setActiveModel(undefined) mutate() - window.location.reload() } catch (error) { console.error('Failed to update active GPUs:', error) } + setIsActivatingGpu((prev) => { + prev.delete(id) + return new Set(prev) + }) } const handleDragEnd = (result: any) => { @@ -133,7 +140,10 @@ const Hardware = () => { }, [hardware?.gpus, setGpus]) return ( - +
    {/* CPU */}
    @@ -169,8 +179,8 @@ const Hardware = () => {
    - {toGibibytes(usedRam, { hideUnit: true })}GB /{' '} - {toGibibytes(totalRam, { hideUnit: true })}GB + {toGigabytes(usedRam, { hideUnit: true })}GB /{' '} + {toGigabytes(totalRam, { hideUnit: true })}GB {hardware?.ram.type && ( <> diff --git a/web/screens/Settings/Hotkeys/index.tsx b/web/screens/Settings/Hotkeys/index.tsx index 7e18c9c34..363001aee 100644 --- a/web/screens/Settings/Hotkeys/index.tsx +++ b/web/screens/Settings/Hotkeys/index.tsx @@ -1,4 +1,7 @@ import { ScrollArea, Badge } from '@janhq/joi' +import { useAtomValue } from 'jotai' + +import { showScrollBarAtom } from '@/helpers/atoms/Setting.atom' const availableHotkeys = [ { @@ -42,8 +45,12 @@ const availableHotkeys = [ ] const Hotkeys = () => { + const showScrollBar = useAtomValue(showScrollBarAtom) return ( - +
    diff --git a/web/screens/Settings/HuggingFaceRepoDetailModal/ModelDownloadList/index.tsx b/web/screens/Settings/HuggingFaceRepoDetailModal/ModelDownloadList/index.tsx deleted file mode 100644 index a1d153d10..000000000 --- a/web/screens/Settings/HuggingFaceRepoDetailModal/ModelDownloadList/index.tsx +++ /dev/null @@ -1,52 +0,0 @@ -import { useMemo } from 'react' - -import { ScrollArea } from '@janhq/joi' -import { useAtomValue } from 'jotai' - -import ModelDownloadRow from '../ModelDownloadRow' - -import { importingHuggingFaceRepoDataAtom } from '@/helpers/atoms/HuggingFace.atom' - -const ModelDownloadList = () => { - const importingHuggingFaceRepoData = useAtomValue( - importingHuggingFaceRepoDataAtom - ) - - const ggufModels = useMemo( - () => - importingHuggingFaceRepoData?.siblings.filter( - (e) => e.downloadUrl && e.rfilename.endsWith('.gguf') - ), - [importingHuggingFaceRepoData] - ) - - if (!importingHuggingFaceRepoData) return null - - if (!ggufModels || ggufModels.length === 0) { - return
    No available GGUF model
    - } - - return ( -
    -

    Available Versions

    - - {ggufModels.map((model, index) => { - if (!model.downloadUrl) return null - return ( - - ) - })} - -
    - ) -} - -export default ModelDownloadList diff --git a/web/screens/Settings/HuggingFaceRepoDetailModal/ModelDownloadRow/index.tsx b/web/screens/Settings/HuggingFaceRepoDetailModal/ModelDownloadRow/index.tsx deleted file mode 100644 index 66302c1d9..000000000 --- a/web/screens/Settings/HuggingFaceRepoDetailModal/ModelDownloadRow/index.tsx +++ /dev/null @@ -1,156 +0,0 @@ -import { useCallback } from 'react' - -import { DownloadState, HuggingFaceRepoData, Quantization } from '@janhq/core' -import { Badge, Button, Progress } from '@janhq/joi' - -import { useAtomValue, useSetAtom } from 'jotai' - -import { twMerge } from 'tailwind-merge' - -import { MainViewState } from '@/constants/screens' - -import { useCreateNewThread } from '@/hooks/useCreateNewThread' -import useDownloadModel from '@/hooks/useDownloadModel' -import { modelDownloadStateAtom } from '@/hooks/useDownloadState' - -import { formatDownloadPercentage, toGibibytes } from '@/utils/converter' - -import { normalizeModelId } from '@/utils/model' - -import { mainViewStateAtom } from '@/helpers/atoms/App.atom' -import { assistantsAtom } from '@/helpers/atoms/Assistant.atom' - -import { importHuggingFaceModelStageAtom } from '@/helpers/atoms/HuggingFace.atom' -import { - downloadedModelsAtom, - getDownloadingModelAtom, -} from '@/helpers/atoms/Model.atom' - -type Props = { - index: number - repoData: HuggingFaceRepoData - downloadUrl: string - fileName: string - fileSize?: number - quantization?: Quantization -} - -const ModelDownloadRow: React.FC = ({ - downloadUrl, - fileName, - fileSize = 0, - quantization, -}) => { - const downloadedModels = useAtomValue(downloadedModelsAtom) - const { downloadModel, abortModelDownload } = useDownloadModel() - const allDownloadStates = useAtomValue(modelDownloadStateAtom) - const downloadState: DownloadState | undefined = allDownloadStates[fileName] - const downloadingModels = useAtomValue(getDownloadingModelAtom) - - const { requestCreateNewThread } = useCreateNewThread() - const setMainViewState = useSetAtom(mainViewStateAtom) - const assistants = useAtomValue(assistantsAtom) - const downloadedModel = downloadedModels.find((md) => md.id === fileName) - const isDownloading = downloadingModels.some( - (md) => md === fileName || fileName.includes(md) - ) - - const setHfImportingStage = useSetAtom(importHuggingFaceModelStageAtom) - - const onAbortDownloadClick = useCallback(() => { - if (downloadUrl) { - abortModelDownload(normalizeModelId(downloadUrl)) - } - }, [downloadUrl, abortModelDownload]) - - const onDownloadClick = useCallback(async () => { - if (downloadUrl) { - downloadModel( - downloadUrl, - normalizeModelId(downloadUrl), - normalizeModelId(downloadUrl) - ) - } - }, [downloadUrl, downloadModel]) - - const onUseModelClick = useCallback(async () => { - if (assistants.length === 0) { - alert('No assistant available') - return - } - await requestCreateNewThread(assistants[0], downloadedModel) - setMainViewState(MainViewState.Thread) - setHfImportingStage('NONE') - }, [ - assistants, - downloadedModel, - requestCreateNewThread, - setMainViewState, - setHfImportingStage, - ]) - - if (!downloadUrl) { - return null - } - - return ( -
    -
    -
    - {quantization && ( - - {quantization} - - )} -

    - {fileName} -

    -
    -
    - - {toGibibytes(fileSize)} - -
    -
    - - {downloadedModel ? ( - - ) : isDownloading ? ( - - ) : ( - - )} -
    - ) -} - -export default ModelDownloadRow diff --git a/web/screens/Settings/HuggingFaceRepoDetailModal/ModelSegmentInfo/index.tsx b/web/screens/Settings/HuggingFaceRepoDetailModal/ModelSegmentInfo/index.tsx deleted file mode 100644 index 10f4515c8..000000000 --- a/web/screens/Settings/HuggingFaceRepoDetailModal/ModelSegmentInfo/index.tsx +++ /dev/null @@ -1,101 +0,0 @@ -import { ReactNode, useMemo, memo } from 'react' - -import { Badge } from '@janhq/joi' -import { useAtomValue } from 'jotai' - -import { Download } from 'lucide-react' - -import { importingHuggingFaceRepoDataAtom } from '@/helpers/atoms/HuggingFace.atom' - -const ModelSegmentInfo = () => { - const importingHuggingFaceRepoData = useAtomValue( - importingHuggingFaceRepoDataAtom - ) - - const { author, modelName, downloads, modelUrl } = useMemo(() => { - const cardData = importingHuggingFaceRepoData?.cardData - const author = (cardData?.['model_creator'] ?? 'N/A') as string - const modelName = (cardData?.['model_name'] ?? - importingHuggingFaceRepoData?.id ?? - 'N/A') as string - - const modelUrl = importingHuggingFaceRepoData?.modelUrl ?? 'N/A' - const downloads = importingHuggingFaceRepoData?.downloads ?? 0 - - return { - author, - modelName, - modelUrl, - downloads, - } - }, [importingHuggingFaceRepoData]) - - if (!importingHuggingFaceRepoData) return null - - return ( -
    - -

    - {modelName} -

    -
    - - - - {modelUrl} - - - -
    -
    - -

    - {author} -

    -
    -
    - -
    - -
    - - - {downloads} - -
    -
    -
    -
    - - -
    - {importingHuggingFaceRepoData.tags.map((tag) => ( - - {tag} - - ))} -
    -
    -
    - ) -} - -type HeaderInfoProps = { - title: string - children: ReactNode -} - -const HeaderInfo = ({ title, children }: HeaderInfoProps) => { - return ( -
    -

    {title}

    - {children} -
    - ) -} - -export default memo(ModelSegmentInfo) diff --git a/web/screens/Settings/HuggingFaceRepoDetailModal/index.tsx b/web/screens/Settings/HuggingFaceRepoDetailModal/index.tsx deleted file mode 100644 index 33367bb18..000000000 --- a/web/screens/Settings/HuggingFaceRepoDetailModal/index.tsx +++ /dev/null @@ -1,53 +0,0 @@ -import { useCallback, useMemo } from 'react' - -import { Modal } from '@janhq/joi' -import { useAtom } from 'jotai' - -import ModelDownloadList from './ModelDownloadList' - -import ModelSegmentInfo from './ModelSegmentInfo' - -import { - importHuggingFaceModelStageAtom, - importingHuggingFaceRepoDataAtom, -} from '@/helpers/atoms/HuggingFace.atom' - -const HuggingFaceRepoDetailModal = () => { - const [hfImportState, setHfImportState] = useAtom( - importHuggingFaceModelStageAtom - ) - const [importingHuggingFaceRepoData, setImportingHuggingFaceRepoData] = - useAtom(importingHuggingFaceRepoDataAtom) - - const onOpenChange = useCallback(() => { - setImportingHuggingFaceRepoData(undefined) - setHfImportState('NONE') - }, [setHfImportState, setImportingHuggingFaceRepoData]) - - const open = useMemo(() => { - return ( - hfImportState === 'REPO_DETAIL' && importingHuggingFaceRepoData != null - ) - }, [hfImportState, importingHuggingFaceRepoData]) - - if (!importingHuggingFaceRepoData) return null - - return ( - -
    - - -
    -
    - } - /> - ) -} - -export default HuggingFaceRepoDetailModal diff --git a/web/screens/Settings/ImportingModelModal/ImportingModelItem.tsx b/web/screens/Settings/ImportingModelModal/ImportingModelItem.tsx index c7f6c35f0..691d64893 100644 --- a/web/screens/Settings/ImportingModelModal/ImportingModelItem.tsx +++ b/web/screens/Settings/ImportingModelModal/ImportingModelItem.tsx @@ -7,7 +7,7 @@ import { AlertCircle } from 'lucide-react' import { setImportModelStageAtom } from '@/hooks/useImportModel' -import { toGibibytes } from '@/utils/converter' +import { toGigabytes } from '@/utils/converter' import { editingModelIdAtom } from '../EditModelInfoModal' import ImportInProgressIcon from '../ImportInProgressIcon' @@ -32,7 +32,7 @@ const ImportingModelItem = ({ model }: Props) => { if (model.status === 'FAILED') { return 'Failed' } else { - return toGibibytes(model.size) + return toGigabytes(model.size) } }, [model.status, model.size]) diff --git a/web/screens/Settings/MyModels/MyModelList/index.tsx b/web/screens/Settings/MyModels/MyModelList/index.tsx index a67dd4592..c2b1ce8c9 100644 --- a/web/screens/Settings/MyModels/MyModelList/index.tsx +++ b/web/screens/Settings/MyModels/MyModelList/index.tsx @@ -16,7 +16,7 @@ import useDeleteModel from '@/hooks/useDeleteModel' import { useGetEngines } from '@/hooks/useEngineManagement' -import { toGibibytes } from '@/utils/converter' +import { toGigabytes } from '@/utils/converter' import { isLocalEngine } from '@/utils/modelEngine' @@ -53,7 +53,7 @@ const MyModelList = ({ model }: Props) => {
    -
    +
    {
    - {model.metadata?.size ? toGibibytes(model.metadata?.size) : '-'} + {model.metadata?.size ? toGigabytes(model.metadata?.size) : '-'}
    @@ -135,9 +135,11 @@ const MyModelList = ({ model }: Props) => {
    { + if (serverEnabled || stateModel.loading) return onModelActionClick(model.id) setMore(false) }} @@ -159,7 +161,7 @@ const MyModelList = ({ model }: Props) => {
    } - disabled={!serverEnabled} + disabled={!serverEnabled || stateModel.loading} content={ {activeModel && activeModel.id === model.id diff --git a/web/screens/Settings/MyModels/index.tsx b/web/screens/Settings/MyModels/index.tsx index 492d03145..0f70e1950 100644 --- a/web/screens/Settings/MyModels/index.tsx +++ b/web/screens/Settings/MyModels/index.tsx @@ -40,6 +40,7 @@ import { downloadedModelsAtom, showEngineListModelAtom, } from '@/helpers/atoms/Model.atom' +import { showScrollBarAtom } from '@/helpers/atoms/Setting.atom' const MyModels = () => { const downloadedModels = useAtomValue(downloadedModelsAtom) @@ -49,6 +50,7 @@ const MyModels = () => { const [showEngineListModel, setShowEngineListModel] = useAtom( showEngineListModelAtom ) + const showScrollBar = useAtomValue(showScrollBarAtom) const { engines } = useGetEngines() @@ -98,21 +100,15 @@ const MyModels = () => { return InferenceEngine.cortex_llamacpp return x.engine }) - const groupByEngine = findByEngine - .filter(function (item, index) { - if (findByEngine.indexOf(item) === index) return item - }) - .sort((a, b) => { - if (priorityEngine.includes(a) && priorityEngine.includes(b)) { - return priorityEngine.indexOf(a) - priorityEngine.indexOf(b) - } else if (priorityEngine.includes(a)) { - return -1 - } else if (priorityEngine.includes(b)) { - return 1 - } else { - return 0 // Leave the rest in their original order - } - }) + + const groupByEngine = [...new Set(findByEngine)].sort((a, b) => { + const aPriority = priorityEngine.indexOf(a) + const bPriority = priorityEngine.indexOf(b) + if (aPriority !== -1 && bPriority !== -1) return aPriority - bPriority + if (aPriority !== -1) return -1 + if (bPriority !== -1) return 1 + return 0 + }) const getEngineStatusReady: InferenceEngine[] = Object.entries(engines ?? {}) // eslint-disable-next-line @typescript-eslint/no-unused-vars @@ -130,7 +126,10 @@ const MyModels = () => { return (
    - + {isDragActive && (
    ({ - __esModule: true, - useSettings: () => ({ - readSettings: () => ({ - run_mode: 'gpu', - experimental: false, - proxy: false, - gpus: [{ name: 'gpu-1' }, { name: 'gpu-2' }], - gpus_in_use: ['0'], - quick_ask: false, - }), - setSettings: setSettingsMock, - }), -})) import * as toast from '@/containers/Toast' diff --git a/web/screens/Settings/Privacy/index.tsx b/web/screens/Settings/Privacy/index.tsx index f591c9cdd..c77ac0447 100644 --- a/web/screens/Settings/Privacy/index.tsx +++ b/web/screens/Settings/Privacy/index.tsx @@ -1,4 +1,4 @@ -import { fs } from '@janhq/core' +import { fs, joinPath } from '@janhq/core' import { Button, Input, ScrollArea, Switch } from '@janhq/joi' import { useAtom, useAtomValue } from 'jotai' import { FolderOpenIcon } from 'lucide-react' @@ -10,7 +10,10 @@ import { toaster } from '@/containers/Toast' import { usePath } from '@/hooks/usePath' import { janDataFolderPathAtom } from '@/helpers/atoms/AppConfig.atom' -import { productAnalyticAtom } from '@/helpers/atoms/Setting.atom' +import { + productAnalyticAtom, + showScrollBarAtom, +} from '@/helpers/atoms/Setting.atom' const Privacy = () => { /** @@ -19,7 +22,9 @@ const Privacy = () => { */ const clearLogs = async () => { try { - await fs.rm(`file://logs`) + for (const file of await fs.readdirSync(`file://logs`)) { + await fs.rm(await joinPath(['file://logs', file])) + } } catch (err) { console.error('Error clearing logs: ', err) } @@ -30,13 +35,16 @@ const Privacy = () => { type: 'success', }) } - + const showScrollBar = useAtomValue(showScrollBarAtom) const janDataFolderPath = useAtomValue(janDataFolderPathAtom) const { onRevealInFinder } = usePath() const [productAnalytic, setProductAnalytic] = useAtom(productAnalyticAtom) return ( - +

    We prioritize your control over your data. Learn more about our  diff --git a/web/screens/Settings/SettingLeftPanel/index.tsx b/web/screens/Settings/SettingLeftPanel/index.tsx index db4c9108c..499cf9f8e 100644 --- a/web/screens/Settings/SettingLeftPanel/index.tsx +++ b/web/screens/Settings/SettingLeftPanel/index.tsx @@ -43,7 +43,7 @@ const SettingLeftPanel = () => { for (const extension of extensions) { const settings = await extension.getSettings() - if (settings && settings.length > 0) { + if (settings && settings.length > 0 && settings.some((e) => e.title)) { extensionsMenu.push({ name: extension.productName, setting: extension.name, diff --git a/web/screens/Thread/ThreadCenterPanel/ChatBody/OnDeviceStarterScreen/index.test.tsx b/web/screens/Thread/ThreadCenterPanel/ChatBody/OnboardingScreen/index.test.tsx similarity index 58% rename from web/screens/Thread/ThreadCenterPanel/ChatBody/OnDeviceStarterScreen/index.test.tsx rename to web/screens/Thread/ThreadCenterPanel/ChatBody/OnboardingScreen/index.test.tsx index 44ecc3dad..5aa5d3b4f 100644 --- a/web/screens/Thread/ThreadCenterPanel/ChatBody/OnDeviceStarterScreen/index.test.tsx +++ b/web/screens/Thread/ThreadCenterPanel/ChatBody/OnboardingScreen/index.test.tsx @@ -1,7 +1,7 @@ import React from 'react' import { render, screen, fireEvent } from '@testing-library/react' import { Provider } from 'jotai' -import OnDeviceStarterScreen from './index' +import OnboardingScreen from './index' import * as jotai from 'jotai' import '@testing-library/jest-dom' @@ -51,27 +51,31 @@ jest.mock('@/hooks/useDownloadModel', () => ({ const mockAtomValue = jest.spyOn(jotai, 'useAtomValue') const mockSetAtom = jest.spyOn(jotai, 'useSetAtom') -describe('OnDeviceStarterScreen', () => { - const mockExtensionHasSettings = [ - { - name: 'Test Extension', - setting: 'test-setting', - apiKey: 'test-key', - provider: 'test-provider', - }, - ] +jest.mock('@/hooks/useModelSource') +import * as source from '@/hooks/useModelSource' + +describe('OnDeviceStarterScreen', () => { beforeEach(() => { mockAtomValue.mockImplementation(() => []) mockSetAtom.mockImplementation(() => jest.fn()) }) + jest.spyOn(source, 'useGetModelSources').mockReturnValue({ + sources: [], + error: null, + mutate: jest.fn(), + }) it('renders the component', () => { + jest.spyOn(source, 'useGetModelSources').mockReturnValue({ + sources: [], + error: null, + mutate: jest.fn(), + }) + jest.spyOn(source, 'useGetFeaturedSources').mockReturnValue([]) render( - + ) @@ -80,11 +84,15 @@ describe('OnDeviceStarterScreen', () => { }) it('handles search input', () => { + jest.spyOn(source, 'useGetModelSources').mockReturnValue({ + sources: [], + error: null, + mutate: jest.fn(), + }) + jest.spyOn(source, 'useGetFeaturedSources').mockReturnValue([]) render( - + ) @@ -97,11 +105,15 @@ describe('OnDeviceStarterScreen', () => { it('displays "No Result Found" when no models match the search', () => { mockAtomValue.mockImplementation(() => []) + jest.spyOn(source, 'useGetModelSources').mockReturnValue({ + sources: [], + error: null, + mutate: jest.fn(), + }) + jest.spyOn(source, 'useGetFeaturedSources').mockReturnValue([]) render( - + ) @@ -114,43 +126,76 @@ describe('OnDeviceStarterScreen', () => { it('renders featured models', () => { const mockConfiguredModels = [ { - id: 'gemma-2-9b-it', - name: 'Gemma 2B', + id: 'cortexso/deepseek-r1', + name: 'DeepSeek R1', metadata: { - tags: ['Featured'], author: 'Test Author', size: 3000000000, + tags: ['featured'], }, + models: [ + { + id: 'cortexso/deepseek-r1', + name: 'DeepSeek R1', + metadata: {}, + }, + ], }, { - id: 'llama3.1-8b-instruct', + id: 'cortexso/llama3.2', name: 'Llama 3.1', - metadata: { tags: [], author: 'Test Author', size: 2000000000 }, + metadata: { + author: 'Test Author', + size: 2000000000, + tags: ['featured'], + }, + models: [ + { + id: 'cortexso/deepseek-r1', + name: 'DeepSeek R1', + metadata: {}, + }, + ], }, ] - mockAtomValue.mockImplementation((atom) => { - return mockConfiguredModels + jest.spyOn(source, 'useGetModelSources').mockReturnValue({ + sources: mockConfiguredModels, + error: null, + mutate: jest.fn(), }) + jest + .spyOn(source, 'useGetFeaturedSources') + .mockReturnValue({ + sources: mockConfiguredModels, + error: null, + mutate: jest.fn(), + }) render( - + ) - expect(screen.getByText('Gemma 2B')).toBeInTheDocument() - expect(screen.queryByText('Llama 3.1')).not.toBeInTheDocument() + expect(screen.getAllByText('deepseek-r1')[0]).toBeInTheDocument() }) it('renders cloud models', () => { + jest.spyOn(source, 'useGetModelSources').mockReturnValue({ + sources: [], + error: null, + mutate: jest.fn(), + }) const mockRemoteModels = [ { id: 'remote-model-1', name: 'Remote Model 1', engine: 'openai' }, { id: 'remote-model-2', name: 'Remote Model 2', engine: 'anthropic' }, ] + jest + .spyOn(source, 'useGetFeaturedSources') + .mockReturnValue(mockRemoteModels) + mockAtomValue.mockImplementation((atom) => { if (atom === jotai.atom([])) { return mockRemoteModels @@ -160,9 +205,7 @@ describe('OnDeviceStarterScreen', () => { render( - + ) diff --git a/web/screens/Thread/ThreadCenterPanel/ChatBody/OnDeviceStarterScreen/index.tsx b/web/screens/Thread/ThreadCenterPanel/ChatBody/OnboardingScreen/index.tsx similarity index 67% rename from web/screens/Thread/ThreadCenterPanel/ChatBody/OnDeviceStarterScreen/index.tsx rename to web/screens/Thread/ThreadCenterPanel/ChatBody/OnboardingScreen/index.tsx index 70f7ef476..16b6a4136 100644 --- a/web/screens/Thread/ThreadCenterPanel/ChatBody/OnDeviceStarterScreen/index.tsx +++ b/web/screens/Thread/ThreadCenterPanel/ChatBody/OnboardingScreen/index.tsx @@ -1,4 +1,4 @@ -import React, { Fragment, useState } from 'react' +import React, { Fragment, useMemo, useState } from 'react' import Image from 'next/image' @@ -26,26 +26,29 @@ import { modelDownloadStateAtom } from '@/hooks/useDownloadState' import { useGetEngines } from '@/hooks/useEngineManagement' -import { formatDownloadPercentage, toGibibytes } from '@/utils/converter' -import { manualRecommendationModel } from '@/utils/model' import { - getLogoEngine, - getTitleByEngine, - isLocalEngine, -} from '@/utils/modelEngine' + useGetFeaturedSources, + useGetModelSources, +} from '@/hooks/useModelSource' + +import { formatDownloadPercentage, toGigabytes } from '@/utils/converter' + +import { getLogoEngine, getTitleByEngine } from '@/utils/modelEngine' + +import { extractModelName } from '@/utils/modelSource' import { mainViewStateAtom } from '@/helpers/atoms/App.atom' +import { getDownloadingModelAtom } from '@/helpers/atoms/Model.atom' import { - configuredModelsAtom, - getDownloadingModelAtom, -} from '@/helpers/atoms/Model.atom' -import { selectedSettingAtom } from '@/helpers/atoms/Setting.atom' + selectedSettingAtom, + showScrollBarAtom, +} from '@/helpers/atoms/Setting.atom' type Props = { isShowStarterScreen?: boolean } -const OnDeviceStarterScreen = ({ isShowStarterScreen }: Props) => { +function OnboardingScreen({ isShowStarterScreen }: Props) { const [searchValue, setSearchValue] = useState('') const [isOpen, setIsOpen] = useState(Boolean(searchValue.length)) const downloadingModels = useAtomValue(getDownloadingModelAtom) @@ -53,44 +56,21 @@ const OnDeviceStarterScreen = ({ isShowStarterScreen }: Props) => { const downloadStates = useAtomValue(modelDownloadStateAtom) const setSelectedSetting = useSetAtom(selectedSettingAtom) const { engines } = useGetEngines() + const showScrollBar = useAtomValue(showScrollBarAtom) - const configuredModels = useAtomValue(configuredModelsAtom) + const { sources } = useGetModelSources() const setMainViewState = useSetAtom(mainViewStateAtom) - const featuredModel = configuredModels.filter((x) => { - const manualRecommendModel = configuredModels.filter((x) => - manualRecommendationModel.includes(x.id) - ) + const { sources: featuredModels } = useGetFeaturedSources() - if (manualRecommendModel.length === 2) { - return ( - x.id === manualRecommendationModel[0] || - x.id === manualRecommendationModel[1] - ) - } else { - return ( - x.metadata?.tags?.includes('Featured') && x.metadata?.size < 5000000000 - ) - } - }) - - const remoteModel = configuredModels.filter( - (x) => !isLocalEngine(engines, x.engine) + const filteredModels = useMemo( + () => + sources?.filter((x) => + x.id.toLowerCase().includes(searchValue.toLowerCase()) + ), + [sources, searchValue] ) - const filteredModels = configuredModels.filter((model) => { - return ( - isLocalEngine(engines, model.engine) && - model.name.toLowerCase().includes(searchValue.toLowerCase()) - ) - }) - - const remoteModelEngine = remoteModel.map((x) => x.engine) - - const groupByEngine = remoteModelEngine.filter(function (item, index) { - if (remoteModelEngine.indexOf(item) === index) return item - }) - const itemsPerRow = 5 const getRows = (array: string[], itemsPerRow: number) => { @@ -101,8 +81,10 @@ const OnDeviceStarterScreen = ({ isShowStarterScreen }: Props) => { return rows } - const rows = getRows( - groupByEngine.sort((a, b) => a.localeCompare(b)), + const cloudProviders = getRows( + Object.keys(engines ?? {}) + .filter((e) => engines?.[e as InferenceEngine]?.[0]?.type === 'remote') + .sort((a, b) => a.localeCompare(b)), itemsPerRow ) @@ -112,7 +94,11 @@ const OnDeviceStarterScreen = ({ isShowStarterScreen }: Props) => { return ( - +

    { !isOpen ? 'invisible' : 'visible' )} > - {!filteredModels.length ? ( + {!featuredModels?.length ? (

    No Result Found

    ) : ( - filteredModels.map((model) => { + filteredModels?.map((model) => { const isDownloading = downloadingModels.some( - (md) => md === model.id + (md) => md === (model.models[0]?.id ?? model.id) ) return (
    { >

    - {model.name} + {extractModelName(model.id)}

    - +
    - {toGibibytes(model.metadata?.size)} + {toGigabytes(model.models[0]?.size)} {!isDownloading ? ( { className="cursor-pointer text-[hsla(var(--app-link))]" onClick={() => downloadModel( - model.sources[0].url, - model.id, - model.name + model.models[0]?.id ?? model.id ) } /> ) : ( Object.values(downloadStates) - .filter((x) => x.modelId === model.id) + .filter( + (x) => x.modelId === model.models[0]?.id + ) .map((item) => ( {

    - {featuredModel.slice(0, 2).map((featModel) => { + {featuredModels?.map((featModel) => { const isDownloading = downloadingModels.some( - (md) => md === featModel.id + (md) => md === (featModel.models[0]?.id ?? featModel.id) ) return (
    { className="my-2 flex items-start justify-between gap-2 border-b border-[hsla(var(--app-border))] pb-4 pt-1 last:border-none" >
    -
    {featModel.name}
    +
    + {extractModelName(featModel.id)} +
    {isDownloading ? (
    {Object.values(downloadStates) - .filter((x) => x.modelId === featModel.id) + .filter( + (x) => x.modelId === featModel.models[0]?.id + ) .map((item, i) => (
    {
    ))} - {toGibibytes(featModel.metadata?.size)} + {toGigabytes(featModel.models[0]?.size)}
    ) : ( @@ -268,17 +261,13 @@ const OnDeviceStarterScreen = ({ isShowStarterScreen }: Props) => { theme="ghost" className="!bg-[hsla(var(--secondary-bg))]" onClick={() => - downloadModel( - featModel.sources[0].url, - featModel.id, - featModel.name - ) + downloadModel(featModel.models[0]?.id) } > Download - {toGibibytes(featModel.metadata?.size)} + {toGigabytes(featModel.models[0]?.size)}
    )} @@ -293,57 +282,51 @@ const OnDeviceStarterScreen = ({ isShowStarterScreen }: Props) => {
    - {rows.slice(0, visibleRows).map((row, rowIndex) => { + {cloudProviders.slice(0, visibleRows).map((row, rowIndex) => { return (
    - {row - .filter( - (e) => - engines?.[e as InferenceEngine]?.[0]?.type === - 'remote' + {row.map((remoteEngine) => { + const engineLogo = getLogoEngine( + remoteEngine as InferenceEngine ) - .map((remoteEngine) => { - const engineLogo = getLogoEngine( - remoteEngine as InferenceEngine - ) - return ( -
    { - setMainViewState(MainViewState.Settings) - setSelectedSetting( - remoteEngine as InferenceEngine - ) - }} - > - {engineLogo && ( - Engine logo + return ( +
    { + setMainViewState(MainViewState.Settings) + setSelectedSetting( + remoteEngine as InferenceEngine + ) + }} + > + {engineLogo && ( + Engine logo + )} + +

    + {getTitleByEngine( + remoteEngine as InferenceEngine )} - -

    - {getTitleByEngine( - remoteEngine as InferenceEngine - )} -

    -
    - ) - })} +

    +
    + ) + })}
    ) })}
    - {visibleRows < rows.length && ( + {visibleRows < cloudProviders.length && (
    +
    ) } diff --git a/web/screens/Thread/ThreadCenterPanel/ChatInput/index.tsx b/web/screens/Thread/ThreadCenterPanel/ChatInput/index.tsx index e582450a9..23b137be8 100644 --- a/web/screens/Thread/ThreadCenterPanel/ChatInput/index.tsx +++ b/web/screens/Thread/ThreadCenterPanel/ChatInput/index.tsx @@ -170,7 +170,7 @@ const ChatInput = () => { !!fileUpload || (activeAssistant?.tools && !activeAssistant?.tools[0]?.enabled && - !activeAssistant?.model.settings?.vision_model) + !activeAssistant?.model.settings?.mmproj) ) { e.stopPropagation() } else { @@ -193,7 +193,7 @@ const ChatInput = () => { {!!fileUpload || (activeAssistant?.tools && !activeAssistant?.tools[0]?.enabled && - !activeAssistant?.model.settings?.vision_model && ( + !activeAssistant?.model.settings?.mmproj && ( <> {!!fileUpload && ( @@ -231,13 +231,13 @@ const ChatInput = () => {
  • { - if (activeAssistant?.model.settings?.vision_model) { + if (activeAssistant?.model.settings?.mmproj) { imageInputRef.current?.click() setShowAttachmentMenus(false) } diff --git a/web/screens/Thread/ThreadCenterPanel/FileUploadPreview/index.tsx b/web/screens/Thread/ThreadCenterPanel/FileUploadPreview/index.tsx index b3a49abb3..ada4ac468 100644 --- a/web/screens/Thread/ThreadCenterPanel/FileUploadPreview/index.tsx +++ b/web/screens/Thread/ThreadCenterPanel/FileUploadPreview/index.tsx @@ -6,7 +6,7 @@ import { XIcon } from 'lucide-react' import { currentPromptAtom, fileUploadAtom } from '@/containers/Providers/Jotai' -import { toGibibytes } from '@/utils/converter' +import { toGigabytes } from '@/utils/converter' import Icon from './Icon' @@ -30,7 +30,7 @@ const FileUploadPreview = () => { {fileUpload?.file.name.replaceAll(/[-._]/g, ' ')}
  • - {toGibibytes(fileUpload?.file.size)} + {toGigabytes(fileUpload?.file.size)}

    diff --git a/web/screens/Thread/ThreadCenterPanel/TextMessage/DocMessage.tsx b/web/screens/Thread/ThreadCenterPanel/TextMessage/DocMessage.tsx index a010c230d..ab5a4ce19 100644 --- a/web/screens/Thread/ThreadCenterPanel/TextMessage/DocMessage.tsx +++ b/web/screens/Thread/ThreadCenterPanel/TextMessage/DocMessage.tsx @@ -2,7 +2,7 @@ import { memo } from 'react' import { usePath } from '@/hooks/usePath' -import { toGibibytes } from '@/utils/converter' +import { toGigabytes } from '@/utils/converter' import Icon from '../FileUploadPreview/Icon' @@ -31,7 +31,7 @@ const DocMessage = ({

    {metadata && 'size' in metadata - ? toGibibytes(Number(metadata.size)) + ? toGigabytes(Number(metadata.size)) : id}

    diff --git a/web/screens/Thread/ThreadCenterPanel/TextMessage/ImageMessage.tsx b/web/screens/Thread/ThreadCenterPanel/TextMessage/ImageMessage.tsx index 14041721b..5c6bd7c4b 100644 --- a/web/screens/Thread/ThreadCenterPanel/TextMessage/ImageMessage.tsx +++ b/web/screens/Thread/ThreadCenterPanel/TextMessage/ImageMessage.tsx @@ -4,7 +4,7 @@ import { RelativeImage } from '../TextMessage/RelativeImage' const ImageMessage = ({ image }: { image: string }) => { return ( -
    +
    ) diff --git a/web/screens/Thread/ThreadCenterPanel/TextMessage/MarkdownTextMessage.tsx b/web/screens/Thread/ThreadCenterPanel/TextMessage/MarkdownTextMessage.tsx index 19ff213cb..23c6b4ac1 100644 --- a/web/screens/Thread/ThreadCenterPanel/TextMessage/MarkdownTextMessage.tsx +++ b/web/screens/Thread/ThreadCenterPanel/TextMessage/MarkdownTextMessage.tsx @@ -7,21 +7,41 @@ import Markdown from 'react-markdown' import rehypeHighlight from 'rehype-highlight' import rehypeHighlightCodeLines from 'rehype-highlight-code-lines' - import rehypeKatex from 'rehype-katex' +import rehypeRaw from 'rehype-raw' + +import remarkGfm from 'remark-gfm' import remarkMath from 'remark-math' import 'katex/dist/katex.min.css' import 'highlight.js/styles/atom-one-dark.css' +import '@/styles/components/marked.scss' + +import { twMerge } from 'tailwind-merge' + import { useClipboard } from '@/hooks/useClipboard' import { getLanguageFromExtension } from '@/utils/codeLanguageExtension' import { markdownComponents } from './MarkdownUtils' +interface Props { + text: string + isUser?: boolean + className?: string + renderKatex?: boolean + renderRaw?: boolean +} + export const MarkdownTextMessage = memo( - ({ text, isUser }: { id?: string; text: string; isUser?: boolean }) => { + ({ + text, + isUser, + className, + renderKatex = true, + renderRaw = true, + }: Props) => { const clipboard = useClipboard({ timeout: 1000 }) // Escapes headings @@ -65,6 +85,7 @@ export const MarkdownTextMessage = memo( // Join the lines with newline characters for proper formatting return codeLines.join('\n') } + function wrapCodeBlocksWithoutVisit() { return (tree: { children: any[] }) => { tree.children = tree.children.map((node) => { @@ -94,7 +115,6 @@ export const MarkdownTextMessage = memo( 'code-block', 'group/item', 'relative', - 'my-4', 'overflow-auto', ], }, @@ -104,14 +124,15 @@ export const MarkdownTextMessage = memo( tagName: 'div', properties: { className: - 'code-header bg-[hsla(var(--app-code-block))] flex justify-between items-center py-2 px-3 code-header--border rounded-t-lg', + 'code-header bg-[hsla(var(--app-code-block))] flex justify-between items-center py-2 px-3 border-b border-[hsla(var(--app-border))] rounded-t-lg', }, children: [ { type: 'element', tagName: 'span', properties: { - className: 'text-xs font-medium text-gray-300', + className: + 'text-xs font-medium dark text-[hsla(var(--text-primary))]', }, children: [ { @@ -127,7 +148,7 @@ export const MarkdownTextMessage = memo( tagName: 'button', properties: { className: - 'copy-button ml-auto flex items-center gap-1 text-xs font-medium text-gray-400 hover:text-gray-600 focus:outline-none', + 'copy-button ml-auto flex items-center gap-1 text-xs font-medium text-[hsla(var(--text-primary))] focus:outline-none', onClick: (event: Event) => { clipboard.copy(extractCodeLines(node)) @@ -139,7 +160,7 @@ export const MarkdownTextMessage = memo( setTimeout(() => { button.innerHTML = ` - + Copy ` }, 2000) @@ -160,7 +181,7 @@ export const MarkdownTextMessage = memo( strokeLinecap: 'round', strokeLinejoin: 'round', className: - 'lucide lucide-copy pointer-events-none text-gray-400', + 'lucide lucide-copy pointer-events-none text-[hsla(var(--text-primary))]', }, children: [ { @@ -201,16 +222,21 @@ export const MarkdownTextMessage = memo( }) } } + return ( <> {preprocessMarkdown(text)} diff --git a/web/screens/Thread/ThreadCenterPanel/TextMessage/MarkdownUtils.tsx b/web/screens/Thread/ThreadCenterPanel/TextMessage/MarkdownUtils.tsx index c720dded5..833e67eeb 100644 --- a/web/screens/Thread/ThreadCenterPanel/TextMessage/MarkdownUtils.tsx +++ b/web/screens/Thread/ThreadCenterPanel/TextMessage/MarkdownUtils.tsx @@ -11,4 +11,11 @@ export const markdownComponents: Partial = { {children} ), + table: ({ children }) => ( +
    + + {children} +
    +
    + ), } diff --git a/web/screens/Thread/ThreadCenterPanel/TextMessage/index.tsx b/web/screens/Thread/ThreadCenterPanel/TextMessage/index.tsx index 4ce65d031..7103f7914 100644 --- a/web/screens/Thread/ThreadCenterPanel/TextMessage/index.tsx +++ b/web/screens/Thread/ThreadCenterPanel/TextMessage/index.tsx @@ -24,6 +24,7 @@ import { tokenSpeedAtom, } from '@/helpers/atoms/ChatMessage.atom' +import { selectedModelAtom } from '@/helpers/atoms/Model.atom' import { chatWidthAtom } from '@/helpers/atoms/Setting.atom' const MessageContainer: React.FC< @@ -35,6 +36,7 @@ const MessageContainer: React.FC< const activeAssistant = useAtomValue(activeAssistantAtom) const tokenSpeed = useAtomValue(tokenSpeedAtom) const chatWidth = useAtomValue(chatWidthAtom) + const selectedModel = useAtomValue(selectedModelAtom) const text = useMemo( () => @@ -68,33 +70,18 @@ const MessageContainer: React.FC< return (
    {!isUser && !isSystem && } - {isUser && ( -
    - - - -
    - )}
    - {isUser - ? props.role - : (activeAssistant?.assistant_name ?? props.role)} + {!isUser && ( + <> + {props.metadata && 'model' in props.metadata + ? (props.metadata?.model as string) + : props.isCurrentMessage + ? selectedModel?.name + : (activeAssistant?.assistant_name ?? props.role)} + + )}
    +

    {props.created_at && displayDate(props.created_at ?? Date.now() / 1000)} @@ -115,27 +109,38 @@ const MessageContainer: React.FC<

    - {tokenSpeed && + {((!!tokenSpeed && tokenSpeed.message === props.id && - tokenSpeed.tokenSpeed > 0 && ( -

    - Token Speed: {Number(tokenSpeed.tokenSpeed).toFixed(2)}t/s -

    - )} + tokenSpeed.tokenSpeed > 0) || + (props.metadata && + 'token_speed' in props.metadata && + !!props.metadata?.token_speed)) && ( +

    + Token Speed:{' '} + {Number( + props.metadata?.token_speed ?? tokenSpeed?.tokenSpeed + ).toFixed(2)} + t/s +

    + )}
    - + {editMessage !== props.id && }
    )}
    )} diff --git a/web/screens/Thread/ThreadCenterPanel/index.tsx b/web/screens/Thread/ThreadCenterPanel/index.tsx index d32fe1ade..02fd7c7fd 100644 --- a/web/screens/Thread/ThreadCenterPanel/index.tsx +++ b/web/screens/Thread/ThreadCenterPanel/index.tsx @@ -61,7 +61,7 @@ const ThreadCenterPanel = () => { const activeAssistant = useAtomValue(activeAssistantAtom) const chatWidth = useAtomValue(chatWidthAtom) const upload = uploader() - const acceptedFormat: Accept = activeAssistant?.model.settings?.vision_model + const acceptedFormat: Accept = activeAssistant?.model.settings?.mmproj ? { 'application/pdf': ['.pdf'], 'image/jpeg': ['.jpeg'], @@ -83,7 +83,7 @@ const ThreadCenterPanel = () => { if ( e.dataTransfer.items.length === 1 && ((activeAssistant?.tools && activeAssistant?.tools[0]?.enabled) || - activeAssistant?.model.settings?.vision_model) + activeAssistant?.model.settings?.mmproj) ) { setDragOver(true) } else if ( @@ -105,7 +105,7 @@ const ThreadCenterPanel = () => { rejectFiles.length !== 0 || (activeAssistant?.tools && !activeAssistant?.tools[0]?.enabled && - !activeAssistant?.model.settings?.vision_model) + !activeAssistant?.model.settings?.mmproj) ) return const imageType = files[0]?.type.includes('image') @@ -182,7 +182,7 @@ const ThreadCenterPanel = () => {
    {isDragReject ? `Currently, we only support 1 attachment at the same time with ${ - activeAssistant?.model.settings?.vision_model + activeAssistant?.model.settings?.mmproj ? 'PDF, JPEG, JPG, PNG' : 'PDF' } format` @@ -190,7 +190,7 @@ const ThreadCenterPanel = () => {
    {!isDragReject && (

    - {activeAssistant?.model.settings?.vision_model + {activeAssistant?.model.settings?.mmproj ? 'PDF, JPEG, JPG, PNG' : 'PDF'}

    diff --git a/web/screens/Thread/index.tsx b/web/screens/Thread/index.tsx index c3963067a..a5f77d766 100644 --- a/web/screens/Thread/index.tsx +++ b/web/screens/Thread/index.tsx @@ -5,7 +5,7 @@ import { useStarterScreen } from '@/hooks/useStarterScreen' import ThreadLeftPanel from '@/screens/Thread/ThreadLeftPanel' import ThreadCenterPanel from './ThreadCenterPanel' -import OnDeviceStarterScreen from './ThreadCenterPanel/ChatBody/OnDeviceStarterScreen' +import OnboardingScreen from './ThreadCenterPanel/ChatBody/OnboardingScreen' import ModalCleanThread from './ThreadLeftPanel/ModalCleanThread' import ModalDeleteThread from './ThreadLeftPanel/ModalDeleteThread' import ModalEditTitleThread from './ThreadLeftPanel/ModalEditTitleThread' @@ -17,7 +17,7 @@ type Props = { const ThreadPanels = memo(({ isShowStarterScreen }: Props) => { return isShowStarterScreen ? ( - + ) : ( <> diff --git a/web/styles/base/global.scss b/web/styles/base/global.scss index 965819d72..77f64c267 100644 --- a/web/styles/base/global.scss +++ b/web/styles/base/global.scss @@ -7,18 +7,18 @@ text-decoration: underline; } - .dragable-bar { + .draggable-bar { position: absolute; left: 0px; top: 0px; width: 100%; - height: 32px; - user-select: none; -webkit-app-region: drag; } .unset-drag { + user-select: inherit; -webkit-app-region: no-drag; + pointer-events: all; /* Ensure it receives input events */ } .unselect { @@ -33,6 +33,7 @@ } input[type='number'] { + appearance: textfield; -moz-appearance: textfield; } @@ -42,3 +43,20 @@ margin: 0; } } + +::-webkit-scrollbar { + width: 8px; + height: 8px; +} +::-webkit-scrollbar-track, +::-webkit-scrollbar-thumb { + background-clip: content-box; + border-radius: inherit; +} +::-webkit-scrollbar-track { + background: hsla(var(--scrollbar-tracker)); +} +::-webkit-scrollbar-thumb { + background: hsla(var(--scrollbar-thumb)); + border-radius: 20px; +} diff --git a/web/styles/components/code-block.scss b/web/styles/components/code-block.scss index 5f6c059e3..b0b0269bf 100644 --- a/web/styles/components/code-block.scss +++ b/web/styles/components/code-block.scss @@ -1,6 +1,6 @@ .hljs-comment, .hljs-quote { - color: var(--hljs-comment); + color: var(--hljs-comment) !important; } /* Red */ @@ -12,7 +12,7 @@ .hljs-selector-class, .hljs-regexp, .hljs-deletion { - color: var(--hljs-variable); + color: var(--hljs-variable) !important; } /* Orange */ @@ -24,12 +24,13 @@ .hljs-params, .hljs-meta, .hljs-link { - color: var(--hljs-number); + color: var(--hljs-number) !important; } /* Yellow */ -.hljs-attribute { - color: var(--hljs-attribute); +.hljs-attribute, +.hljs-attr { + color: var(--hljs-attribute) !important; } /* Green */ @@ -37,19 +38,19 @@ .hljs-symbol, .hljs-bullet, .hljs-addition { - color: var(--hljs-string); + color: var(--hljs-string) !important; } /* Blue */ .hljs-title, .hljs-section { - color: var(--hljs-title); + color: var(--hljs-title) !important; } /* Purple */ .hljs-keyword, .hljs-selector-tag { - color: var(--hljs-keyword); + color: var(--hljs-keyword) !important; } .hljs { @@ -62,9 +63,7 @@ } pre { - background: hsla(var(--app-code-block)); overflow: auto; - border-radius: 0.4rem; } pre > code { @@ -87,6 +86,7 @@ pre > code { .code-block { pre { padding: 0; + background: hsla(var(--app-code-block)) !important; border-top-left-radius: 0; border-top-right-radius: 0; } @@ -127,6 +127,7 @@ pre > code { margin-left: -12px; margin-right: -12px; border-left: 4px solid transparent; + color: hsla(var(--text-secondary)); } div.code-line:empty { @@ -155,17 +156,16 @@ span.code-line { .numbered-code-line::before { content: attr(data-line-number); - margin-left: -4px; margin-right: 16px; - width: 1.2rem; + width: 1.8rem; font-size: 12px; - color: rgba($color: #fff, $alpha: 0.4); + /* color: rgba($color: #fff, $alpha: 0.4); */ text-align: right; display: inline-block; } .code-header { - &--border { - border-bottom: 1px solid rgba($color: #fff, $alpha: 0.1); + button { + background-color: transparent !important; } } diff --git a/web/styles/components/marked.scss b/web/styles/components/marked.scss new file mode 100644 index 000000000..36faf10a6 --- /dev/null +++ b/web/styles/components/marked.scss @@ -0,0 +1,112 @@ +/* Headings */ +.markdown-content h1, +.markdown-content h2, +.markdown-content h3, +.markdown-content h4, +.markdown-content h5, +.markdown-content h6 { + margin-top: 1rem; + margin-bottom: 0.5rem; + font-weight: 500; + line-height: 1.2; + color: hsla(var(--text-primary)); +} + +.markdown-content h1 { + font-size: 1.25rem; + padding-bottom: 0.3rem; +} + +.markdown-content h2 { + font-size: 1rem; + padding-bottom: 0.2rem; +} + +.markdown-content h3 { + font-size: 0.875rem; +} + +.markdown-content h4 { + font-size: 0.7rem; +} + +.markdown-content h5 { + font-size: 0.6rem; +} + +.markdown-content h6 { + font-size: 0.5rem; + color: #555; +} + +.markdown-content pre code { + background: none; + padding: 0; + color: inherit; +} + +.markdown-content pre { + color: #f8f8f2; + border-radius: 8px; + overflow-x: auto; + font-size: 0.9rem; + margin: 1rem 0; + padding: 16px; + background-color: hsla(var(--app-code-block)) !important; +} + +/* Tables */ +.markdown-content table { + width: 100%; + font-size: 14px; + border-collapse: separate; + border-spacing: 0px; + border: solid hsla(var(--app-border)) 1px; + border-radius: 8px; + overflow: auto; + margin-top: 16px; + margin-bottom: 16px; +} + +.markdown-content th, +.markdown-content td { + padding-left: 24px; + padding-top: 12px; + padding-bottom: 12px; + text-align: left; + border: 0; +} + +.markdown-content th { + color: hsla(var(--text-secondary)); + background-color: hsla(var(--app-bg)); +} + +.markdown-content td { + border-top: solid hsla(var(--app-border)) 1px; +} + +.markdown-content hr { + margin: 16px 0px; + border-color: hsla(var(--app-border)); +} + +.markdown-content { + ol, + ul { + list-style: auto; + padding-left: 16px; + white-space: normal; + list-style-position: inside; + li { + line-height: 2; + p { + display: inline; + } + } + } +} + +.markdown-content .code-block-wrapper pre { + margin-top: 0; +} diff --git a/web/styles/components/message.scss b/web/styles/components/message.scss index d96ab8b6a..f62e271ff 100644 --- a/web/styles/components/message.scss +++ b/web/styles/components/message.scss @@ -28,4 +28,10 @@ blockquote { @apply inline-flex flex-col border-s-4 border-[hsla(var(--primary-bg))] bg-[hsla(var(--primary-bg-soft))] px-4 py-2; } + + .markdown-content pre { + margin-top: 0 !important; + border-top-left-radius: 0 !important; + border-top-right-radius: 0 !important; + } } diff --git a/web/styles/components/model.scss b/web/styles/components/model.scss new file mode 100644 index 000000000..76e20b21c --- /dev/null +++ b/web/styles/components/model.scss @@ -0,0 +1,3 @@ +.md-short-desc hr { + visibility: hidden; +} diff --git a/web/styles/main.scss b/web/styles/main.scss index a7e85fcb0..82982b751 100644 --- a/web/styles/main.scss +++ b/web/styles/main.scss @@ -41,12 +41,13 @@ --text-tertiary: 0, 0%, 0%, 0.4; --text-quaternary: 0, 0%, 0%, 0.2; + --app-code-block: 0, 0%, 95%, 0.8; --hljs-comment: #6e7781; --hljs-variable: #cf222e; --hljs-number: #bc4c00; --hljs-attribute: #b58407; - --hljs-string: #116329; - --hljs-title: #0550ae; + --hljs-string: #0f766e; + --hljs-title: #0e7490; --hljs-keyword: #8250df; } @@ -77,6 +78,7 @@ html.dark { --text-tertiary: 0, 0%, 68%, 0.4; --text-quaternary: 0, 0%, 68%, 0.2; + --app-code-block: 0, 0%, 100%, 0.05; --hljs-comment: #8b949e; --hljs-variable: #ff7b72; --hljs-number: #f0883e; diff --git a/web/utils/converter.ts b/web/utils/converter.ts index 017a05d1a..55f00c46d 100644 --- a/web/utils/converter.ts +++ b/web/utils/converter.ts @@ -1,14 +1,23 @@ -export const toGibibytes = ( +export const toGigabytes = ( input: number, - options?: { hideUnit?: boolean } + options?: { hideUnit?: boolean; toFixed?: number } ) => { if (!input) return '' if (input > 1024 ** 3) { - return (input / 1024 ** 3).toFixed(2) + (options?.hideUnit ? '' : 'GB') + return ( + (input / 1024 ** 3).toFixed(options?.toFixed ?? 2) + + (options?.hideUnit ? '' : 'GB') + ) } else if (input > 1024 ** 2) { - return (input / 1024 ** 2).toFixed(2) + (options?.hideUnit ? '' : 'MB') + return ( + (input / 1024 ** 2).toFixed(options?.toFixed ?? 2) + + (options?.hideUnit ? '' : 'MB') + ) } else if (input > 1024) { - return (input / 1024).toFixed(2) + (options?.hideUnit ? '' : 'KB') + return ( + (input / 1024).toFixed(options?.toFixed ?? 2) + + (options?.hideUnit ? '' : 'KB') + ) } else { return input + (options?.hideUnit ? '' : 'B') } @@ -24,7 +33,7 @@ export const formatDownloadPercentage = ( export const formatDownloadSpeed = (input: number | undefined) => { if (!input) return '0B/s' - return toGibibytes(input) + '/s' + return toGigabytes(input) + '/s' } export const formatTwoDigits = (input: number) => { diff --git a/web/utils/datetime.test.ts b/web/utils/datetime.test.ts index 605f98d24..24774be18 100644 --- a/web/utils/datetime.test.ts +++ b/web/utils/datetime.test.ts @@ -7,7 +7,6 @@ test("should return only time for today's timestamp", () => { const expectedTime = `${today.toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit', - second: '2-digit', hour12: true, })}` expect(displayDate(timestamp / 1000)).toBe(expectedTime) diff --git a/web/utils/datetime.ts b/web/utils/datetime.ts index f5fdf8226..796ad0149 100644 --- a/web/utils/datetime.ts +++ b/web/utils/datetime.ts @@ -21,7 +21,6 @@ export const displayDate = (timestamp?: string | number | Date) => { })}, ${date.toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit', - second: '2-digit', hour12: true, })}` @@ -29,7 +28,6 @@ export const displayDate = (timestamp?: string | number | Date) => { displayDate = date.toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit', - second: '2-digit', hour12: true, }) } diff --git a/web/utils/model.ts b/web/utils/model.ts index 00bf80c12..cb0f0ff31 100644 --- a/web/utils/model.ts +++ b/web/utils/model.ts @@ -7,8 +7,3 @@ export const normalizeModelId = (downloadUrl: string): string => { return downloadUrl.split('/').pop() ?? downloadUrl } - -export const manualRecommendationModel = [ - 'llama3.2-1b-instruct', - 'llama3.2-3b-instruct', -] diff --git a/web/utils/modelEngine.ts b/web/utils/modelEngine.ts index 664670b76..c81eef32f 100644 --- a/web/utils/modelEngine.ts +++ b/web/utils/modelEngine.ts @@ -71,6 +71,29 @@ export const getTitleByEngine = (engine: InferenceEngine | string) => { } } +export const getDescriptionByEngine = (engine: InferenceEngine) => { + switch (engine) { + case InferenceEngine.anthropic: + return 'Creator of Claude AI models renowned for exceptional reasoning, analysis, and coding capabilities. Claude models combine high intelligence with strong safety and ethics, making them ideal for complex tasks from research to technical writing.' + case InferenceEngine.cohere: + return 'Enterprise-focused language models designed for business needs. Specializing in reliable content generation, summarization, and semantic analysis with consistent quality and scalable performance.' + case InferenceEngine.groq: + return 'An innovative AI infrastructure provider revolutionizing model speed. Their custom-built hardware platform delivers ultra-fast inference while maintaining high-quality outputs.' + case InferenceEngine.martian: + return 'Production-first language models balancing performance with practicality. Built for reliable deployment and consistent results across diverse real-world applications.' + case InferenceEngine.mistral: + return 'A breakthrough in open-source language models. Their instruction-tuned models like Mixtral and Mistral combine competitive performance with efficient resource usage across reasoning, coding, and general tasks.' + case InferenceEngine.nvidia: + return 'Industry leaders in AI hardware and software solutions. Their models leverage deep GPU expertise to deliver high-performance AI capabilities optimized for enterprise use.' + case InferenceEngine.openai: + return 'Creator of GPT models that set industry benchmarks. Their models excel across text, code, and image generation, consistently setting new standards for AI capabilities.' + case InferenceEngine.openrouter: + return 'A unified platform aggregating top AI models from various providers. Simplifies AI deployment by offering seamless access to multiple services through standardized integration.' + default: + return `Access models from ${getTitleByEngine(engine)} via their API.` + } +} + export const priorityEngine = [ InferenceEngine.cortex_llamacpp, InferenceEngine.cortex_onnx, diff --git a/web/utils/modelSource.ts b/web/utils/modelSource.ts new file mode 100644 index 000000000..2f4676298 --- /dev/null +++ b/web/utils/modelSource.ts @@ -0,0 +1,48 @@ +/** + * This utility is to extract cortexso model description from README.md file + * @returns + */ +export const extractDescription = (text?: string) => { + if (!text) return text + const normalizedText = removeYamlFrontMatter(text) + const overviewPattern = /(?:##\s*Overview\s*\n)([\s\S]*?)(?=\n\s*##|$)/ + const matches = normalizedText?.match(overviewPattern) + let extractedText = + matches && matches[1] + ? matches[1].trim() + : normalizedText?.slice(0, 500).trim() + + // Remove image markdown syntax ![alt text](image-url) + extractedText = extractedText?.replace(/!\[.*?\]\(.*?\)/g, '') + + // Remove HTML tags + extractedText = extractedText?.replace(/]*>/g, '') + + return extractedText +} +/** + * Remove YAML (HF metadata) front matter from content + * @param content + * @returns + */ +export const removeYamlFrontMatter = (content: string): string => { + return content.replace(/^---\n([\s\S]*?)\n---\n/, '') +} + +/** + * Extract model name from repo path, e.g. cortexso/tinyllama -> tinyllama + * @param modelId + * @returns + */ +export const extractModelName = (model?: string) => { + return model?.split('/')[1] ?? model +} + +/** + * Extract model name from repo path, e.g. https://huggingface.co/cortexso/tinyllama -> cortexso/tinyllama + * @param modelId + * @returns + */ +export const extractModelRepo = (model?: string) => { + return model?.replace('https://huggingface.co/', '') +} diff --git a/web/utils/search.ts b/web/utils/search.ts new file mode 100644 index 000000000..4484fb92e --- /dev/null +++ b/web/utils/search.ts @@ -0,0 +1,23 @@ +/** + * Searches for a query in a list of data using a fuzzy search algorithm. + */ +export function fuzzySearch(needle: string, haystack: string) { + const hlen = haystack.length + const nlen = needle.length + if (nlen > hlen) { + return false + } + if (nlen === hlen) { + return needle === haystack + } + outer: for (let i = 0, j = 0; i < nlen; i++) { + const nch = needle.charCodeAt(i) + while (j < hlen) { + if (haystack.charCodeAt(j++) === nch) { + continue outer + } + } + return false + } + return true +} diff --git a/web/utils/thread.test.ts b/web/utils/thread.test.ts deleted file mode 100644 index 672e3adde..000000000 --- a/web/utils/thread.test.ts +++ /dev/null @@ -1,9 +0,0 @@ - -import { generateThreadId } from './thread'; - -test('shouldGenerateThreadIdWithCorrectFormat', () => { - const assistantId = 'assistant123'; - const threadId = generateThreadId(assistantId); - const regex = /^assistant123_\d{10}$/; - expect(threadId).toMatch(regex); -}); diff --git a/web/utils/thread.ts b/web/utils/thread.ts deleted file mode 100644 index 7098ade6a..000000000 --- a/web/utils/thread.ts +++ /dev/null @@ -1,3 +0,0 @@ -export const generateThreadId = (assistantId: string) => { - return `${assistantId}_${(Date.now() / 1000).toFixed(0)}` -} diff --git a/yarn.lock b/yarn.lock index 3d5411cdd..d8076bb92 100644 --- a/yarn.lock +++ b/yarn.lock @@ -13,9 +13,9 @@ __metadata: linkType: hard "@adobe/css-tools@npm:^4.4.0": - version: 4.4.1 - resolution: "@adobe/css-tools@npm:4.4.1" - checksum: 10c0/1a68ad9af490f45fce7b6e50dd2d8ac0c546d74431649c0d42ee4ceb1a9fa057fae0a7ef1e148effa12d84ec00ed71869ebfe0fb1dcdcc80bfcb6048c12abcc0 + version: 4.4.2 + resolution: "@adobe/css-tools@npm:4.4.2" + checksum: 10c0/19433666ad18536b0ed05d4b53fbb3dd6ede266996796462023ec77a90b484890ad28a3e528cdf3ab8a65cb2fcdff5d8feb04db6bc6eed6ca307c40974239c94 languageName: node linkType: hard @@ -43,7 +43,7 @@ __metadata: languageName: node linkType: hard -"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.22.13, @babel/code-frame@npm:^7.25.9, @babel/code-frame@npm:^7.26.0, @babel/code-frame@npm:^7.26.2": +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.22.13, @babel/code-frame@npm:^7.26.2": version: 7.26.2 resolution: "@babel/code-frame@npm:7.26.2" dependencies: @@ -54,59 +54,59 @@ __metadata: languageName: node linkType: hard -"@babel/compat-data@npm:^7.25.9": - version: 7.26.3 - resolution: "@babel/compat-data@npm:7.26.3" - checksum: 10c0/d63e71845c34dfad8d7ff8c15b562e620dbf60e68e3abfa35681d24d612594e8e5ec9790d831a287ecd79ce00f48e7ffddc85c5ce94af7242d45917b9c1a5f90 +"@babel/compat-data@npm:^7.26.5": + version: 7.26.8 + resolution: "@babel/compat-data@npm:7.26.8" + checksum: 10c0/66408a0388c3457fff1c2f6c3a061278dd7b3d2f0455ea29bb7b187fa52c60ae8b4054b3c0a184e21e45f0eaac63cf390737bc7504d1f4a088a6e7f652c068ca languageName: node linkType: hard "@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.23.9": - version: 7.26.0 - resolution: "@babel/core@npm:7.26.0" + version: 7.26.9 + resolution: "@babel/core@npm:7.26.9" dependencies: "@ampproject/remapping": "npm:^2.2.0" - "@babel/code-frame": "npm:^7.26.0" - "@babel/generator": "npm:^7.26.0" - "@babel/helper-compilation-targets": "npm:^7.25.9" + "@babel/code-frame": "npm:^7.26.2" + "@babel/generator": "npm:^7.26.9" + "@babel/helper-compilation-targets": "npm:^7.26.5" "@babel/helper-module-transforms": "npm:^7.26.0" - "@babel/helpers": "npm:^7.26.0" - "@babel/parser": "npm:^7.26.0" - "@babel/template": "npm:^7.25.9" - "@babel/traverse": "npm:^7.25.9" - "@babel/types": "npm:^7.26.0" + "@babel/helpers": "npm:^7.26.9" + "@babel/parser": "npm:^7.26.9" + "@babel/template": "npm:^7.26.9" + "@babel/traverse": "npm:^7.26.9" + "@babel/types": "npm:^7.26.9" convert-source-map: "npm:^2.0.0" debug: "npm:^4.1.0" gensync: "npm:^1.0.0-beta.2" json5: "npm:^2.2.3" semver: "npm:^6.3.1" - checksum: 10c0/91de73a7ff5c4049fbc747930aa039300e4d2670c2a91f5aa622f1b4868600fc89b01b6278385fbcd46f9574186fa3d9b376a9e7538e50f8d118ec13cfbcb63e + checksum: 10c0/ed7212ff42a9453765787019b7d191b167afcacd4bd8fec10b055344ef53fa0cc648c9a80159ae4ecf870016a6318731e087042dcb68d1a2a9d34eb290dc014b languageName: node linkType: hard -"@babel/generator@npm:^7.26.0, @babel/generator@npm:^7.26.3, @babel/generator@npm:^7.7.2": - version: 7.26.3 - resolution: "@babel/generator@npm:7.26.3" +"@babel/generator@npm:^7.26.9, @babel/generator@npm:^7.7.2": + version: 7.26.9 + resolution: "@babel/generator@npm:7.26.9" dependencies: - "@babel/parser": "npm:^7.26.3" - "@babel/types": "npm:^7.26.3" + "@babel/parser": "npm:^7.26.9" + "@babel/types": "npm:^7.26.9" "@jridgewell/gen-mapping": "npm:^0.3.5" "@jridgewell/trace-mapping": "npm:^0.3.25" jsesc: "npm:^3.0.2" - checksum: 10c0/54f260558e3e4ec8942da3cde607c35349bb983c3a7c5121243f96893fba3e8cd62e1f1773b2051f936f8c8a10987b758d5c7d76dbf2784e95bb63ab4843fa00 + checksum: 10c0/6b78872128205224a9a9761b9ea7543a9a7902a04b82fc2f6801ead4de8f59056bab3fd17b1f834ca7b049555fc4c79234b9a6230dd9531a06525306050becad languageName: node linkType: hard -"@babel/helper-compilation-targets@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-compilation-targets@npm:7.25.9" +"@babel/helper-compilation-targets@npm:^7.26.5": + version: 7.26.5 + resolution: "@babel/helper-compilation-targets@npm:7.26.5" dependencies: - "@babel/compat-data": "npm:^7.25.9" + "@babel/compat-data": "npm:^7.26.5" "@babel/helper-validator-option": "npm:^7.25.9" browserslist: "npm:^4.24.0" lru-cache: "npm:^5.1.1" semver: "npm:^6.3.1" - checksum: 10c0/a6b26a1e4222e69ef8e62ee19374308f060b007828bc11c65025ecc9e814aba21ff2175d6d3f8bf53c863edd728ee8f94ba7870f8f90a37d39552ad9933a8aaa + checksum: 10c0/9da5c77e5722f1a2fcb3e893049a01d414124522bbf51323bb1a0c9dcd326f15279836450fc36f83c9e8a846f3c40e88be032ed939c5a9840922bed6073edfb4 languageName: node linkType: hard @@ -134,9 +134,9 @@ __metadata: linkType: hard "@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.25.9, @babel/helper-plugin-utils@npm:^7.8.0": - version: 7.25.9 - resolution: "@babel/helper-plugin-utils@npm:7.25.9" - checksum: 10c0/483066a1ba36ff16c0116cd24f93de05de746a603a777cd695ac7a1b034928a65a4ecb35f255761ca56626435d7abdb73219eba196f9aa83b6c3c3169325599d + version: 7.26.5 + resolution: "@babel/helper-plugin-utils@npm:7.26.5" + checksum: 10c0/cdaba71d4b891aa6a8dfbe5bac2f94effb13e5fa4c2c487667fdbaa04eae059b78b28d85a885071f45f7205aeb56d16759e1bed9c118b94b16e4720ef1ab0f65 languageName: node linkType: hard @@ -161,24 +161,24 @@ __metadata: languageName: node linkType: hard -"@babel/helpers@npm:^7.26.0": - version: 7.26.0 - resolution: "@babel/helpers@npm:7.26.0" +"@babel/helpers@npm:^7.26.9": + version: 7.26.9 + resolution: "@babel/helpers@npm:7.26.9" dependencies: - "@babel/template": "npm:^7.25.9" - "@babel/types": "npm:^7.26.0" - checksum: 10c0/343333cced6946fe46617690a1d0789346960910225ce359021a88a60a65bc0d791f0c5d240c0ed46cf8cc63b5fd7df52734ff14e43b9c32feae2b61b1647097 + "@babel/template": "npm:^7.26.9" + "@babel/types": "npm:^7.26.9" + checksum: 10c0/3d4dbc4a33fe4181ed810cac52318b578294745ceaec07e2f6ecccf6cda55d25e4bfcea8f085f333bf911c9e1fc13320248dd1d5315ab47ad82ce1077410df05 languageName: node linkType: hard -"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.25.9, @babel/parser@npm:^7.26.0, @babel/parser@npm:^7.26.3": - version: 7.26.3 - resolution: "@babel/parser@npm:7.26.3" +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.26.9": + version: 7.26.9 + resolution: "@babel/parser@npm:7.26.9" dependencies: - "@babel/types": "npm:^7.26.3" + "@babel/types": "npm:^7.26.9" bin: parser: ./bin/babel-parser.js - checksum: 10c0/48f736374e61cfd10ddbf7b80678514ae1f16d0e88bc793d2b505d73d9b987ea786fc8c2f7ee8f8b8c467df062030eb07fd0eb2168f0f541ca1f542775852cad + checksum: 10c0/4b9ef3c9a0d4c328e5e5544f50fe8932c36f8a2c851e7f14a85401487cd3da75cad72c2e1bcec1eac55599a6bbb2fdc091f274c4fcafa6bdd112d4915ff087fc languageName: node linkType: hard @@ -370,47 +370,47 @@ __metadata: linkType: hard "@babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.25.6": - version: 7.26.0 - resolution: "@babel/runtime@npm:7.26.0" + version: 7.26.9 + resolution: "@babel/runtime@npm:7.26.9" dependencies: regenerator-runtime: "npm:^0.14.0" - checksum: 10c0/12c01357e0345f89f4f7e8c0e81921f2a3e3e101f06e8eaa18a382b517376520cd2fa8c237726eb094dab25532855df28a7baaf1c26342b52782f6936b07c287 + checksum: 10c0/e8517131110a6ec3a7360881438b85060e49824e007f4a64b5dfa9192cf2bb5c01e84bfc109f02d822c7edb0db926928dd6b991e3ee460b483fb0fac43152d9b languageName: node linkType: hard -"@babel/template@npm:^7.25.9, @babel/template@npm:^7.3.3": - version: 7.25.9 - resolution: "@babel/template@npm:7.25.9" - dependencies: - "@babel/code-frame": "npm:^7.25.9" - "@babel/parser": "npm:^7.25.9" - "@babel/types": "npm:^7.25.9" - checksum: 10c0/ebe677273f96a36c92cc15b7aa7b11cc8bc8a3bb7a01d55b2125baca8f19cae94ff3ce15f1b1880fb8437f3a690d9f89d4e91f16fc1dc4d3eb66226d128983ab - languageName: node - linkType: hard - -"@babel/traverse@npm:^7.25.9": - version: 7.26.4 - resolution: "@babel/traverse@npm:7.26.4" +"@babel/template@npm:^7.26.9, @babel/template@npm:^7.3.3": + version: 7.26.9 + resolution: "@babel/template@npm:7.26.9" dependencies: "@babel/code-frame": "npm:^7.26.2" - "@babel/generator": "npm:^7.26.3" - "@babel/parser": "npm:^7.26.3" - "@babel/template": "npm:^7.25.9" - "@babel/types": "npm:^7.26.3" - debug: "npm:^4.3.1" - globals: "npm:^11.1.0" - checksum: 10c0/cf25d0eda9505daa0f0832ad786b9e28c9d967e823aaf7fbe425250ab198c656085495aa6bed678b27929e095c84eea9fd778b851a31803da94c9bc4bf4eaef7 + "@babel/parser": "npm:^7.26.9" + "@babel/types": "npm:^7.26.9" + checksum: 10c0/019b1c4129cc01ad63e17529089c2c559c74709d225f595eee017af227fee11ae8a97a6ab19ae6768b8aa22d8d75dcb60a00b28f52e9fa78140672d928bc1ae9 languageName: node linkType: hard -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.25.9, @babel/types@npm:^7.26.0, @babel/types@npm:^7.26.3, @babel/types@npm:^7.3.3": - version: 7.26.3 - resolution: "@babel/types@npm:7.26.3" +"@babel/traverse@npm:^7.25.9, @babel/traverse@npm:^7.26.9": + version: 7.26.9 + resolution: "@babel/traverse@npm:7.26.9" + dependencies: + "@babel/code-frame": "npm:^7.26.2" + "@babel/generator": "npm:^7.26.9" + "@babel/parser": "npm:^7.26.9" + "@babel/template": "npm:^7.26.9" + "@babel/types": "npm:^7.26.9" + debug: "npm:^4.3.1" + globals: "npm:^11.1.0" + checksum: 10c0/51dd57fa39ea34d04816806bfead04c74f37301269d24c192d1406dc6e244fea99713b3b9c5f3e926d9ef6aa9cd5c062ad4f2fc1caa9cf843d5e864484ac955e + languageName: node + linkType: hard + +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.25.9, @babel/types@npm:^7.26.9, @babel/types@npm:^7.3.3": + version: 7.26.9 + resolution: "@babel/types@npm:7.26.9" dependencies: "@babel/helper-string-parser": "npm:^7.25.9" "@babel/helper-validator-identifier": "npm:^7.25.9" - checksum: 10c0/966c5242c5e55c8704bf7a7418e7be2703a0afa4d19a8480999d5a4ef13d095dd60686615fe5983cb7593b4b06ba3a7de8d6ca501c1d78bdd233a10d90be787b + checksum: 10c0/999c56269ba00e5c57aa711fbe7ff071cd6990bafd1b978341ea7572cc78919986e2aa6ee51dacf4b6a7a6fa63ba4eb3f1a03cf55eee31b896a56d068b895964 languageName: node linkType: hard @@ -431,29 +431,16 @@ __metadata: languageName: node linkType: hard -"@electron/asar@npm:^3.2.1": - version: 3.2.18 - resolution: "@electron/asar@npm:3.2.18" +"@electron/asar@npm:^3.2.1, @electron/asar@npm:^3.2.4": + version: 3.3.1 + resolution: "@electron/asar@npm:3.3.1" dependencies: commander: "npm:^5.0.0" glob: "npm:^7.1.6" minimatch: "npm:^3.0.4" bin: asar: bin/asar.js - checksum: 10c0/c124cb6d35740eb8efbcd9c2da3971833f63bbfd0cae66747b2d1ccedc88fc1fc667e2f6ce4362f9211d853af269b907b2d2eb9a04ed34565576f6c7f93281b2 - languageName: node - linkType: hard - -"@electron/asar@npm:^3.2.4": - version: 3.2.17 - resolution: "@electron/asar@npm:3.2.17" - dependencies: - commander: "npm:^5.0.0" - glob: "npm:^7.1.6" - minimatch: "npm:^3.0.4" - bin: - asar: bin/asar.js - checksum: 10c0/5dc29c6167951ca92ced43a99cdca15477bf6ee7ce72c5f0c6feb3f43f382ad2940fbde8d07071691e303fea6d1d6fcd5d3873a50375c828c18da54b28403fba + checksum: 10c0/3194709ba75e708887499c715fb10a7063c92cb1c19fc537432cb52a4d5c22cf1c8c08f68a606556cad5d81606cc281c8425347bca03de5a22cd3108c1e8c430 languageName: node linkType: hard @@ -631,30 +618,30 @@ __metadata: linkType: hard "@fastify/accept-negotiator@npm:^2.0.0": - version: 2.0.0 - resolution: "@fastify/accept-negotiator@npm:2.0.0" - checksum: 10c0/0f93498baa1fc86cea6a6ffd851f0ecf0dfecc89799abad92500102bcbcc57569bce32ef0908b0a8af14501387445e2f37aa559e06744f7069d876eb1a03d4c8 + version: 2.0.1 + resolution: "@fastify/accept-negotiator@npm:2.0.1" + checksum: 10c0/b68386f8b3b69c73f79a54983bd86afc752c4373897ec1ad798356a325a69224ebd003c1aa47e11fc40b46f23bf2384ebb3907fe44214af806cc8ff6af913f18 languageName: node linkType: hard "@fastify/ajv-compiler@npm:^4.0.0": - version: 4.0.1 - resolution: "@fastify/ajv-compiler@npm:4.0.1" + version: 4.0.2 + resolution: "@fastify/ajv-compiler@npm:4.0.2" dependencies: ajv: "npm:^8.12.0" ajv-formats: "npm:^3.0.1" fast-uri: "npm:^3.0.0" - checksum: 10c0/178d06e799e6ea19d4b579cc90e11ef50babda9fc2828d85edbd7b08aaa5a63dad2a42ba92e07e9c1e5da78e4382854bb1e99a6f2f5e61da67c670dc3572842e + checksum: 10c0/ca048db219cc958fb1b962f5dfc141f29e067ecb28a8dbe782bbef80ae3c920021468009cad613f0ed68db410890bb09c773ba2f33cb13e055b48c9c338bd8fa languageName: node linkType: hard "@fastify/cors@npm:^10.0.1": - version: 10.0.1 - resolution: "@fastify/cors@npm:10.0.1" + version: 10.1.0 + resolution: "@fastify/cors@npm:10.1.0" dependencies: fastify-plugin: "npm:^5.0.0" - mnemonist: "npm:0.39.8" - checksum: 10c0/95aec2445b25a7df09bab557800a07245b58a00661b693bb04b8083d4c66b48f11696ca334d1488cff6aebbf8cbe2ae09d462972ac12502ba49a360662a249ba + mnemonist: "npm:0.40.0" + checksum: 10c0/22db9e27fd45e4926cf8636a3a73c3989e1f385947097eed4ac6d021a8a878a3fb0da42b56259de1cd1c2a7f439978d5db9f436c8d8aa8d6630bbff3254e6c83 languageName: node linkType: hard @@ -666,11 +653,18 @@ __metadata: linkType: hard "@fastify/fast-json-stringify-compiler@npm:^5.0.0": - version: 5.0.1 - resolution: "@fastify/fast-json-stringify-compiler@npm:5.0.1" + version: 5.0.2 + resolution: "@fastify/fast-json-stringify-compiler@npm:5.0.2" dependencies: fast-json-stringify: "npm:^6.0.0" - checksum: 10c0/dc294c24684fe900b9190f3b4d8e52b6438bf9e737dbd2b3b202d906f71ef1fb406c031c40fc34f52c61f4f00e1a0d5753ce5a88064de371248fb4116c02066b + checksum: 10c0/835f91cdb4911bbf50884ce60fa6937564e50f81cb134e81e251344ad7ec022ac500a54843e5167819a214828a369c996e68fbd5347965d336908b44904812e3 + languageName: node + linkType: hard + +"@fastify/forwarded@npm:^3.0.0": + version: 3.0.0 + resolution: "@fastify/forwarded@npm:3.0.0" + checksum: 10c0/bd139ee46c193ed9e04af2539f31fcb9e542b91917820f6cf401d5715c4c8bcccaae4a148e0ca14eeddee077ad8a3ab73e6f0f1ad769aff861fcef5f0a28e0d2 languageName: node linkType: hard @@ -686,12 +680,22 @@ __metadata: languageName: node linkType: hard -"@fastify/merge-json-schemas@npm:^0.1.1": - version: 0.1.1 - resolution: "@fastify/merge-json-schemas@npm:0.1.1" +"@fastify/merge-json-schemas@npm:^0.2.0": + version: 0.2.1 + resolution: "@fastify/merge-json-schemas@npm:0.2.1" dependencies: - fast-deep-equal: "npm:^3.1.3" - checksum: 10c0/7979ce12724f7b98aea06f0bb9afb20dd869f0ff6fc697517135cbb54e0a36b062cbb38ec176fe43d1fc455576839240df8f33533939ace2d64a6218a6e6b9c1 + dequal: "npm:^2.0.3" + checksum: 10c0/dfa884a8f62d53f71de273fdcd0e501b213367767a7d8c522ae87ba6fb571b3eea85175d6e019036d7c0c5419be60305abe54899b9459f76ed5333358699efcb + languageName: node + linkType: hard + +"@fastify/proxy-addr@npm:^5.0.0": + version: 5.0.0 + resolution: "@fastify/proxy-addr@npm:5.0.0" + dependencies: + "@fastify/forwarded": "npm:^3.0.0" + ipaddr.js: "npm:^2.1.0" + checksum: 10c0/5a7d667480c3699015aa9bc12a47b6044106f412725d91a1b90f4a7845390c710486f05d322a895c633fb32a5ba1a17e598cb72e727337862034034443d59bcd languageName: node linkType: hard @@ -724,15 +728,15 @@ __metadata: linkType: hard "@fastify/send@npm:^3.2.0": - version: 3.3.0 - resolution: "@fastify/send@npm:3.3.0" + version: 3.3.1 + resolution: "@fastify/send@npm:3.3.1" dependencies: "@lukeed/ms": "npm:^2.0.2" escape-html: "npm:~1.0.3" fast-decode-uri-component: "npm:^1.0.1" http-errors: "npm:^2.0.0" mime: "npm:^3" - checksum: 10c0/70721db9349d34db5935914cc69308918d7409fe30fcf3ac7854289662453cedc8e836393a8aeecb435e71836198268136aa97178b9f659d225d52ca7a6accf7 + checksum: 10c0/bd7b9538217ad9e7ec702b9bbad2c3b985370023b03159cfec884184c5b2035ca69b56dc951530727166f85c52e46b76043639e1b320c0803778091342f2174f languageName: node linkType: hard @@ -751,8 +755,8 @@ __metadata: linkType: hard "@fastify/static@npm:^8.0.0": - version: 8.0.3 - resolution: "@fastify/static@npm:8.0.3" + version: 8.1.1 + resolution: "@fastify/static@npm:8.1.1" dependencies: "@fastify/accept-negotiator": "npm:^2.0.0" "@fastify/send": "npm:^3.2.0" @@ -760,7 +764,7 @@ __metadata: fastify-plugin: "npm:^5.0.0" fastq: "npm:^1.17.1" glob: "npm:^11.0.0" - checksum: 10c0/b6c21a1c1cf06c36fbcffce8a2d13dc346957116482754de471afa4b2aa0734fe28be3187b27d61ea29e95eb49e66cd87641b89039a8849ab0d461615bfd02db + checksum: 10c0/ff6c1f508db308b323813b5bdddab898b0d0b92b481e1ffcc34ae43143e20a6d7c0645043a03c5c7663005277e2a9519f21adb3cf5f73d962379b0d0fb075e3b languageName: node linkType: hard @@ -778,34 +782,34 @@ __metadata: linkType: hard "@fastify/swagger@npm:^9.4.0": - version: 9.4.0 - resolution: "@fastify/swagger@npm:9.4.0" + version: 9.4.2 + resolution: "@fastify/swagger@npm:9.4.2" dependencies: fastify-plugin: "npm:^5.0.0" - json-schema-resolver: "npm:^2.0.0" + json-schema-resolver: "npm:^3.0.0" openapi-types: "npm:^12.1.3" rfdc: "npm:^1.3.1" yaml: "npm:^2.4.2" - checksum: 10c0/10ac437aaacef4ef88f421caff02fe8a3e1cd503958baa5ef6671c273412f12a8cf8a595e4e0c36931214b8fc948a55c54c525a6cbe31e8e162e7e2adee6c478 + checksum: 10c0/a23c1ff72c2c7b3323ac11afbb80e5086cf8e284967bf75e8e95278a09c3bf176c2ceab2ff481d6bfc6aff1dfda26eba807dfe196fde19d9e4b8ed5baa03c584 languageName: node linkType: hard "@floating-ui/core@npm:^1.6.0": - version: 1.6.8 - resolution: "@floating-ui/core@npm:1.6.8" + version: 1.6.9 + resolution: "@floating-ui/core@npm:1.6.9" dependencies: - "@floating-ui/utils": "npm:^0.2.8" - checksum: 10c0/d6985462aeccae7b55a2d3f40571551c8c42bf820ae0a477fc40ef462e33edc4f3f5b7f11b100de77c9b58ecb581670c5c3f46d0af82b5e30aa185c735257eb9 + "@floating-ui/utils": "npm:^0.2.9" + checksum: 10c0/77debdfc26bc36c6f5ae1f26ab3c15468215738b3f5682af4e1915602fa21ba33ad210273f31c9d2da1c531409929e1afb1138b1608c6b54a0f5853ee84c340d languageName: node linkType: hard "@floating-ui/dom@npm:^1.0.0": - version: 1.6.12 - resolution: "@floating-ui/dom@npm:1.6.12" + version: 1.6.13 + resolution: "@floating-ui/dom@npm:1.6.13" dependencies: "@floating-ui/core": "npm:^1.6.0" - "@floating-ui/utils": "npm:^0.2.8" - checksum: 10c0/c67b39862175b175c6ac299ea970f17a22c7482cfdf3b1bc79313407bf0880188b022b878953fa69d3ce166ff2bd9ae57c86043e5dd800c262b470d877591b7d + "@floating-ui/utils": "npm:^0.2.9" + checksum: 10c0/272242d2eb6238ffcee0cb1f3c66e0eafae804d5d7b449db5ecf904bc37d31ad96cf575a9e650b93c1190f64f49a684b1559d10e05ed3ec210628b19116991a9 languageName: node linkType: hard @@ -821,10 +825,10 @@ __metadata: languageName: node linkType: hard -"@floating-ui/utils@npm:^0.2.8": - version: 0.2.8 - resolution: "@floating-ui/utils@npm:0.2.8" - checksum: 10c0/a8cee5f17406c900e1c3ef63e3ca89b35e7a2ed645418459a73627b93b7377477fc888081011c6cd177cac45ec2b92a6cab018c14ea140519465498dddd2d3f9 +"@floating-ui/utils@npm:^0.2.9": + version: 0.2.9 + resolution: "@floating-ui/utils@npm:0.2.9" + checksum: 10c0/48bbed10f91cb7863a796cc0d0e917c78d11aeb89f98d03fc38d79e7eb792224a79f538ed8a2d5d5584511d4ca6354ef35f1712659fd569868e342df4398ad6f languageName: node linkType: hard @@ -863,11 +867,11 @@ __metadata: linkType: hard "@hookform/resolvers@npm:^3.9.1": - version: 3.9.1 - resolution: "@hookform/resolvers@npm:3.9.1" + version: 3.10.0 + resolution: "@hookform/resolvers@npm:3.10.0" peerDependencies: react-hook-form: ^7.0.0 - checksum: 10c0/8a4056db3860b12ee30921ba352996104d6ae75ac45996d4c8b6df429e07ee73f5b87c82a22a15403789213f6f52f5fead1c2637b26ef624068b68d213362cd1 + checksum: 10c0/7ee44533b4cdc28c4fa2a94894c735411e5a1f830f4a617c580533321a9b901df0cc8c1e2fad81ad8d55154ebc5cb844cf9c116a3148ffae2bc48758c33cbb8e languageName: node linkType: hard @@ -1004,6 +1008,7 @@ __metadata: dependencies: "@radix-ui/react-accordion": "npm:^1.1.2" "@radix-ui/react-dialog": "npm:^1.0.5" + "@radix-ui/react-dropdown-menu": "npm:^2.1.4" "@radix-ui/react-icons": "npm:^1.3.0" "@radix-ui/react-scroll-area": "npm:^1.0.5" "@radix-ui/react-select": "npm:^2.0.0" @@ -1148,6 +1153,8 @@ __metadata: rehype-highlight: "npm:^7.0.1" rehype-highlight-code-lines: "npm:^1.0.4" rehype-katex: "npm:^7.0.1" + rehype-raw: "npm:^7.0.0" + remark-gfm: "npm:^4.0.0" remark-math: "npm:^6.0.0" rimraf: "npm:^5.0.5" sass: "npm:^1.69.4" @@ -1986,13 +1993,13 @@ __metadata: linkType: hard "@napi-rs/wasm-runtime@npm:^0.2.4": - version: 0.2.6 - resolution: "@napi-rs/wasm-runtime@npm:0.2.6" + version: 0.2.7 + resolution: "@napi-rs/wasm-runtime@npm:0.2.7" dependencies: "@emnapi/core": "npm:^1.3.1" "@emnapi/runtime": "npm:^1.3.1" "@tybys/wasm-util": "npm:^0.9.0" - checksum: 10c0/f921676c1d5c75494bd704c6c0837fd05fe95f5d1cb7373e32987ef5e00c3a1e90b5052352bd4b60ee20c3fe592af2dbba3b0de0c637218c25590828dbc4067e + checksum: 10c0/04a5edd79144bfa4e821a373fb6d4939f10c578c5f3633b5e67a57d0f5e36a593f595834d26654ea757bba7cd80b6c42d0d1405d6a8460c5d774e8cd5c9548a4 languageName: node linkType: hard @@ -2013,11 +2020,11 @@ __metadata: linkType: hard "@next/eslint-plugin-next@npm:^14.0.1": - version: 14.2.21 - resolution: "@next/eslint-plugin-next@npm:14.2.21" + version: 14.2.24 + resolution: "@next/eslint-plugin-next@npm:14.2.24" dependencies: glob: "npm:10.3.10" - checksum: 10c0/2270d990888236e83cc7adba8f5bba139381e0b4c62512d60d0ce8c382ec79bd5c030b0295c0b71737faa55261f4ac0e9f822969eb271a814ef8ba5feea9842c + checksum: 10c0/7330448737348c03f897e2e835be99eb43b03dd8354728615f0f64711410fd965fd45aa7cdc0eeec6fe526b464ba4cd786720e96038d6dbc99be24cd148630d2 languageName: node linkType: hard @@ -2232,19 +2239,18 @@ __metadata: linkType: hard "@npmcli/git@npm:^6.0.0": - version: 6.0.1 - resolution: "@npmcli/git@npm:6.0.1" + version: 6.0.3 + resolution: "@npmcli/git@npm:6.0.3" dependencies: "@npmcli/promise-spawn": "npm:^8.0.0" ini: "npm:^5.0.0" lru-cache: "npm:^10.0.1" npm-pick-manifest: "npm:^10.0.0" proc-log: "npm:^5.0.0" - promise-inflight: "npm:^1.0.1" promise-retry: "npm:^2.0.1" semver: "npm:^7.3.5" which: "npm:^5.0.0" - checksum: 10c0/00ab508fd860b4b9001d9a16a847c2544f0450efc1225cd85c18ddba3de9f6d328719ab28088e21ec445f585b8b79d0da1fb28afd3f64f3e7c86e1b5dad3a5a8 + checksum: 10c0/a8ff1d5f997f7bfdc149fbe7478017b100efe3d08bd566df6b5ac716fd630d2eff0f7feebc6705831a3a7072a67a955a339a8fea8551ce4faffafa9526306e05 languageName: node linkType: hard @@ -2334,17 +2340,17 @@ __metadata: linkType: hard "@npmcli/package-json@npm:^6.0.0": - version: 6.1.0 - resolution: "@npmcli/package-json@npm:6.1.0" + version: 6.1.1 + resolution: "@npmcli/package-json@npm:6.1.1" dependencies: "@npmcli/git": "npm:^6.0.0" glob: "npm:^10.2.2" hosted-git-info: "npm:^8.0.0" json-parse-even-better-errors: "npm:^4.0.0" - normalize-package-data: "npm:^7.0.0" proc-log: "npm:^5.0.0" semver: "npm:^7.5.3" - checksum: 10c0/95cc97f2382084e71a33d2739f0b1e659e32a8449d134d4264ecc2b5ada548069122d95887fe692373e2703b7a296a17e7296a4ce955dfa80c6ce3e00b5fab53 + validate-npm-package-license: "npm:^3.0.4" + checksum: 10c0/ec24e6dc4ade64de205f7964e325de31ee0c2dd7d70c2321a2b822481bf97505fffbe23ec05672fc61862ae68bbae3e9b44d4640439081dbc8f8b2dcdeda2aa3 languageName: node linkType: hard @@ -2383,9 +2389,9 @@ __metadata: linkType: hard "@npmcli/redact@npm:^3.0.0": - version: 3.0.0 - resolution: "@npmcli/redact@npm:3.0.0" - checksum: 10c0/34823f0d6a3301b310921b9f849f3c9814339bb9cde9555ddd1d51167c51e8b08ca40160eeb86b54041779805502e51251e0fbe0702fb7ab10173901e5d1d28c + version: 3.1.1 + resolution: "@npmcli/redact@npm:3.1.1" + checksum: 10c0/0653d1acbad34c78a372ac581429c3a257849bc761322cad088a202dc6639f5a61912cae0a678e2f53fdf5a4b6e9353cc2d528155d3cad2c7d5e89486aed081c languageName: node linkType: hard @@ -2417,114 +2423,114 @@ __metadata: languageName: node linkType: hard -"@parcel/watcher-android-arm64@npm:2.5.0": - version: 2.5.0 - resolution: "@parcel/watcher-android-arm64@npm:2.5.0" +"@parcel/watcher-android-arm64@npm:2.5.1": + version: 2.5.1 + resolution: "@parcel/watcher-android-arm64@npm:2.5.1" conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@parcel/watcher-darwin-arm64@npm:2.5.0": - version: 2.5.0 - resolution: "@parcel/watcher-darwin-arm64@npm:2.5.0" +"@parcel/watcher-darwin-arm64@npm:2.5.1": + version: 2.5.1 + resolution: "@parcel/watcher-darwin-arm64@npm:2.5.1" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@parcel/watcher-darwin-x64@npm:2.5.0": - version: 2.5.0 - resolution: "@parcel/watcher-darwin-x64@npm:2.5.0" +"@parcel/watcher-darwin-x64@npm:2.5.1": + version: 2.5.1 + resolution: "@parcel/watcher-darwin-x64@npm:2.5.1" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@parcel/watcher-freebsd-x64@npm:2.5.0": - version: 2.5.0 - resolution: "@parcel/watcher-freebsd-x64@npm:2.5.0" +"@parcel/watcher-freebsd-x64@npm:2.5.1": + version: 2.5.1 + resolution: "@parcel/watcher-freebsd-x64@npm:2.5.1" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"@parcel/watcher-linux-arm-glibc@npm:2.5.0": - version: 2.5.0 - resolution: "@parcel/watcher-linux-arm-glibc@npm:2.5.0" +"@parcel/watcher-linux-arm-glibc@npm:2.5.1": + version: 2.5.1 + resolution: "@parcel/watcher-linux-arm-glibc@npm:2.5.1" conditions: os=linux & cpu=arm & libc=glibc languageName: node linkType: hard -"@parcel/watcher-linux-arm-musl@npm:2.5.0": - version: 2.5.0 - resolution: "@parcel/watcher-linux-arm-musl@npm:2.5.0" +"@parcel/watcher-linux-arm-musl@npm:2.5.1": + version: 2.5.1 + resolution: "@parcel/watcher-linux-arm-musl@npm:2.5.1" conditions: os=linux & cpu=arm & libc=musl languageName: node linkType: hard -"@parcel/watcher-linux-arm64-glibc@npm:2.5.0": - version: 2.5.0 - resolution: "@parcel/watcher-linux-arm64-glibc@npm:2.5.0" +"@parcel/watcher-linux-arm64-glibc@npm:2.5.1": + version: 2.5.1 + resolution: "@parcel/watcher-linux-arm64-glibc@npm:2.5.1" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@parcel/watcher-linux-arm64-musl@npm:2.5.0": - version: 2.5.0 - resolution: "@parcel/watcher-linux-arm64-musl@npm:2.5.0" +"@parcel/watcher-linux-arm64-musl@npm:2.5.1": + version: 2.5.1 + resolution: "@parcel/watcher-linux-arm64-musl@npm:2.5.1" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@parcel/watcher-linux-x64-glibc@npm:2.5.0": - version: 2.5.0 - resolution: "@parcel/watcher-linux-x64-glibc@npm:2.5.0" +"@parcel/watcher-linux-x64-glibc@npm:2.5.1": + version: 2.5.1 + resolution: "@parcel/watcher-linux-x64-glibc@npm:2.5.1" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@parcel/watcher-linux-x64-musl@npm:2.5.0": - version: 2.5.0 - resolution: "@parcel/watcher-linux-x64-musl@npm:2.5.0" +"@parcel/watcher-linux-x64-musl@npm:2.5.1": + version: 2.5.1 + resolution: "@parcel/watcher-linux-x64-musl@npm:2.5.1" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@parcel/watcher-win32-arm64@npm:2.5.0": - version: 2.5.0 - resolution: "@parcel/watcher-win32-arm64@npm:2.5.0" +"@parcel/watcher-win32-arm64@npm:2.5.1": + version: 2.5.1 + resolution: "@parcel/watcher-win32-arm64@npm:2.5.1" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@parcel/watcher-win32-ia32@npm:2.5.0": - version: 2.5.0 - resolution: "@parcel/watcher-win32-ia32@npm:2.5.0" +"@parcel/watcher-win32-ia32@npm:2.5.1": + version: 2.5.1 + resolution: "@parcel/watcher-win32-ia32@npm:2.5.1" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@parcel/watcher-win32-x64@npm:2.5.0": - version: 2.5.0 - resolution: "@parcel/watcher-win32-x64@npm:2.5.0" +"@parcel/watcher-win32-x64@npm:2.5.1": + version: 2.5.1 + resolution: "@parcel/watcher-win32-x64@npm:2.5.1" conditions: os=win32 & cpu=x64 languageName: node linkType: hard "@parcel/watcher@npm:^2.4.1": - version: 2.5.0 - resolution: "@parcel/watcher@npm:2.5.0" + version: 2.5.1 + resolution: "@parcel/watcher@npm:2.5.1" dependencies: - "@parcel/watcher-android-arm64": "npm:2.5.0" - "@parcel/watcher-darwin-arm64": "npm:2.5.0" - "@parcel/watcher-darwin-x64": "npm:2.5.0" - "@parcel/watcher-freebsd-x64": "npm:2.5.0" - "@parcel/watcher-linux-arm-glibc": "npm:2.5.0" - "@parcel/watcher-linux-arm-musl": "npm:2.5.0" - "@parcel/watcher-linux-arm64-glibc": "npm:2.5.0" - "@parcel/watcher-linux-arm64-musl": "npm:2.5.0" - "@parcel/watcher-linux-x64-glibc": "npm:2.5.0" - "@parcel/watcher-linux-x64-musl": "npm:2.5.0" - "@parcel/watcher-win32-arm64": "npm:2.5.0" - "@parcel/watcher-win32-ia32": "npm:2.5.0" - "@parcel/watcher-win32-x64": "npm:2.5.0" + "@parcel/watcher-android-arm64": "npm:2.5.1" + "@parcel/watcher-darwin-arm64": "npm:2.5.1" + "@parcel/watcher-darwin-x64": "npm:2.5.1" + "@parcel/watcher-freebsd-x64": "npm:2.5.1" + "@parcel/watcher-linux-arm-glibc": "npm:2.5.1" + "@parcel/watcher-linux-arm-musl": "npm:2.5.1" + "@parcel/watcher-linux-arm64-glibc": "npm:2.5.1" + "@parcel/watcher-linux-arm64-musl": "npm:2.5.1" + "@parcel/watcher-linux-x64-glibc": "npm:2.5.1" + "@parcel/watcher-linux-x64-musl": "npm:2.5.1" + "@parcel/watcher-win32-arm64": "npm:2.5.1" + "@parcel/watcher-win32-ia32": "npm:2.5.1" + "@parcel/watcher-win32-x64": "npm:2.5.1" detect-libc: "npm:^1.0.3" is-glob: "npm:^4.0.3" micromatch: "npm:^4.0.5" @@ -2557,7 +2563,7 @@ __metadata: optional: true "@parcel/watcher-win32-x64": optional: true - checksum: 10c0/9bad727d8b11e5d150ec47459254544c583adaa47d047b8ef65e1c74aede1a0767dc7fc6b8997649dae07318d6ef39caba6a1c405d306398d5bcd47074ec5d29 + checksum: 10c0/8f35073d0c0b34a63d4c8d2213482f0ebc6a25de7b2cdd415d19cb929964a793cb285b68d1d50bfb732b070b3c82a2fdb4eb9c250eab709a1cd9d63345455a82 languageName: node linkType: hard @@ -2576,13 +2582,13 @@ __metadata: linkType: hard "@playwright/test@npm:^1.38.1": - version: 1.49.1 - resolution: "@playwright/test@npm:1.49.1" + version: 1.50.1 + resolution: "@playwright/test@npm:1.50.1" dependencies: - playwright: "npm:1.49.1" + playwright: "npm:1.50.1" bin: playwright: cli.js - checksum: 10c0/2fca0bb7b334f7a23c7c5dfa5dbe37b47794c56f39b747c8d74a2f95c339e7902a296f2f1dd32c47bdd723cfa92cee05219f1a5876725dc89a1871b9137a286d + checksum: 10c0/77c1a7cfaca7b3b88804256bb4c0e15c54b8df02690298086ef4a4fc8c2a42b99b69ba1b83906d00cc7ddb322ce8b2f19f0238f189913607c679779a4d132da1 languageName: node linkType: hard @@ -2601,17 +2607,17 @@ __metadata: linkType: hard "@radix-ui/react-accordion@npm:^1.1.2": - version: 1.2.2 - resolution: "@radix-ui/react-accordion@npm:1.2.2" + version: 1.2.3 + resolution: "@radix-ui/react-accordion@npm:1.2.3" dependencies: "@radix-ui/primitive": "npm:1.1.1" - "@radix-ui/react-collapsible": "npm:1.1.2" - "@radix-ui/react-collection": "npm:1.1.1" + "@radix-ui/react-collapsible": "npm:1.1.3" + "@radix-ui/react-collection": "npm:1.1.2" "@radix-ui/react-compose-refs": "npm:1.1.1" "@radix-ui/react-context": "npm:1.1.1" "@radix-ui/react-direction": "npm:1.1.0" "@radix-ui/react-id": "npm:1.1.0" - "@radix-ui/react-primitive": "npm:2.0.1" + "@radix-ui/react-primitive": "npm:2.0.2" "@radix-ui/react-use-controllable-state": "npm:1.1.0" peerDependencies: "@types/react": "*" @@ -2623,15 +2629,15 @@ __metadata: optional: true "@types/react-dom": optional: true - checksum: 10c0/2279c24de3296714ad14e0b83e7ea55f1b0d1585650b48ddb9295a44e6f0ab4e860526e9263c8f18cbdfa702648644d1bfa50f18c22e6f9de303b4b19ebef63a + checksum: 10c0/2036497884696453a888433dff87eda35ad72859d04205b5aef74aa72df8ca07557eafcc56a4e204a3f755d6f8895927b59453643be9542049d8ad2a969b7a9a languageName: node linkType: hard -"@radix-ui/react-arrow@npm:1.1.1": - version: 1.1.1 - resolution: "@radix-ui/react-arrow@npm:1.1.1" +"@radix-ui/react-arrow@npm:1.1.2": + version: 1.1.2 + resolution: "@radix-ui/react-arrow@npm:1.1.2" dependencies: - "@radix-ui/react-primitive": "npm:2.0.1" + "@radix-ui/react-primitive": "npm:2.0.2" peerDependencies: "@types/react": "*" "@types/react-dom": "*" @@ -2642,20 +2648,20 @@ __metadata: optional: true "@types/react-dom": optional: true - checksum: 10c0/714c8420ee4497775a1119ceba1391a9e4fed07185ba903ade571251400fd25cedb7bebf2292ce778e74956dfa079078b2afbb67d12001c6ea5080997bcf3612 + checksum: 10c0/38e1a338da1131f325e417ac456b1b6c16c76aa9da0635916262b4682d4e648226fd37b23348964a8e909c98b4d2293c7c5789be8f243cfe03856e6f0765cf5d languageName: node linkType: hard -"@radix-ui/react-collapsible@npm:1.1.2": - version: 1.1.2 - resolution: "@radix-ui/react-collapsible@npm:1.1.2" +"@radix-ui/react-collapsible@npm:1.1.3": + version: 1.1.3 + resolution: "@radix-ui/react-collapsible@npm:1.1.3" dependencies: "@radix-ui/primitive": "npm:1.1.1" "@radix-ui/react-compose-refs": "npm:1.1.1" "@radix-ui/react-context": "npm:1.1.1" "@radix-ui/react-id": "npm:1.1.0" "@radix-ui/react-presence": "npm:1.1.2" - "@radix-ui/react-primitive": "npm:2.0.1" + "@radix-ui/react-primitive": "npm:2.0.2" "@radix-ui/react-use-controllable-state": "npm:1.1.0" "@radix-ui/react-use-layout-effect": "npm:1.1.0" peerDependencies: @@ -2668,18 +2674,18 @@ __metadata: optional: true "@types/react-dom": optional: true - checksum: 10c0/8a725539c0c259ea53a0e35d4ddd3acca42cab5113fd537758450ad1e76f0b757423f18aca29364f963bef4f0624d57feb32bf9d12a3ea6b2c084b523ba65205 + checksum: 10c0/93511dd4406af8f47a9b1b289cb70bfe907e9e4460946a0fa64224058aee663b52137dc249af4c3b024538cb20c463ec1412499adbbdf44ed913f0eb6dea049c languageName: node linkType: hard -"@radix-ui/react-collection@npm:1.1.1": - version: 1.1.1 - resolution: "@radix-ui/react-collection@npm:1.1.1" +"@radix-ui/react-collection@npm:1.1.2": + version: 1.1.2 + resolution: "@radix-ui/react-collection@npm:1.1.2" dependencies: "@radix-ui/react-compose-refs": "npm:1.1.1" "@radix-ui/react-context": "npm:1.1.1" - "@radix-ui/react-primitive": "npm:2.0.1" - "@radix-ui/react-slot": "npm:1.1.1" + "@radix-ui/react-primitive": "npm:2.0.2" + "@radix-ui/react-slot": "npm:1.1.2" peerDependencies: "@types/react": "*" "@types/react-dom": "*" @@ -2690,7 +2696,7 @@ __metadata: optional: true "@types/react-dom": optional: true - checksum: 10c0/f01bba02e11944fa98f588a0c8dc7657228c9e7dd32ef66acdec6a540385c1e9471ef9e7dfa6184b524fdf923cf5a08892ffda3fe6d60cee34c690d9914373ce + checksum: 10c0/8376aa0c0f38efbb45e5c0a2e8724b0ca2ccdab511f5aee4c3eb62a89959b20be0d4dd410b7068bc13d722751cbc88e916e10573784fb26b084c43f930818715 languageName: node linkType: hard @@ -2721,23 +2727,23 @@ __metadata: linkType: hard "@radix-ui/react-dialog@npm:^1.0.5": - version: 1.1.4 - resolution: "@radix-ui/react-dialog@npm:1.1.4" + version: 1.1.6 + resolution: "@radix-ui/react-dialog@npm:1.1.6" dependencies: "@radix-ui/primitive": "npm:1.1.1" "@radix-ui/react-compose-refs": "npm:1.1.1" "@radix-ui/react-context": "npm:1.1.1" - "@radix-ui/react-dismissable-layer": "npm:1.1.3" + "@radix-ui/react-dismissable-layer": "npm:1.1.5" "@radix-ui/react-focus-guards": "npm:1.1.1" - "@radix-ui/react-focus-scope": "npm:1.1.1" + "@radix-ui/react-focus-scope": "npm:1.1.2" "@radix-ui/react-id": "npm:1.1.0" - "@radix-ui/react-portal": "npm:1.1.3" + "@radix-ui/react-portal": "npm:1.1.4" "@radix-ui/react-presence": "npm:1.1.2" - "@radix-ui/react-primitive": "npm:2.0.1" - "@radix-ui/react-slot": "npm:1.1.1" + "@radix-ui/react-primitive": "npm:2.0.2" + "@radix-ui/react-slot": "npm:1.1.2" "@radix-ui/react-use-controllable-state": "npm:1.1.0" - aria-hidden: "npm:^1.1.1" - react-remove-scroll: "npm:^2.6.1" + aria-hidden: "npm:^1.2.4" + react-remove-scroll: "npm:^2.6.3" peerDependencies: "@types/react": "*" "@types/react-dom": "*" @@ -2748,7 +2754,7 @@ __metadata: optional: true "@types/react-dom": optional: true - checksum: 10c0/d0ac8d85869b0d5a51823eb66503e41bab543807aa8702a2f1b2d5f720b1a2e4e9d0d83ca744aae06c6942a8759a1cd12bfa9b715d492868548254784969f78d + checksum: 10c0/98e425549573c5d6fb0fee94ecd40427a8b8897bb2d9bb2a44fe64e484754376ff23b64fcf64e061d42fc774b9627a28cb5b1bb5652e567908dac9a8d8618705 languageName: node linkType: hard @@ -2765,13 +2771,13 @@ __metadata: languageName: node linkType: hard -"@radix-ui/react-dismissable-layer@npm:1.1.3": - version: 1.1.3 - resolution: "@radix-ui/react-dismissable-layer@npm:1.1.3" +"@radix-ui/react-dismissable-layer@npm:1.1.5": + version: 1.1.5 + resolution: "@radix-ui/react-dismissable-layer@npm:1.1.5" dependencies: "@radix-ui/primitive": "npm:1.1.1" "@radix-ui/react-compose-refs": "npm:1.1.1" - "@radix-ui/react-primitive": "npm:2.0.1" + "@radix-ui/react-primitive": "npm:2.0.2" "@radix-ui/react-use-callback-ref": "npm:1.1.0" "@radix-ui/react-use-escape-keydown": "npm:1.1.0" peerDependencies: @@ -2784,7 +2790,32 @@ __metadata: optional: true "@types/react-dom": optional: true - checksum: 10c0/1ab2ebddf3d450bf4efb1e846894824a0056d3fa3deec0858206bc7547857fe5fe37e42f0a34918072702ead6dedc388a5770c060b2596cd408e20db86c54253 + checksum: 10c0/05c5adfcd42a736c456f50bdca25bf7f6b25eef7328e4c05de535fea128328666433a89d68cb1445e039c188d7f1397df6a4a02e2da0970762f2a80fd29b48ea + languageName: node + linkType: hard + +"@radix-ui/react-dropdown-menu@npm:^2.1.4": + version: 2.1.6 + resolution: "@radix-ui/react-dropdown-menu@npm:2.1.6" + dependencies: + "@radix-ui/primitive": "npm:1.1.1" + "@radix-ui/react-compose-refs": "npm:1.1.1" + "@radix-ui/react-context": "npm:1.1.1" + "@radix-ui/react-id": "npm:1.1.0" + "@radix-ui/react-menu": "npm:2.1.6" + "@radix-ui/react-primitive": "npm:2.0.2" + "@radix-ui/react-use-controllable-state": "npm:1.1.0" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/1165cc6a7c914b4491f83b7ff2bd84e5c52016f5ee48ae9b841482ed09b349adb294a8269cc69ba5a20fee75400b521843130a490da7e81c39361f63092266ba languageName: node linkType: hard @@ -2801,12 +2832,12 @@ __metadata: languageName: node linkType: hard -"@radix-ui/react-focus-scope@npm:1.1.1": - version: 1.1.1 - resolution: "@radix-ui/react-focus-scope@npm:1.1.1" +"@radix-ui/react-focus-scope@npm:1.1.2": + version: 1.1.2 + resolution: "@radix-ui/react-focus-scope@npm:1.1.2" dependencies: "@radix-ui/react-compose-refs": "npm:1.1.1" - "@radix-ui/react-primitive": "npm:2.0.1" + "@radix-ui/react-primitive": "npm:2.0.2" "@radix-ui/react-use-callback-ref": "npm:1.1.0" peerDependencies: "@types/react": "*" @@ -2818,7 +2849,7 @@ __metadata: optional: true "@types/react-dom": optional: true - checksum: 10c0/a430264a32e358c05dfa1c3abcf6c3d0481cbcbb2547532324c6d69fa7f9e3ed77b5eb2dd64d42808ec62c8d69abb573d6076907764af126d14ea18febf45d7b + checksum: 10c0/7b93866a9980bc938fc3fcfacfc49467c13144931c9b7a3b5423c0c3817685dc421499d73f58335f6c3c1c0f4fea9c9b7c16aa06a1d30571620787086082bea0 languageName: node linkType: hard @@ -2846,15 +2877,51 @@ __metadata: languageName: node linkType: hard -"@radix-ui/react-popper@npm:1.2.1": - version: 1.2.1 - resolution: "@radix-ui/react-popper@npm:1.2.1" +"@radix-ui/react-menu@npm:2.1.6": + version: 2.1.6 + resolution: "@radix-ui/react-menu@npm:2.1.6" dependencies: - "@floating-ui/react-dom": "npm:^2.0.0" - "@radix-ui/react-arrow": "npm:1.1.1" + "@radix-ui/primitive": "npm:1.1.1" + "@radix-ui/react-collection": "npm:1.1.2" "@radix-ui/react-compose-refs": "npm:1.1.1" "@radix-ui/react-context": "npm:1.1.1" - "@radix-ui/react-primitive": "npm:2.0.1" + "@radix-ui/react-direction": "npm:1.1.0" + "@radix-ui/react-dismissable-layer": "npm:1.1.5" + "@radix-ui/react-focus-guards": "npm:1.1.1" + "@radix-ui/react-focus-scope": "npm:1.1.2" + "@radix-ui/react-id": "npm:1.1.0" + "@radix-ui/react-popper": "npm:1.2.2" + "@radix-ui/react-portal": "npm:1.1.4" + "@radix-ui/react-presence": "npm:1.1.2" + "@radix-ui/react-primitive": "npm:2.0.2" + "@radix-ui/react-roving-focus": "npm:1.1.2" + "@radix-ui/react-slot": "npm:1.1.2" + "@radix-ui/react-use-callback-ref": "npm:1.1.0" + aria-hidden: "npm:^1.2.4" + react-remove-scroll: "npm:^2.6.3" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/0b5420f181e38ec146572f56ebe51a4e7f28663939f8149a246f5d319b79633574fa35a3f3c7c85deb44a6fe31d94af62a34407b1a8e97c1eae99cfca5db40ed + languageName: node + linkType: hard + +"@radix-ui/react-popper@npm:1.2.2": + version: 1.2.2 + resolution: "@radix-ui/react-popper@npm:1.2.2" + dependencies: + "@floating-ui/react-dom": "npm:^2.0.0" + "@radix-ui/react-arrow": "npm:1.1.2" + "@radix-ui/react-compose-refs": "npm:1.1.1" + "@radix-ui/react-context": "npm:1.1.1" + "@radix-ui/react-primitive": "npm:2.0.2" "@radix-ui/react-use-callback-ref": "npm:1.1.0" "@radix-ui/react-use-layout-effect": "npm:1.1.0" "@radix-ui/react-use-rect": "npm:1.1.0" @@ -2870,15 +2937,15 @@ __metadata: optional: true "@types/react-dom": optional: true - checksum: 10c0/514468b51e66ff2da3400fa782f4b52f9bad60517e3047cccf56488aa17a3c3f62ff2650b0216be31345dc3be6035999c7160788c92e35c7f8d53ddde2fb92f1 + checksum: 10c0/556cef98c0fe50bcfaaa4ae2e85af737755c884b78a04b6bdac3682829051ea0a4cf1163fc8bde782e33280613424e2ebb10b8af507da53e1aea08966c13cc86 languageName: node linkType: hard -"@radix-ui/react-portal@npm:1.1.3": - version: 1.1.3 - resolution: "@radix-ui/react-portal@npm:1.1.3" +"@radix-ui/react-portal@npm:1.1.4": + version: 1.1.4 + resolution: "@radix-ui/react-portal@npm:1.1.4" dependencies: - "@radix-ui/react-primitive": "npm:2.0.1" + "@radix-ui/react-primitive": "npm:2.0.2" "@radix-ui/react-use-layout-effect": "npm:1.1.0" peerDependencies: "@types/react": "*" @@ -2890,7 +2957,7 @@ __metadata: optional: true "@types/react-dom": optional: true - checksum: 10c0/b3cd1a81513e528d261599cffda8d7d6094a8598750eaa32bac0d64dbc9a3b4d4e1c10f5bdadf7051b5fd77033b759dbeb4838dae325b94bf8251804c61508c5 + checksum: 10c0/e4038eb2f20be10d9754d099d00620f429711919d20c4c630946d9c4941f1c83ef1a3f4110c221c70486e65bc565ebba4ada22a0e7e2d179c039f2a014300793 languageName: node linkType: hard @@ -2914,11 +2981,11 @@ __metadata: languageName: node linkType: hard -"@radix-ui/react-primitive@npm:2.0.1": - version: 2.0.1 - resolution: "@radix-ui/react-primitive@npm:2.0.1" +"@radix-ui/react-primitive@npm:2.0.2": + version: 2.0.2 + resolution: "@radix-ui/react-primitive@npm:2.0.2" dependencies: - "@radix-ui/react-slot": "npm:1.1.1" + "@radix-ui/react-slot": "npm:1.1.2" peerDependencies: "@types/react": "*" "@types/react-dom": "*" @@ -2929,21 +2996,21 @@ __metadata: optional: true "@types/react-dom": optional: true - checksum: 10c0/6a562bec14f8e9fbfe0012d6c2932b0e54518fed898fa0622300c463611e77a4ca28a969f0cd484efd6570c01c5665dd6151f736262317d01715bc4da1a7dea6 + checksum: 10c0/1af7a33a86f8bd2467f2300b1bb6ca9af67cae3950953ba543d2a625c17f341dff05d19056ece7b03e5ced8b9f8de99c74f806710ce0da6b9a000f2af063fffe languageName: node linkType: hard -"@radix-ui/react-roving-focus@npm:1.1.1": - version: 1.1.1 - resolution: "@radix-ui/react-roving-focus@npm:1.1.1" +"@radix-ui/react-roving-focus@npm:1.1.2": + version: 1.1.2 + resolution: "@radix-ui/react-roving-focus@npm:1.1.2" dependencies: "@radix-ui/primitive": "npm:1.1.1" - "@radix-ui/react-collection": "npm:1.1.1" + "@radix-ui/react-collection": "npm:1.1.2" "@radix-ui/react-compose-refs": "npm:1.1.1" "@radix-ui/react-context": "npm:1.1.1" "@radix-ui/react-direction": "npm:1.1.0" "@radix-ui/react-id": "npm:1.1.0" - "@radix-ui/react-primitive": "npm:2.0.1" + "@radix-ui/react-primitive": "npm:2.0.2" "@radix-ui/react-use-callback-ref": "npm:1.1.0" "@radix-ui/react-use-controllable-state": "npm:1.1.0" peerDependencies: @@ -2956,13 +3023,13 @@ __metadata: optional: true "@types/react-dom": optional: true - checksum: 10c0/ee41eb60b0c300ef3bb130f7ca6c7333148669f2a50b841027910158c06be215967880da932ac14b83d130a9ca5ffb33d6a1a0f067d5048f8db2c3884bbd9b85 + checksum: 10c0/80e378e1156d5b8af14995e908fe2358c8f4757fbf274e30d2ee3c1cedc3a0c7192524df7e3bb1d5011ee9ab8ab7445b60eff06617370e58abcd1ae97e0e40f6 languageName: node linkType: hard "@radix-ui/react-scroll-area@npm:^1.0.5": - version: 1.2.2 - resolution: "@radix-ui/react-scroll-area@npm:1.2.2" + version: 1.2.3 + resolution: "@radix-ui/react-scroll-area@npm:1.2.3" dependencies: "@radix-ui/number": "npm:1.1.0" "@radix-ui/primitive": "npm:1.1.1" @@ -2970,7 +3037,7 @@ __metadata: "@radix-ui/react-context": "npm:1.1.1" "@radix-ui/react-direction": "npm:1.1.0" "@radix-ui/react-presence": "npm:1.1.2" - "@radix-ui/react-primitive": "npm:2.0.1" + "@radix-ui/react-primitive": "npm:2.0.2" "@radix-ui/react-use-callback-ref": "npm:1.1.0" "@radix-ui/react-use-layout-effect": "npm:1.1.0" peerDependencies: @@ -2983,35 +3050,35 @@ __metadata: optional: true "@types/react-dom": optional: true - checksum: 10c0/a959c199780d5ef931a4bc9323a009dff8207ccb21ea42131e259cd32fdea035ccddca7f161e3ac1eb93691644b39a6a274329637234d525c2543ceb299493fb + checksum: 10c0/029b95f0e89cb1ef8b04a237784894587baed87c6e7b57088101820cfaf5d12987a6671a76a6d7d8054a42cbd738b3c44ae110b55b990b144696e2971571bf4b languageName: node linkType: hard "@radix-ui/react-select@npm:^2.0.0": - version: 2.1.4 - resolution: "@radix-ui/react-select@npm:2.1.4" + version: 2.1.6 + resolution: "@radix-ui/react-select@npm:2.1.6" dependencies: "@radix-ui/number": "npm:1.1.0" "@radix-ui/primitive": "npm:1.1.1" - "@radix-ui/react-collection": "npm:1.1.1" + "@radix-ui/react-collection": "npm:1.1.2" "@radix-ui/react-compose-refs": "npm:1.1.1" "@radix-ui/react-context": "npm:1.1.1" "@radix-ui/react-direction": "npm:1.1.0" - "@radix-ui/react-dismissable-layer": "npm:1.1.3" + "@radix-ui/react-dismissable-layer": "npm:1.1.5" "@radix-ui/react-focus-guards": "npm:1.1.1" - "@radix-ui/react-focus-scope": "npm:1.1.1" + "@radix-ui/react-focus-scope": "npm:1.1.2" "@radix-ui/react-id": "npm:1.1.0" - "@radix-ui/react-popper": "npm:1.2.1" - "@radix-ui/react-portal": "npm:1.1.3" - "@radix-ui/react-primitive": "npm:2.0.1" - "@radix-ui/react-slot": "npm:1.1.1" + "@radix-ui/react-popper": "npm:1.2.2" + "@radix-ui/react-portal": "npm:1.1.4" + "@radix-ui/react-primitive": "npm:2.0.2" + "@radix-ui/react-slot": "npm:1.1.2" "@radix-ui/react-use-callback-ref": "npm:1.1.0" "@radix-ui/react-use-controllable-state": "npm:1.1.0" "@radix-ui/react-use-layout-effect": "npm:1.1.0" "@radix-ui/react-use-previous": "npm:1.1.0" - "@radix-ui/react-visually-hidden": "npm:1.1.1" - aria-hidden: "npm:^1.1.1" - react-remove-scroll: "npm:^2.6.1" + "@radix-ui/react-visually-hidden": "npm:1.1.2" + aria-hidden: "npm:^1.2.4" + react-remove-scroll: "npm:^2.6.3" peerDependencies: "@types/react": "*" "@types/react-dom": "*" @@ -3022,21 +3089,21 @@ __metadata: optional: true "@types/react-dom": optional: true - checksum: 10c0/c6b70b5340472384b95b94379474b8a68f81dda6b5774cbb153c2930158869620546126b90620f33efdb04d3cc3bde025571f0ddb8f3e79ac8ba6aa40d2b2cc8 + checksum: 10c0/bc953806b861c66f01371502ac7404e1e3c783290e979f9446e89b643bff7f90164ce91126f719e5aec4d9601b9ad0e4e7b7e747bfc0fbfcf7a31aeeac0a484d languageName: node linkType: hard "@radix-ui/react-slider@npm:^1.1.2": - version: 1.2.2 - resolution: "@radix-ui/react-slider@npm:1.2.2" + version: 1.2.3 + resolution: "@radix-ui/react-slider@npm:1.2.3" dependencies: "@radix-ui/number": "npm:1.1.0" "@radix-ui/primitive": "npm:1.1.1" - "@radix-ui/react-collection": "npm:1.1.1" + "@radix-ui/react-collection": "npm:1.1.2" "@radix-ui/react-compose-refs": "npm:1.1.1" "@radix-ui/react-context": "npm:1.1.1" "@radix-ui/react-direction": "npm:1.1.0" - "@radix-ui/react-primitive": "npm:2.0.1" + "@radix-ui/react-primitive": "npm:2.0.2" "@radix-ui/react-use-controllable-state": "npm:1.1.0" "@radix-ui/react-use-layout-effect": "npm:1.1.0" "@radix-ui/react-use-previous": "npm:1.1.0" @@ -3051,13 +3118,13 @@ __metadata: optional: true "@types/react-dom": optional: true - checksum: 10c0/cd57454a20739523cba8762a6cc0a5beeaa1393e7aed5cb00ce1fdaa5b821c710865d2e746a639feac69025a4e02ff0b211cf515b02bfcf37dc9b633aa63ed70 + checksum: 10c0/d1b3b193e3a290e734d911d99ddc2d8857c21cd1bebd3c6607c5e034c02e410b77be9d836479de2240c283cd9e2017ac6f5c5fec37f9b3c64e1abe46581327d1 languageName: node linkType: hard -"@radix-ui/react-slot@npm:1.1.1, @radix-ui/react-slot@npm:^1.0.2": - version: 1.1.1 - resolution: "@radix-ui/react-slot@npm:1.1.1" +"@radix-ui/react-slot@npm:1.1.2, @radix-ui/react-slot@npm:^1.0.2": + version: 1.1.2 + resolution: "@radix-ui/react-slot@npm:1.1.2" dependencies: "@radix-ui/react-compose-refs": "npm:1.1.1" peerDependencies: @@ -3066,21 +3133,21 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 10c0/f3cc71c16529c67a8407a89e0ac13a868cafa0cd05ca185b464db609aa5996a3f00588695518e420bd47ffdb4cc2f76c14cc12ea5a38fc2ca3578a30d2ca58b9 + checksum: 10c0/81d45091806c52b507cec80b4477e4f31189d76ffcd7845b382eb3a034e6cf1faef71b881612028d5893f7580bf9ab59daa18fbf2792042dccd755c99a18df67 languageName: node linkType: hard "@radix-ui/react-tabs@npm:^1.0.4": - version: 1.1.2 - resolution: "@radix-ui/react-tabs@npm:1.1.2" + version: 1.1.3 + resolution: "@radix-ui/react-tabs@npm:1.1.3" dependencies: "@radix-ui/primitive": "npm:1.1.1" "@radix-ui/react-context": "npm:1.1.1" "@radix-ui/react-direction": "npm:1.1.0" "@radix-ui/react-id": "npm:1.1.0" "@radix-ui/react-presence": "npm:1.1.2" - "@radix-ui/react-primitive": "npm:2.0.1" - "@radix-ui/react-roving-focus": "npm:1.1.1" + "@radix-ui/react-primitive": "npm:2.0.2" + "@radix-ui/react-roving-focus": "npm:1.1.2" "@radix-ui/react-use-controllable-state": "npm:1.1.0" peerDependencies: "@types/react": "*" @@ -3092,26 +3159,26 @@ __metadata: optional: true "@types/react-dom": optional: true - checksum: 10c0/035db9d439d41e60218ea64c8c4cf4a8496eb885aa1caa3cace545a941766dbab7faa1a670ffb49389c55345028203927b424b8cbaa8f2f0cd0cda9974c2fcc6 + checksum: 10c0/2f621c43a8e1dd0d54c828f8b4d88414c9114af6b720a650ad9587cc0a7a7536da778f2fe5181a38494cc2956f2b238fbe64790f6daad1d058b34f4acaee520e languageName: node linkType: hard "@radix-ui/react-tooltip@npm:^1.0.7": - version: 1.1.6 - resolution: "@radix-ui/react-tooltip@npm:1.1.6" + version: 1.1.8 + resolution: "@radix-ui/react-tooltip@npm:1.1.8" dependencies: "@radix-ui/primitive": "npm:1.1.1" "@radix-ui/react-compose-refs": "npm:1.1.1" "@radix-ui/react-context": "npm:1.1.1" - "@radix-ui/react-dismissable-layer": "npm:1.1.3" + "@radix-ui/react-dismissable-layer": "npm:1.1.5" "@radix-ui/react-id": "npm:1.1.0" - "@radix-ui/react-popper": "npm:1.2.1" - "@radix-ui/react-portal": "npm:1.1.3" + "@radix-ui/react-popper": "npm:1.2.2" + "@radix-ui/react-portal": "npm:1.1.4" "@radix-ui/react-presence": "npm:1.1.2" - "@radix-ui/react-primitive": "npm:2.0.1" - "@radix-ui/react-slot": "npm:1.1.1" + "@radix-ui/react-primitive": "npm:2.0.2" + "@radix-ui/react-slot": "npm:1.1.2" "@radix-ui/react-use-controllable-state": "npm:1.1.0" - "@radix-ui/react-visually-hidden": "npm:1.1.1" + "@radix-ui/react-visually-hidden": "npm:1.1.2" peerDependencies: "@types/react": "*" "@types/react-dom": "*" @@ -3122,7 +3189,7 @@ __metadata: optional: true "@types/react-dom": optional: true - checksum: 10c0/6e2e83b2ef448bcc486e8f73bfd303b18b723f86239f40f5e06cf930f074494f6fefb1a48bcaf24b215ec7bd7f87f6884d1ef9394cddcf50d1b30e26f9e15093 + checksum: 10c0/696486eb472686e3fa7af1efa7ba10b177543c60b9f3caa7365b4527a11e3d6019b655cf820b3aa23d931b4bd2100b68f9d4125fee542abf0d44e401896615a1 languageName: node linkType: hard @@ -3225,11 +3292,11 @@ __metadata: languageName: node linkType: hard -"@radix-ui/react-visually-hidden@npm:1.1.1": - version: 1.1.1 - resolution: "@radix-ui/react-visually-hidden@npm:1.1.1" +"@radix-ui/react-visually-hidden@npm:1.1.2": + version: 1.1.2 + resolution: "@radix-ui/react-visually-hidden@npm:1.1.2" dependencies: - "@radix-ui/react-primitive": "npm:2.0.1" + "@radix-ui/react-primitive": "npm:2.0.2" peerDependencies: "@types/react": "*" "@types/react-dom": "*" @@ -3240,7 +3307,7 @@ __metadata: optional: true "@types/react-dom": optional: true - checksum: 10c0/9a34b8e09dc79983626194fdfb4bd24c79060034a226153a2bd9f726f056139316e7a6360583567c6ccd5d9589e6d230fe2c436abea455f73e2d27b73412c412 + checksum: 10c0/ea6dc8ec284b32bca6f24809db257394802e14af7c95e4a237af51009fa222c42e3b7a55b3bfc94d753f509086636555058ae8e535be25956c46529abf41b448 languageName: node linkType: hard @@ -3262,8 +3329,8 @@ __metadata: linkType: hard "@reportportal/client-javascript@npm:~5.3.0": - version: 5.3.0 - resolution: "@reportportal/client-javascript@npm:5.3.0" + version: 5.3.1 + resolution: "@reportportal/client-javascript@npm:5.3.1" dependencies: axios: "npm:^1.7.7" axios-retry: "npm:^4.1.0" @@ -3272,7 +3339,7 @@ __metadata: microtime: "npm:^3.1.1" uniqid: "npm:^5.4.0" uuid: "npm:^9.0.1" - checksum: 10c0/a58cd900deb4d87e15e29528341fbd648b869f337820487322a9c160201d01456dba54c50e91baca8cd6637946b2d6e7acbeeff4c290be97c5d3d4df4243c95a + checksum: 10c0/6ec48b42c61a45edce0f78e2a2cb1ed4d25c2c01df57e22076d1a9a73eb21287f2a5565dd33e7ffbaf72be1e46a174c132c98fa36fcd6e557dc5939da931db09 languageName: node linkType: hard @@ -3522,9 +3589,9 @@ __metadata: linkType: hard "@rushstack/eslint-patch@npm:^1.3.3": - version: 1.10.4 - resolution: "@rushstack/eslint-patch@npm:1.10.4" - checksum: 10c0/de312bd7a3cb0f313c9720029eb719d8762fe54946cce2d33ac142b1cbb5817c4a5a92518dfa476c26311602d37f5a8f7caa90a0c73e3d6a56f9a05d2799c172 + version: 1.10.5 + resolution: "@rushstack/eslint-patch@npm:1.10.5" + checksum: 10c0/ea66e8be3a78a48d06e8ff33221cef5749386589236bbcd24013577d2b4e1035e3dc919740c6e0f16d44c1e0b62d06d00898508fc74cc2adb0ac6b667aa5a8e4 languageName: node linkType: hard @@ -3560,12 +3627,12 @@ __metadata: languageName: node linkType: hard -"@sigstore/bundle@npm:^3.0.0": - version: 3.0.0 - resolution: "@sigstore/bundle@npm:3.0.0" +"@sigstore/bundle@npm:^3.1.0": + version: 3.1.0 + resolution: "@sigstore/bundle@npm:3.1.0" dependencies: - "@sigstore/protobuf-specs": "npm:^0.3.2" - checksum: 10c0/9a077d390970b1de5f60f7d870f856b26073d8775d4ffe827db4c0195d25e0eadcc0854f6ee76a92be070b289a3386bf0cf02ab30df100c7cf029d01312d7417 + "@sigstore/protobuf-specs": "npm:^0.4.0" + checksum: 10c0/f34afa3efe81b0925cf1568eeea7678876c5889799fcdf9b81d1062067108e74fc3f3480b0d2b7daa7389f944e4a2523b5fc98d65dbbaa34d206d8c2edc4fa5a languageName: node linkType: hard @@ -3584,9 +3651,16 @@ __metadata: linkType: hard "@sigstore/protobuf-specs@npm:^0.3.2": - version: 0.3.2 - resolution: "@sigstore/protobuf-specs@npm:0.3.2" - checksum: 10c0/108eed419181ff599763f2d28ff5087e7bce9d045919de548677520179fe77fb2e2b7290216c93c7a01bdb2972b604bf44599273c991bbdf628fbe1b9b70aacb + version: 0.3.3 + resolution: "@sigstore/protobuf-specs@npm:0.3.3" + checksum: 10c0/e0a68795fa19e437fca2c3993e5a57e989642d65434beda54b29017c1629176cc8abeb81bb1e0923259cdfb19fe1fee6f1b8680a8f8240dc14c7a7de2bbae7af + languageName: node + linkType: hard + +"@sigstore/protobuf-specs@npm:^0.4.0": + version: 0.4.0 + resolution: "@sigstore/protobuf-specs@npm:0.4.0" + checksum: 10c0/5b9e074ad132b977050cbd9431c09ea88b21af266dae91dda8d51e29c7b295e73e3be255c10d68874259326229dde1805dd1f5ff29082d2f3d32a932809816eb languageName: node linkType: hard @@ -3604,17 +3678,17 @@ __metadata: languageName: node linkType: hard -"@sigstore/sign@npm:^3.0.0": - version: 3.0.0 - resolution: "@sigstore/sign@npm:3.0.0" +"@sigstore/sign@npm:^3.1.0": + version: 3.1.0 + resolution: "@sigstore/sign@npm:3.1.0" dependencies: - "@sigstore/bundle": "npm:^3.0.0" + "@sigstore/bundle": "npm:^3.1.0" "@sigstore/core": "npm:^2.0.0" - "@sigstore/protobuf-specs": "npm:^0.3.2" - make-fetch-happen: "npm:^14.0.1" + "@sigstore/protobuf-specs": "npm:^0.4.0" + make-fetch-happen: "npm:^14.0.2" proc-log: "npm:^5.0.0" promise-retry: "npm:^2.0.1" - checksum: 10c0/0d82d84de9dc522389c0eece113f9ead7ea49155daf231ee7477b9c6affc095254e9351fbbfc6dd97d01bae6e42edb6078f2f4d6b194cd08ce5775ce70cfbe44 + checksum: 10c0/7647f3a1350a09d66e7d77fdf8edf6eeb047f818acc2cd06325fc8ec9f0cd654dd25909876147b7ed052d459dc6a1d64e8cbaa44486300b241c3b139d778f254 languageName: node linkType: hard @@ -3628,13 +3702,13 @@ __metadata: languageName: node linkType: hard -"@sigstore/tuf@npm:^3.0.0": - version: 3.0.0 - resolution: "@sigstore/tuf@npm:3.0.0" +"@sigstore/tuf@npm:^3.1.0": + version: 3.1.0 + resolution: "@sigstore/tuf@npm:3.1.0" dependencies: - "@sigstore/protobuf-specs": "npm:^0.3.2" + "@sigstore/protobuf-specs": "npm:^0.4.0" tuf-js: "npm:^3.0.1" - checksum: 10c0/1e0a1e69f1e2763bb3dd007211412bdab0e66926d4fb16a0b9c38a7b30edc3e8b7a541f82c9c77d24862398b5fe6312d478982237cac81b59dc8e0cea665813c + checksum: 10c0/940237295bec3817ef4dbfd48de8b9a73b4e297966c05e81b6103747904def999f27499adb3de572407f2c72c6f28d2c699a6c8446be808b599c427a9903f081 languageName: node linkType: hard @@ -3649,14 +3723,14 @@ __metadata: languageName: node linkType: hard -"@sigstore/verify@npm:^2.0.0": - version: 2.0.0 - resolution: "@sigstore/verify@npm:2.0.0" +"@sigstore/verify@npm:^2.1.0": + version: 2.1.0 + resolution: "@sigstore/verify@npm:2.1.0" dependencies: - "@sigstore/bundle": "npm:^3.0.0" + "@sigstore/bundle": "npm:^3.1.0" "@sigstore/core": "npm:^2.0.0" - "@sigstore/protobuf-specs": "npm:^0.3.2" - checksum: 10c0/9964d8577dcd7d0bbfb62de0a93f1d7e24a011640940d868fc0112ba776e238ccef7b8d4e1870257fb1bcf28d7bf4cc437ee5919353620da21a95355daceb00b + "@sigstore/protobuf-specs": "npm:^0.4.0" + checksum: 10c0/3e4f575c25d352ce4953e1fedd220c481199e8a704c5906b1cea933945020dc77bdc25090a0957ef15f01d2d475bd4bc3dbc1edf8acbb2f3a3448befdb2eca7e languageName: node linkType: hard @@ -3719,21 +3793,21 @@ __metadata: linkType: hard "@tanstack/react-virtual@npm:^3.10.9": - version: 3.11.2 - resolution: "@tanstack/react-virtual@npm:3.11.2" + version: 3.13.2 + resolution: "@tanstack/react-virtual@npm:3.13.2" dependencies: - "@tanstack/virtual-core": "npm:3.11.2" + "@tanstack/virtual-core": "npm:3.13.2" peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - checksum: 10c0/de446ce517d0855b3d58e79b6a75a37be40b4529baf0a5c3ffa2662dea80aba03409e06545aea27aa9e3a36fc2a2e3005ecbfce16a4659991d66930ea3bd62d4 + checksum: 10c0/6341e43c8af79b273deb9283631b881065131191959ffc08e9e83c42e772e0c1576a4787252017650798e2e3961fc7854ee7ea0a8b40dab7354c6a2e830f5db6 languageName: node linkType: hard -"@tanstack/virtual-core@npm:3.11.2": - version: 3.11.2 - resolution: "@tanstack/virtual-core@npm:3.11.2" - checksum: 10c0/38f1047127c6b1d07fe95becb7a12e66fb7c59d37ec0359e4ab339f837c6b906e1adff026ebd12849ba851d3f118d491014205c6b3c6ed8568cc232a798aeaaf +"@tanstack/virtual-core@npm:3.13.2": + version: 3.13.2 + resolution: "@tanstack/virtual-core@npm:3.13.2" + checksum: 10c0/6527f4e2db071e03b6a0768b10405d072c2692551148314e36ea673878c78ea50f10849f173b32ec8b8d265bd624ab03cacb770c60719885e1ca02cdccf04927 languageName: node linkType: hard @@ -3769,8 +3843,8 @@ __metadata: linkType: hard "@testing-library/react@npm:^16.0.1": - version: 16.1.0 - resolution: "@testing-library/react@npm:16.1.0" + version: 16.2.0 + resolution: "@testing-library/react@npm:16.2.0" dependencies: "@babel/runtime": "npm:^7.12.5" peerDependencies: @@ -3784,16 +3858,16 @@ __metadata: optional: true "@types/react-dom": optional: true - checksum: 10c0/8451dcc76ba0d4f3504af78f2a4aacc13117691f4b7a3c279f3e047d5ea817ff686496ad53e7f65f6183112aef2be3f318af609b1f5d666eed42b1014d1c68d5 + checksum: 10c0/7adaedaf237002b42e04a6261d2756074a19cbca0f0c79ba375660f618e123c0ee56256ced00aeb0bb7225ba1a8a81b92b692cca053521a21bb92a8cace1e4c6 languageName: node linkType: hard "@testing-library/user-event@npm:^14.5.2": - version: 14.5.2 - resolution: "@testing-library/user-event@npm:14.5.2" + version: 14.6.1 + resolution: "@testing-library/user-event@npm:14.6.1" peerDependencies: "@testing-library/dom": ">=7.21.4" - checksum: 10c0/68a0c2aa28a3c8e6eb05cafee29705438d7d8a9427423ce5064d44f19c29e89b5636de46dd2f28620fb10abba75c67130185bbc3aa23ac1163a227a5f36641e1 + checksum: 10c0/75fea130a52bf320d35d46ed54f3eec77e71a56911b8b69a3fe29497b0b9947b2dc80d30f04054ad4ce7f577856ae3e5397ea7dff0ef14944d3909784c7a93fe languageName: node linkType: hard @@ -4118,9 +4192,9 @@ __metadata: linkType: hard "@types/lodash@npm:^4.14.200": - version: 4.17.13 - resolution: "@types/lodash@npm:4.17.13" - checksum: 10c0/c3d0b7efe7933ac0369b99f2f7bff9240d960680fdb74b41ed4bd1b3ca60cca1e31fe4046d9abbde778f941a41bc2a75eb629abf8659fa6c27b66efbbb0802a9 + version: 4.17.15 + resolution: "@types/lodash@npm:4.17.15" + checksum: 10c0/2eb2dc6d231f5fb4603d176c08c8d7af688f574d09af47466a179cd7812d9f64144ba74bb32ca014570ffdc544eedc51b7a5657212bad083b6eecbd72223f9bb languageName: node linkType: hard @@ -4141,27 +4215,28 @@ __metadata: linkType: hard "@types/ms@npm:*": - version: 0.7.34 - resolution: "@types/ms@npm:0.7.34" - checksum: 10c0/ac80bd90012116ceb2d188fde62d96830ca847823e8ca71255616bc73991aa7d9f057b8bfab79e8ee44ffefb031ddd1bcce63ea82f9e66f7c31ec02d2d823ccc + version: 2.1.0 + resolution: "@types/ms@npm:2.1.0" + checksum: 10c0/5ce692ffe1549e1b827d99ef8ff71187457e0eb44adbae38fdf7b9a74bae8d20642ee963c14516db1d35fa2652e65f47680fdf679dcbde52bbfadd021f497225 languageName: node linkType: hard "@types/node-fetch@npm:*": - version: 3.0.2 - resolution: "@types/node-fetch@npm:3.0.2" + version: 2.6.12 + resolution: "@types/node-fetch@npm:2.6.12" dependencies: - node-fetch: "npm:*" - checksum: 10c0/2fedd8ff347c0d1fcd0491a3408087a1d8306a38a2425464ec72049ab3353debdec99d988e2a5ab5b32ee9f275aab30c1e10a250f2b6c3b91824b7aa26653700 + "@types/node": "npm:*" + form-data: "npm:^4.0.0" + checksum: 10c0/7693acad5499b7df2d1727d46cff092a63896dc04645f36b973dd6dd754a59a7faba76fcb777bdaa35d80625c6a9dd7257cca9c401a4bab03b04480cda7fd1af languageName: node linkType: hard "@types/node@npm:*, @types/node@npm:^22.10.0": - version: 22.10.2 - resolution: "@types/node@npm:22.10.2" + version: 22.13.5 + resolution: "@types/node@npm:22.13.5" dependencies: undici-types: "npm:~6.20.0" - checksum: 10c0/2c7b71a040f1ef5320938eca8ebc946e6905caa9bbf3d5665d9b3774a8d15ea9fab1582b849a6d28c7fc80756a62c5666bc66b69f42f4d5dafd1ccb193cdb4ac + checksum: 10c0/a2e7ed7bb0690e439004779baedeb05159c5cc41ef6d81c7a6ebea5303fde4033669e1c0e41ff7453b45fd2fea8dbd55fddfcd052950c7fcae3167c970bca725 languageName: node linkType: hard @@ -4182,11 +4257,11 @@ __metadata: linkType: hard "@types/node@npm:^20.9.0": - version: 20.17.10 - resolution: "@types/node@npm:20.17.10" + version: 20.17.19 + resolution: "@types/node@npm:20.17.19" dependencies: undici-types: "npm:~6.19.2" - checksum: 10c0/458ec725319e57d4692cbb56d81f1a90f9074cef9ec185c59e6f6c557a3d2ded57c5e443b1e82eba923d53dda4db18797fb131ee6e46fdb3d7d2f54d54aaebe3 + checksum: 10c0/930e554eadeb0c2848f9225007ef66ea9c7fe987c80e2f2c1a9f316b297036d4054bbc5459b67051cf32cd360a022344c2998dcb1ec7579109f631b6d5f21bf8 languageName: node linkType: hard @@ -4278,11 +4353,11 @@ __metadata: linkType: hard "@types/react-dom@npm:^19": - version: 19.0.2 - resolution: "@types/react-dom@npm:19.0.2" + version: 19.0.4 + resolution: "@types/react-dom@npm:19.0.4" peerDependencies: "@types/react": ^19.0.0 - checksum: 10c0/3d0c7b78dbe8df64ea769f30af990a5950173a8321c745fe11094d765423f7964c3519dca6e7cd36b4be6521c8efc690bdd3b79b327b229dd1e9d5a8bad677dd + checksum: 10c0/4e71853919b94df9e746a4bd73f8180e9ae13016333ce9c543dcba9f4f4c8fe6e28b038ca6ee61c24e291af8e03ca3bc5ded17c46dee938fcb32d71186fda7a3 languageName: node linkType: hard @@ -4305,11 +4380,11 @@ __metadata: linkType: hard "@types/react@npm:*": - version: 19.0.2 - resolution: "@types/react@npm:19.0.2" + version: 19.0.10 + resolution: "@types/react@npm:19.0.10" dependencies: csstype: "npm:^3.0.2" - checksum: 10c0/8992f39701fcf1bf893ef8f94a56196445667baf08fe4f6050a14e229a17aad3265ad3efc01595ff3b4d5d5c69da885f9aa4ff80f164a613018734efcff1eb8f + checksum: 10c0/41884cca21850c8b2d6578b172ca0ca4fff6021251a68532b19f2031ac23dc5a9222470208065f8d9985d367376047df2f49ece8d927f7d04cdc94922b1eb34b languageName: node linkType: hard @@ -4442,9 +4517,9 @@ __metadata: linkType: hard "@types/verror@npm:^1.10.3": - version: 1.10.10 - resolution: "@types/verror@npm:1.10.10" - checksum: 10c0/413c0c0370ed6a796d630fbcdae20049ab3e26558c62bc5f53327830ddb0965aaadedb92f4933b28ee8fc8089e1293b742a0efbf6b264d15ce3930c6b83b0984 + version: 1.10.11 + resolution: "@types/verror@npm:1.10.11" + checksum: 10c0/6d815cb2b76501f976cf9fa0feaf572e83b2ec3043eff92507c9976e52b7844453bd47c84f1298bf583f8e6568f39063a2541f80656f4af8e179072a711f9ab5 languageName: node linkType: hard @@ -4660,55 +4735,55 @@ __metadata: linkType: hard "@ungap/structured-clone@npm:^1.0.0, @ungap/structured-clone@npm:^1.2.0": - version: 1.2.1 - resolution: "@ungap/structured-clone@npm:1.2.1" - checksum: 10c0/127afbcc75ff1532f7b1eb85ee992f9faa70e8d5bb2558da05355d423b966fc279d0a485bf19da2883280e7c299ae4170809a72e78eab086da71c6bcdda5d1e2 + version: 1.3.0 + resolution: "@ungap/structured-clone@npm:1.3.0" + checksum: 10c0/0fc3097c2540ada1fc340ee56d58d96b5b536a2a0dab6e3ec17d4bfc8c4c86db345f61a375a8185f9da96f01c69678f836a2b57eeaa9e4b8eeafd26428e57b0a languageName: node linkType: hard -"@uppy/companion-client@npm:^4.2.0": - version: 4.3.0 - resolution: "@uppy/companion-client@npm:4.3.0" +"@uppy/companion-client@npm:^4.4.1": + version: 4.4.1 + resolution: "@uppy/companion-client@npm:4.4.1" dependencies: - "@uppy/utils": "npm:^6.0.6" + "@uppy/utils": "npm:^6.1.1" namespace-emitter: "npm:^2.0.1" p-retry: "npm:^6.1.0" peerDependencies: - "@uppy/core": ^4.3.1 - checksum: 10c0/51cddd6398e62c5d9b347b12961e51e980d1fcb014cb3472f0d265fb31729b601cb98243075a95847bae5b3f5147ce31bf6460a2f3bb79aa088ee273c09abd52 + "@uppy/core": ^4.4.1 + checksum: 10c0/7550d7e18952b96e3be76b9942f04dcce47a3fa0873b0d58b5b82bb6fbc9d49404a190ff38479b3fb1dcc771ea4500bcaf7bf48d8ff757c9bacb7b827dcb6350 languageName: node linkType: hard "@uppy/core@npm:^4.3.0": - version: 4.3.1 - resolution: "@uppy/core@npm:4.3.1" + version: 4.4.2 + resolution: "@uppy/core@npm:4.4.2" dependencies: "@transloadit/prettier-bytes": "npm:^0.3.4" - "@uppy/store-default": "npm:^4.1.2" - "@uppy/utils": "npm:^6.0.6" + "@uppy/store-default": "npm:^4.2.0" + "@uppy/utils": "npm:^6.1.2" lodash: "npm:^4.17.21" mime-match: "npm:^1.0.2" namespace-emitter: "npm:^2.0.1" - nanoid: "npm:^5.0.0" + nanoid: "npm:^5.0.9" preact: "npm:^10.5.13" - checksum: 10c0/42a28098fc6da0b42a4c40babfe2ac207efeeb153f76226d579c30cd20f3595a7c15486a3cfcff8952ca30642748dff6972f1e5cb98e852ce255e9f444dcce31 + checksum: 10c0/d092e4ed31abf790f28195ab9c177a6d8352512299070001f8eedf0f489957623bc4a40750d1fad989200ed5344573121d42c8e3b7dc6fb884e3ed36e33ecf33 languageName: node linkType: hard "@uppy/react@npm:^4.0.4": - version: 4.0.4 - resolution: "@uppy/react@npm:4.0.4" + version: 4.2.1 + resolution: "@uppy/react@npm:4.2.1" dependencies: - "@uppy/utils": "npm:^6.0.5" + "@uppy/utils": "npm:^6.1.1" use-sync-external-store: "npm:^1.2.0" peerDependencies: - "@uppy/core": ^4.3.0 - "@uppy/dashboard": ^4.1.3 - "@uppy/drag-drop": ^4.0.5 - "@uppy/file-input": ^4.0.4 - "@uppy/progress-bar": ^4.0.2 - "@uppy/status-bar": ^4.0.5 - react: ^18.0.0 + "@uppy/core": ^4.4.1 + "@uppy/dashboard": ^4.3.1 + "@uppy/drag-drop": ^4.1.1 + "@uppy/file-input": ^4.1.1 + "@uppy/progress-bar": ^4.2.1 + "@uppy/status-bar": ^4.1.1 + react: ^18.0.0 || ^19.0.0 peerDependenciesMeta: "@uppy/dashboard": optional: true @@ -4720,36 +4795,36 @@ __metadata: optional: true "@uppy/status-bar": optional: true - checksum: 10c0/8668dcb99a9978ba22b1d029fee25f56b7582b6683214cd6a30eecbf73a13946a9359f3a490399b3223924b060f058292684ed8d0955ad41786a8fea494331fe + checksum: 10c0/72b84aef2e148cfc07a6024ea63e7bb779c9847f9161daa1f628e189c70a2d2f31c2482b46163b84c6a97faf161926972b3de5f089d8e4322d167a8931a37c94 languageName: node linkType: hard -"@uppy/store-default@npm:^4.1.2": - version: 4.1.2 - resolution: "@uppy/store-default@npm:4.1.2" - checksum: 10c0/3705648e55d218743a11f510de8ba9afe7dd283eaa45bb8a3228de801a2cba7f3826ae48243e66e0e6f0eff5b74bf149a5e8d307a40a377d8e0a32fa14b24ef9 +"@uppy/store-default@npm:^4.2.0": + version: 4.2.0 + resolution: "@uppy/store-default@npm:4.2.0" + checksum: 10c0/b8107fc85ab6ec6ea212f107de20e577533fbc22f8db10d06dace147d09378d8b75741c626187d2c0249cc496fae650425457532ff8ed454ead5482a9f866c3e languageName: node linkType: hard -"@uppy/utils@npm:^6.0.5, @uppy/utils@npm:^6.0.6": - version: 6.0.6 - resolution: "@uppy/utils@npm:6.0.6" +"@uppy/utils@npm:^6.1.1, @uppy/utils@npm:^6.1.2": + version: 6.1.2 + resolution: "@uppy/utils@npm:6.1.2" dependencies: lodash: "npm:^4.17.21" preact: "npm:^10.5.13" - checksum: 10c0/937d31918825c2569fdc3de95eb445b5d6d9d00676ce188c4f11c519f66a523ee790051b6a576f6bb34664de81d4e540a76ab4bb421929c145e97e36a09eaca7 + checksum: 10c0/91a709825639acc78b194ae1f055e296d412728019cf5cce1ebed23aab209b1816e27eb77d5a625b25ee8922a7c0e51c27744fb9500980c066cf4e025d1562de languageName: node linkType: hard "@uppy/xhr-upload@npm:^4.2.3": - version: 4.2.3 - resolution: "@uppy/xhr-upload@npm:4.2.3" + version: 4.3.3 + resolution: "@uppy/xhr-upload@npm:4.3.3" dependencies: - "@uppy/companion-client": "npm:^4.2.0" - "@uppy/utils": "npm:^6.0.5" + "@uppy/companion-client": "npm:^4.4.1" + "@uppy/utils": "npm:^6.1.2" peerDependencies: - "@uppy/core": ^4.3.0 - checksum: 10c0/2111c7e4e2c0abed4d8543c33a89a1f4a1be931698c0f8ea326abbba3e7a8353aca7e84c7d579bf4001bb30b18cd57f07d851ea6078768fdb28e874a880be78d + "@uppy/core": ^4.4.2 + checksum: 10c0/f9f76806fb85e8d75d1cf0af5b189f2e2bb02eb38135f18367593a8ded0e65d6b21312dac7c93f5b91b41e23acebfb47ef72e0341292c2091ab74ec4d83bc4a0 languageName: node linkType: hard @@ -4774,6 +4849,22 @@ __metadata: languageName: node linkType: hard +"abbrev@npm:^3.0.0": + version: 3.0.0 + resolution: "abbrev@npm:3.0.0" + checksum: 10c0/049704186396f571650eb7b22ed3627b77a5aedf98bb83caf2eac81ca2a3e25e795394b0464cfb2d6076df3db6a5312139eac5b6a126ca296ac53c5008069c28 + languageName: node + linkType: hard + +"abort-controller@npm:^3.0.0": + version: 3.0.0 + resolution: "abort-controller@npm:3.0.0" + dependencies: + event-target-shim: "npm:^5.0.0" + checksum: 10c0/90ccc50f010250152509a344eb2e71977fbf8db0ab8f1061197e3275ddf6c61a41a6edfd7b9409c664513131dd96e962065415325ef23efa5db931b382d24ca5 + languageName: node + linkType: hard + "abstract-logging@npm:^2.0.1": version: 2.0.1 resolution: "abstract-logging@npm:2.0.1" @@ -5125,7 +5216,7 @@ __metadata: languageName: node linkType: hard -"aria-hidden@npm:^1.1.1": +"aria-hidden@npm:^1.2.4": version: 1.2.4 resolution: "aria-hidden@npm:1.2.4" dependencies: @@ -5356,6 +5447,13 @@ __metadata: languageName: node linkType: hard +"async-function@npm:^1.0.0": + version: 1.0.0 + resolution: "async-function@npm:1.0.0" + checksum: 10c0/669a32c2cb7e45091330c680e92eaeb791bc1d4132d827591e499cd1f776ff5a873e77e5f92d0ce795a8d60f10761dec9ddfe7225a5de680f5d357f67b1aac73 + languageName: node + linkType: hard + "async@npm:^3.2.3, async@npm:^3.2.4": version: 3.2.6 resolution: "async@npm:3.2.6" @@ -5769,8 +5867,8 @@ __metadata: linkType: hard "browserslist@npm:^4.0.0, browserslist@npm:^4.21.10, browserslist@npm:^4.21.4, browserslist@npm:^4.24.0": - version: 4.24.3 - resolution: "browserslist@npm:4.24.3" + version: 4.24.4 + resolution: "browserslist@npm:4.24.4" dependencies: caniuse-lite: "npm:^1.0.30001688" electron-to-chromium: "npm:^1.5.73" @@ -5778,7 +5876,7 @@ __metadata: update-browserslist-db: "npm:^1.1.1" bin: browserslist: cli.js - checksum: 10c0/bab261ef7b6e1656a719a9fa31240ae7ce4d5ba68e479f6b11e348d819346ab4c0ff6f4821f43adcc9c193a734b186775a83b37979e70a69d182965909fe569a + checksum: 10c0/db7ebc1733cf471e0b490b4f47e3e2ea2947ce417192c9246644e92c667dd56a71406cc58f62ca7587caf828364892e9952904a02b7aead752bc65b62a37cfe9 languageName: node linkType: hard @@ -5838,6 +5936,16 @@ __metadata: languageName: node linkType: hard +"buffer@npm:^6.0.3": + version: 6.0.3 + resolution: "buffer@npm:6.0.3" + dependencies: + base64-js: "npm:^1.3.1" + ieee754: "npm:^1.2.1" + checksum: 10c0/2a905fbbcde73cc5d8bd18d1caa23715d5f83a5935867c2329f0ac06104204ba7947be098fe1317fbd8830e26090ff8e764f08cd14fefc977bb248c3487bcbd0 + languageName: node + linkType: hard + "builder-util-runtime@npm:9.2.10": version: 9.2.10 resolution: "builder-util-runtime@npm:9.2.10" @@ -5977,13 +6085,13 @@ __metadata: languageName: node linkType: hard -"call-bind-apply-helpers@npm:^1.0.0, call-bind-apply-helpers@npm:^1.0.1": - version: 1.0.1 - resolution: "call-bind-apply-helpers@npm:1.0.1" +"call-bind-apply-helpers@npm:^1.0.0, call-bind-apply-helpers@npm:^1.0.1, call-bind-apply-helpers@npm:^1.0.2": + version: 1.0.2 + resolution: "call-bind-apply-helpers@npm:1.0.2" dependencies: es-errors: "npm:^1.3.0" function-bind: "npm:^1.1.2" - checksum: 10c0/acb2ab68bf2718e68a3e895f0d0b73ccc9e45b9b6f210f163512ba76f91dab409eb8792f6dae188356f9095747512a3101646b3dea9d37fb8c7c6bf37796d18c + checksum: 10c0/47bd9901d57b857590431243fea704ff18078b16890a6b3e021e12d279bbf211d039155e27d7566b374d49ee1f8189344bac9833dec7a20cdec370506361c938 languageName: node linkType: hard @@ -6050,9 +6158,9 @@ __metadata: linkType: hard "caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30001538, caniuse-lite@npm:^1.0.30001579, caniuse-lite@npm:^1.0.30001688": - version: 1.0.30001690 - resolution: "caniuse-lite@npm:1.0.30001690" - checksum: 10c0/646bd469032afa90400a84dec30a2b00a6eda62c03ead358117e3f884cda8aacec02ec058a6dbee5eaf9714f83e483b9b0eb4fb42febb8076569f5ca40f1d347 + version: 1.0.30001700 + resolution: "caniuse-lite@npm:1.0.30001700" + checksum: 10c0/3d391bcdd193208166d3ad759de240b9c18ac3759dbd57195770f0fcd2eedcd47d5e853609aba1eee5a2def44b0a14eee457796bdb3451a27de0c8b27355017c languageName: node linkType: hard @@ -6224,9 +6332,9 @@ __metadata: linkType: hard "cjs-module-lexer@npm:^1.0.0": - version: 1.4.1 - resolution: "cjs-module-lexer@npm:1.4.1" - checksum: 10c0/5a7d8279629c9ba8ccf38078c2fed75b7737973ced22b9b5a54180efa57fb2fe2bb7bec6aec55e3b8f3f5044f5d7b240347ad9bd285e7c3d0ee5b0a1d0504dfc + version: 1.4.3 + resolution: "cjs-module-lexer@npm:1.4.3" + checksum: 10c0/076b3af85adc4d65dbdab1b5b240fe5b45d44fcf0ef9d429044dd94d19be5589376805c44fb2d4b3e684e5fe6a9b7cf3e426476a6507c45283c5fc6ff95240be languageName: node linkType: hard @@ -6480,9 +6588,9 @@ __metadata: linkType: hard "compute-scroll-into-view@npm:^3.0.2": - version: 3.1.0 - resolution: "compute-scroll-into-view@npm:3.1.0" - checksum: 10c0/bf305c4ece8e5c59ed3f7ed82b6dab5b7487ce26f56a693d903869964712870fccb08fe31d40edcbd600b03c99198f54d443acb315d674bd64fd344410c8672e + version: 3.1.1 + resolution: "compute-scroll-into-view@npm:3.1.1" + checksum: 10c0/59761ed62304a9599b52ad75d0d6fbf0669ee2ab7dd472fdb0ad9da36628414c014dea7b5810046560180ad30ffec52a953d19297f66a1d4f3aa0999b9d2521d languageName: node linkType: hard @@ -6503,8 +6611,8 @@ __metadata: linkType: hard "concurrently@npm:^9.1.0": - version: 9.1.0 - resolution: "concurrently@npm:9.1.0" + version: 9.1.2 + resolution: "concurrently@npm:9.1.2" dependencies: chalk: "npm:^4.1.2" lodash: "npm:^4.17.21" @@ -6516,7 +6624,7 @@ __metadata: bin: conc: dist/bin/concurrently.js concurrently: dist/bin/concurrently.js - checksum: 10c0/f2f42f94dde508bfbaf47b5ac654db9e8a4bf07d3d7b6267dd058ae6f362eec677ae7c8ede398d081e5fd0d1de5811dc9a53e57d3f1f68e72ac6459db9e0896b + checksum: 10c0/88e00269366aa885ca2b97fd53b04e7af2b0f31774d991bfc0e88c0de61cdebdf115ddacc9c897fbd1f1b90369014637fa77045a171d072a75693332b36dcc70 languageName: node linkType: hard @@ -6586,9 +6694,9 @@ __metadata: linkType: hard "core-js@npm:^3.38.1": - version: 3.39.0 - resolution: "core-js@npm:3.39.0" - checksum: 10c0/f7602069b6afb2e3298eec612a5c1e0c3e6a458930fbfc7a4c5f9ac03426507f49ce395eecdd2d9bae9024f820e44582b67ffe16f2272395af26964f174eeb6b + version: 3.40.0 + resolution: "core-js@npm:3.40.0" + checksum: 10c0/db7946ada881e845d8b157061945b1187618fa45cf162f392a151e8a497962aed2da688c982eaa1d444c864be97a70f8be4d73385294b515d224dd164d19f1d4 languageName: node linkType: hard @@ -6672,17 +6780,6 @@ __metadata: languageName: node linkType: hard -"cross-spawn@npm:7.0.3": - version: 7.0.3 - resolution: "cross-spawn@npm:7.0.3" - dependencies: - path-key: "npm:^3.1.0" - shebang-command: "npm:^2.0.0" - which: "npm:^2.0.1" - checksum: 10c0/5738c312387081c98d69c98e105b6327b069197f864a60593245d64c8089c8a0a744e16349281210d56835bb9274130d825a78b2ad6853ca13cfbeffc0c31750 - languageName: node - linkType: hard - "cross-spawn@npm:^6.0.0": version: 6.0.6 resolution: "cross-spawn@npm:6.0.6" @@ -6696,7 +6793,7 @@ __metadata: languageName: node linkType: hard -"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.1, cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3": +"cross-spawn@npm:^7.0.1, cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3, cross-spawn@npm:^7.0.6": version: 7.0.6 resolution: "cross-spawn@npm:7.0.6" dependencies: @@ -6864,7 +6961,7 @@ __metadata: languageName: node linkType: hard -"csstype@npm:^3.0.2": +"csstype@npm:^3.0.2, csstype@npm:^3.1.3": version: 3.1.3 resolution: "csstype@npm:3.1.3" checksum: 10c0/80c089d6f7e0c5b2bd83cf0539ab41474198579584fa10d86d0cafe0642202343cbc119e076a0b1aece191989477081415d66c9fefbf3c957fc2fc4b7009f248 @@ -6894,13 +6991,6 @@ __metadata: languageName: node linkType: hard -"data-uri-to-buffer@npm:^4.0.0": - version: 4.0.1 - resolution: "data-uri-to-buffer@npm:4.0.1" - checksum: 10c0/20a6b93107597530d71d4cb285acee17f66bcdfc03fd81040921a81252f19db27588d87fc8fc69e1950c55cfb0bf8ae40d0e5e21d907230813eb5d5a7f9eb45b - languageName: node - linkType: hard - "data-urls@npm:^3.0.2": version: 3.0.2 resolution: "data-urls@npm:3.0.2" @@ -6997,9 +7087,9 @@ __metadata: linkType: hard "decimal.js@npm:^10.4.2": - version: 10.4.3 - resolution: "decimal.js@npm:10.4.3" - checksum: 10c0/6d60206689ff0911f0ce968d40f163304a6c1bc739927758e6efc7921cfa630130388966f16bf6ef6b838cb33679fbe8e7a78a2f3c478afce841fd55ac8fb8ee + version: 10.5.0 + resolution: "decimal.js@npm:10.5.0" + checksum: 10c0/785c35279df32762143914668df35948920b6c1c259b933e0519a69b7003fc0a5ed2a766b1e1dda02574450c566b21738a45f15e274b47c2ac02072c0d1f3ac3 languageName: node linkType: hard @@ -7506,9 +7596,9 @@ __metadata: linkType: hard "electron-to-chromium@npm:^1.5.73": - version: 1.5.76 - resolution: "electron-to-chromium@npm:1.5.76" - checksum: 10c0/5a977be9fd5810769a7b4eae0e4b41b6beca65f2b3f3b7442819f6c93366d767d183cfbf408714f944a9bf3aa304f8c9ab9d0cdfd8e878ab8f2cbb61f8b22acd + version: 1.5.105 + resolution: "electron-to-chromium@npm:1.5.105" + checksum: 10c0/c5956af18fb8888938509810f754621c2c0e71e9aef305e76abb7cadef6440d9a2404eae942fea256c473e031d67d71857341786d381fbb69a734c8afba549c2 languageName: node linkType: hard @@ -7594,12 +7684,12 @@ __metadata: linkType: hard "enhanced-resolve@npm:^5.15.0": - version: 5.18.0 - resolution: "enhanced-resolve@npm:5.18.0" + version: 5.18.1 + resolution: "enhanced-resolve@npm:5.18.1" dependencies: graceful-fs: "npm:^4.2.4" tapable: "npm:^2.2.0" - checksum: 10c0/5fcc264a6040754ab5b349628cac2bb5f89cee475cbe340804e657a5b9565f70e6aafb338d5895554eb0ced9f66c50f38a255274a0591dcb64ee17c549c459ce + checksum: 10c0/4cffd9b125225184e2abed9fdf0ed3dbd2224c873b165d0838fd066cde32e0918626cba2f1f4bf6860762f13a7e2364fd89a82b99566be2873d813573ac71846 languageName: node linkType: hard @@ -7640,9 +7730,9 @@ __metadata: languageName: node linkType: hard -"es-abstract@npm:^1.17.5, es-abstract@npm:^1.23.2, es-abstract@npm:^1.23.3, es-abstract@npm:^1.23.5, es-abstract@npm:^1.23.6": - version: 1.23.7 - resolution: "es-abstract@npm:1.23.7" +"es-abstract@npm:^1.17.5, es-abstract@npm:^1.23.2, es-abstract@npm:^1.23.3, es-abstract@npm:^1.23.5, es-abstract@npm:^1.23.6, es-abstract@npm:^1.23.9": + version: 1.23.9 + resolution: "es-abstract@npm:1.23.9" dependencies: array-buffer-byte-length: "npm:^1.0.2" arraybuffer.prototype.slice: "npm:^1.0.4" @@ -7655,10 +7745,11 @@ __metadata: es-define-property: "npm:^1.0.1" es-errors: "npm:^1.3.0" es-object-atoms: "npm:^1.0.0" - es-set-tostringtag: "npm:^2.0.3" + es-set-tostringtag: "npm:^2.1.0" es-to-primitive: "npm:^1.3.0" function.prototype.name: "npm:^1.1.8" - get-intrinsic: "npm:^1.2.6" + get-intrinsic: "npm:^1.2.7" + get-proto: "npm:^1.0.0" get-symbol-description: "npm:^1.1.0" globalthis: "npm:^1.0.4" gopd: "npm:^1.2.0" @@ -7679,9 +7770,12 @@ __metadata: object-inspect: "npm:^1.13.3" object-keys: "npm:^1.1.1" object.assign: "npm:^4.1.7" + own-keys: "npm:^1.0.1" regexp.prototype.flags: "npm:^1.5.3" safe-array-concat: "npm:^1.1.3" + safe-push-apply: "npm:^1.0.0" safe-regex-test: "npm:^1.1.0" + set-proto: "npm:^1.0.0" string.prototype.trim: "npm:^1.2.10" string.prototype.trimend: "npm:^1.0.9" string.prototype.trimstart: "npm:^1.0.8" @@ -7691,7 +7785,7 @@ __metadata: typed-array-length: "npm:^1.0.7" unbox-primitive: "npm:^1.1.0" which-typed-array: "npm:^1.1.18" - checksum: 10c0/68d24e56f47d773639d49c561366c8d9e775187e0d64f011209261fcb3a63caf764f60c0e66940bbd8815a862f9ca8114f6a5dfdeb776da87436d46bcd82ae48 + checksum: 10c0/1de229c9e08fe13c17fe5abaec8221545dfcd57e51f64909599a6ae896df84b8fd2f7d16c60cb00d7bf495b9298ca3581aded19939d4b7276854a4b066f8422b languageName: node linkType: hard @@ -7733,32 +7827,33 @@ __metadata: languageName: node linkType: hard -"es-object-atoms@npm:^1.0.0": - version: 1.0.0 - resolution: "es-object-atoms@npm:1.0.0" +"es-object-atoms@npm:^1.0.0, es-object-atoms@npm:^1.1.1": + version: 1.1.1 + resolution: "es-object-atoms@npm:1.1.1" dependencies: es-errors: "npm:^1.3.0" - checksum: 10c0/1fed3d102eb27ab8d983337bb7c8b159dd2a1e63ff833ec54eea1311c96d5b08223b433060ba240541ca8adba9eee6b0a60cdbf2f80634b784febc9cc8b687b4 + checksum: 10c0/65364812ca4daf48eb76e2a3b7a89b3f6a2e62a1c420766ce9f692665a29d94fe41fe88b65f24106f449859549711e4b40d9fb8002d862dfd7eb1c512d10be0c languageName: node linkType: hard -"es-set-tostringtag@npm:^2.0.3": - version: 2.0.3 - resolution: "es-set-tostringtag@npm:2.0.3" +"es-set-tostringtag@npm:^2.0.3, es-set-tostringtag@npm:^2.1.0": + version: 2.1.0 + resolution: "es-set-tostringtag@npm:2.1.0" dependencies: - get-intrinsic: "npm:^1.2.4" + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.6" has-tostringtag: "npm:^1.0.2" - hasown: "npm:^2.0.1" - checksum: 10c0/f22aff1585eb33569c326323f0b0d175844a1f11618b86e193b386f8be0ea9474cfbe46df39c45d959f7aa8f6c06985dc51dd6bce5401645ec5a74c4ceaa836a + hasown: "npm:^2.0.2" + checksum: 10c0/ef2ca9ce49afe3931cb32e35da4dcb6d86ab02592cfc2ce3e49ced199d9d0bb5085fc7e73e06312213765f5efa47cc1df553a6a5154584b21448e9fb8355b1af languageName: node linkType: hard "es-shim-unscopables@npm:^1.0.2": - version: 1.0.2 - resolution: "es-shim-unscopables@npm:1.0.2" + version: 1.1.0 + resolution: "es-shim-unscopables@npm:1.1.0" dependencies: - hasown: "npm:^2.0.0" - checksum: 10c0/f495af7b4b7601a4c0cfb893581c352636e5c08654d129590386a33a0432cf13a7bdc7b6493801cadd990d838e2839b9013d1de3b880440cb537825e834fe783 + hasown: "npm:^2.0.2" + checksum: 10c0/1b9702c8a1823fc3ef39035a4e958802cf294dd21e917397c561d0b3e195f383b978359816b1732d02b255ccf63e1e4815da0065b95db8d7c992037be3bbbcdb languageName: node linkType: hard @@ -7815,6 +7910,13 @@ __metadata: languageName: node linkType: hard +"escape-string-regexp@npm:^5.0.0": + version: 5.0.0 + resolution: "escape-string-regexp@npm:5.0.0" + checksum: 10c0/6366f474c6f37a802800a435232395e04e9885919873e382b157ab7e8f0feb8fed71497f84a6f6a81a49aab41815522f5839112bd38026d203aea0c91622df95 + languageName: node + linkType: hard + "escodegen@npm:^2.0.0": version: 2.1.0 resolution: "escodegen@npm:2.1.0" @@ -7890,17 +7992,16 @@ __metadata: linkType: hard "eslint-import-resolver-typescript@npm:^3.5.2, eslint-import-resolver-typescript@npm:^3.6.1": - version: 3.7.0 - resolution: "eslint-import-resolver-typescript@npm:3.7.0" + version: 3.8.3 + resolution: "eslint-import-resolver-typescript@npm:3.8.3" dependencies: "@nolyfill/is-core-module": "npm:1.0.39" debug: "npm:^4.3.7" enhanced-resolve: "npm:^5.15.0" - fast-glob: "npm:^3.3.2" - get-tsconfig: "npm:^4.7.5" + get-tsconfig: "npm:^4.10.0" is-bun-module: "npm:^1.0.2" - is-glob: "npm:^4.0.3" stable-hash: "npm:^0.0.4" + tinyglobby: "npm:^0.2.12" peerDependencies: eslint: "*" eslint-plugin-import: "*" @@ -7910,7 +8011,7 @@ __metadata: optional: true eslint-plugin-import-x: optional: true - checksum: 10c0/b1dec542a31486b3b5730f71f08a8ee2ac4915dbc4aa1493fd15bc8fcadcb029772ab39a425824c235045b3a7e629290a339d4a7e7f3dd32b24e715106352d40 + checksum: 10c0/886ceeab4cad14958d7c7d3432ead2486374616c8ada7925ab96e55f919f2dbbbdbe7c3081d7d238231e84699849e82930417a66e05638bcc8202e1263edddeb languageName: node linkType: hard @@ -7999,8 +8100,8 @@ __metadata: linkType: hard "eslint-plugin-prettier@npm:^5.0.1": - version: 5.2.1 - resolution: "eslint-plugin-prettier@npm:5.2.1" + version: 5.2.3 + resolution: "eslint-plugin-prettier@npm:5.2.3" dependencies: prettier-linter-helpers: "npm:^1.0.0" synckit: "npm:^0.9.1" @@ -8014,7 +8115,7 @@ __metadata: optional: true eslint-config-prettier: optional: true - checksum: 10c0/4bc8bbaf5bb556c9c501dcdff369137763c49ccaf544f9fa91400360ed5e3a3f1234ab59690e06beca5b1b7e6f6356978cdd3b02af6aba3edea2ffe69ca6e8b2 + checksum: 10c0/60d9c03491ec6080ac1d71d0bee1361539ff6beb9b91ac98cfa7176c9ed52b7dbe7119ebee5b441b479d447d17d802a4a492ee06095ef2f22c460e3dd6459302 languageName: node linkType: hard @@ -8028,8 +8129,8 @@ __metadata: linkType: hard "eslint-plugin-react@npm:^7.33.2, eslint-plugin-react@npm:^7.34.0": - version: 7.37.3 - resolution: "eslint-plugin-react@npm:7.37.3" + version: 7.37.4 + resolution: "eslint-plugin-react@npm:7.37.4" dependencies: array-includes: "npm:^3.1.8" array.prototype.findlast: "npm:^1.2.5" @@ -8051,7 +8152,7 @@ __metadata: string.prototype.repeat: "npm:^1.0.0" peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 - checksum: 10c0/e8b267ab928c63e651e35ba936e84098f4189fbaebbf3607341e6affedcfe39f2afba85fb3ef83ec322b32829b22d7433230eb6af0f692d262473c6a19441ba5 + checksum: 10c0/4acbbdb19669dfa9a162ed8847c3ad1918f6aea1ceb675ee320b5d903b4e463fdef25e15233295b6d0a726fef2ea8b015c527da769c7690932ddc52d5b82ba12 languageName: node linkType: hard @@ -8270,6 +8371,13 @@ __metadata: languageName: node linkType: hard +"event-target-shim@npm:^5.0.0": + version: 5.0.1 + resolution: "event-target-shim@npm:5.0.1" + checksum: 10c0/0255d9f936215fd206156fd4caa9e8d35e62075d720dc7d847e89b417e5e62cf1ce6c9b4e0a1633a9256de0efefaf9f8d26924b1f3c8620cffb9db78e7d3076b + languageName: node + linkType: hard + "eventemitter3@npm:^4.0.4": version: 4.0.7 resolution: "eventemitter3@npm:4.0.7" @@ -8277,6 +8385,13 @@ __metadata: languageName: node linkType: hard +"events@npm:^3.3.0": + version: 3.3.0 + resolution: "events@npm:3.3.0" + checksum: 10c0/d6b6f2adbccbcda74ddbab52ed07db727ef52e31a61ed26db9feb7dc62af7fc8e060defa65e5f8af9449b86b52cc1a1f6a79f2eafcf4e62add2b7a1fa4a432f6 + languageName: node + linkType: hard + "execa@npm:^1.0.0": version: 1.0.0 resolution: "execa@npm:1.0.0" @@ -8370,9 +8485,9 @@ __metadata: linkType: hard "exponential-backoff@npm:^3.1.1": - version: 3.1.1 - resolution: "exponential-backoff@npm:3.1.1" - checksum: 10c0/160456d2d647e6019640bd07111634d8c353038d9fa40176afb7cd49b0548bdae83b56d05e907c2cce2300b81cae35d800ef92fefb9d0208e190fa3b7d6bb579 + version: 3.1.2 + resolution: "exponential-backoff@npm:3.1.2" + checksum: 10c0/d9d3e1eafa21b78464297df91f1776f7fbaa3d5e3f7f0995648ca5b89c069d17055033817348d9f4a43d1c20b0eab84f75af6991751e839df53e4dfd6f22e844 languageName: node linkType: hard @@ -8459,9 +8574,9 @@ __metadata: linkType: hard "fast-content-type-parse@npm:^2.0.0": - version: 2.0.0 - resolution: "fast-content-type-parse@npm:2.0.0" - checksum: 10c0/13fbe7beb744fa6c521c12954d06753d0557e3bc970a3941515ada2bffdd8eb73095a8c4ab7b0f2078c295f6f639e9d0fbd0601e47ff57bc043f2a099d63d8b8 + version: 2.0.1 + resolution: "fast-content-type-parse@npm:2.0.1" + checksum: 10c0/e5ff87d75a35ae4cf377df1dca46ec49e7abbdc8513689676ecdef548b94900b50e66e516e64470035d79b9f7010ef15d98c24d8ae803a881363cc59e0715e19 languageName: node linkType: hard @@ -8487,15 +8602,15 @@ __metadata: linkType: hard "fast-glob@npm:^3.0.3, fast-glob@npm:^3.2.9, fast-glob@npm:^3.3.2": - version: 3.3.2 - resolution: "fast-glob@npm:3.3.2" + version: 3.3.3 + resolution: "fast-glob@npm:3.3.3" dependencies: "@nodelib/fs.stat": "npm:^2.0.2" "@nodelib/fs.walk": "npm:^1.2.3" glob-parent: "npm:^5.1.2" merge2: "npm:^1.3.0" - micromatch: "npm:^4.0.4" - checksum: 10c0/42baad7b9cd40b63e42039132bde27ca2cb3a4950d0a0f9abe4639ea1aa9d3e3b40f98b1fe31cbc0cc17b664c9ea7447d911a152fa34ec5b72977b125a6fc845 + micromatch: "npm:^4.0.8" + checksum: 10c0/f6aaa141d0d3384cf73cbcdfc52f475ed293f6d5b65bfc5def368b09163a9f7e5ec2b3014d80f733c405f58e470ee0cc451c2937685045cddcdeaa24199c43fe languageName: node linkType: hard @@ -8507,17 +8622,16 @@ __metadata: linkType: hard "fast-json-stringify@npm:^6.0.0": - version: 6.0.0 - resolution: "fast-json-stringify@npm:6.0.0" + version: 6.0.1 + resolution: "fast-json-stringify@npm:6.0.1" dependencies: - "@fastify/merge-json-schemas": "npm:^0.1.1" + "@fastify/merge-json-schemas": "npm:^0.2.0" ajv: "npm:^8.12.0" ajv-formats: "npm:^3.0.1" - fast-deep-equal: "npm:^3.1.3" - fast-uri: "npm:^2.3.0" - json-schema-ref-resolver: "npm:^1.0.1" + fast-uri: "npm:^3.0.0" + json-schema-ref-resolver: "npm:^2.0.0" rfdc: "npm:^1.2.0" - checksum: 10c0/590bbb284df45972822773ebc41c8592c412cc8c2d123d43a41579c9972ff8004d1aea7d0c7cffaebf246ee28be964d605ad9d52bb96c26d8dc5fa4e225c1998 + checksum: 10c0/898aecd164707bced980fef61b0480dd80a47f87674d7643a75a60e5eca346018ba2552de200260030215d89f218d9cd7f342df14eec88ed44d45c81e4aa0eb4 languageName: node linkType: hard @@ -8544,17 +8658,10 @@ __metadata: languageName: node linkType: hard -"fast-uri@npm:^2.3.0": - version: 2.4.0 - resolution: "fast-uri@npm:2.4.0" - checksum: 10c0/300453cfe2f7d5ec16be0f2c8dc5b280edbaca59440b2deb4ab56ac0f584637179e9ee7539d0b70ef0fce9608245ebfa75307c84fa4829b1065c3b7ef7dcf706 - languageName: node - linkType: hard - -"fast-uri@npm:^3.0.0, fast-uri@npm:^3.0.1": - version: 3.0.3 - resolution: "fast-uri@npm:3.0.3" - checksum: 10c0/4b2c5ce681a062425eae4f15cdc8fc151fd310b2f69b1f96680677820a8b49c3cd6e80661a406e19d50f0c40a3f8bffdd458791baf66f4a879d80be28e10a320 +"fast-uri@npm:^3.0.0, fast-uri@npm:^3.0.1, fast-uri@npm:^3.0.5": + version: 3.0.6 + resolution: "fast-uri@npm:3.0.6" + checksum: 10c0/74a513c2af0584448aee71ce56005185f81239eab7a2343110e5bad50c39ad4fb19c5a6f99783ead1cac7ccaf3461a6034fda89fffa2b30b6d99b9f21c2f9d29 languageName: node linkType: hard @@ -8573,12 +8680,13 @@ __metadata: linkType: hard "fastify@npm:^5.2.0": - version: 5.2.0 - resolution: "fastify@npm:5.2.0" + version: 5.2.1 + resolution: "fastify@npm:5.2.1" dependencies: "@fastify/ajv-compiler": "npm:^4.0.0" "@fastify/error": "npm:^4.0.0" "@fastify/fast-json-stringify-compiler": "npm:^5.0.0" + "@fastify/proxy-addr": "npm:^5.0.0" abstract-logging: "npm:^2.0.1" avvio: "npm:^9.0.0" fast-json-stringify: "npm:^6.0.0" @@ -8586,21 +8694,20 @@ __metadata: light-my-request: "npm:^6.0.0" pino: "npm:^9.0.0" process-warning: "npm:^4.0.0" - proxy-addr: "npm:^2.0.7" rfdc: "npm:^1.3.1" secure-json-parse: "npm:^3.0.1" semver: "npm:^7.6.0" toad-cache: "npm:^3.7.0" - checksum: 10c0/9e750b451f8a5ab52f54fa1c7d9056a80d7b28750b4755595e98c0060ee0a1d92899294091a8f0a0b7554cb9418c33a4e86e7629bae365f9edbdbdf732ef32fc + checksum: 10c0/00163bcac121e5fcb097dec0230d8e7918f0d5aa4be1ddce87f6571a13d31c9691d20def5dbd12df047bc3fc372cb0a72a392feecf3e2c958dc0931e52d262cb languageName: node linkType: hard "fastq@npm:^1.17.1, fastq@npm:^1.6.0": - version: 1.18.0 - resolution: "fastq@npm:1.18.0" + version: 1.19.0 + resolution: "fastq@npm:1.19.0" dependencies: reusify: "npm:^1.0.4" - checksum: 10c0/7be87ecc41762adbddf558d24182f50a4b1a3ef3ee807d33b7623da7aee5faecdcc94fce5aa13fe91df93e269f383232bbcdb2dc5338cd1826503d6063221f36 + checksum: 10c0/d6a001638f1574a696660fcbba5300d017760432372c801632c325ca7c16819604841c92fd3ccadcdacec0966ca336363a5ff57bc5f0be335d8ea7ac6087b98f languageName: node linkType: hard @@ -8622,13 +8729,15 @@ __metadata: languageName: node linkType: hard -"fetch-blob@npm:^3.1.2, fetch-blob@npm:^3.1.4": - version: 3.2.0 - resolution: "fetch-blob@npm:3.2.0" - dependencies: - node-domexception: "npm:^1.0.0" - web-streams-polyfill: "npm:^3.0.3" - checksum: 10c0/60054bf47bfa10fb0ba6cb7742acec2f37c1f56344f79a70bb8b1c48d77675927c720ff3191fa546410a0442c998d27ab05e9144c32d530d8a52fbe68f843b69 +"fdir@npm:^6.4.3": + version: 6.4.3 + resolution: "fdir@npm:6.4.3" + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + checksum: 10c0/d13c10120e9625adf21d8d80481586200759928c19405a816b77dd28eaeb80e7c59c5def3e2941508045eb06d34eb47fad865ccc8bf98e6ab988bb0ed160fb6f languageName: node linkType: hard @@ -8754,13 +8863,13 @@ __metadata: linkType: hard "find-my-way@npm:^9.0.0": - version: 9.1.0 - resolution: "find-my-way@npm:9.1.0" + version: 9.2.0 + resolution: "find-my-way@npm:9.2.0" dependencies: fast-deep-equal: "npm:^3.1.3" fast-querystring: "npm:^1.0.0" safe-regex2: "npm:^4.0.0" - checksum: 10c0/ddde633673b512940f8d183c8684f1441d623464364f931af979a71baa0cb5b774ed574a80eaddba40fc605c7d35bc1c74c9469732eaf381a1c4a3e59611686f + checksum: 10c0/de869f044ea196493d3d8951e592e8155191cfa7ff56b49ae0aa3b7184e25a19e6931386a0b1ac0ba875648f54430b30c33610045bee0e2d0e5875b9b4fd13fb languageName: node linkType: hard @@ -8805,9 +8914,9 @@ __metadata: linkType: hard "flatted@npm:^3.2.9": - version: 3.3.2 - resolution: "flatted@npm:3.3.2" - checksum: 10c0/24cc735e74d593b6c767fe04f2ef369abe15b62f6906158079b9874bdb3ee5ae7110bb75042e70cd3f99d409d766f357caf78d5ecee9780206f5fdc5edbad334 + version: 3.3.3 + resolution: "flatted@npm:3.3.3" + checksum: 10c0/e957a1c6b0254aa15b8cce8533e24165abd98fadc98575db082b786b5da1b7d72062b81bfdcd1da2f4d46b6ed93bec2434e62333e9b4261d79ef2e75a10dd538 languageName: node linkType: hard @@ -8822,11 +8931,11 @@ __metadata: linkType: hard "for-each@npm:^0.3.3": - version: 0.3.3 - resolution: "for-each@npm:0.3.3" + version: 0.3.5 + resolution: "for-each@npm:0.3.5" dependencies: - is-callable: "npm:^1.1.3" - checksum: 10c0/22330d8a2db728dbf003ec9182c2d421fbcd2969b02b4f97ec288721cda63eb28f2c08585ddccd0f77cb2930af8d958005c9e72f47141dc51816127a118f39aa + is-callable: "npm:^1.2.7" + checksum: 10c0/0e0b50f6a843a282637d43674d1fb278dda1dd85f4f99b640024cfb10b85058aac0cc781bf689d5fe50b4b7f638e91e548560723a4e76e04fe96ae35ef039cee languageName: node linkType: hard @@ -8847,12 +8956,12 @@ __metadata: linkType: hard "foreground-child@npm:^3.1.0": - version: 3.3.0 - resolution: "foreground-child@npm:3.3.0" + version: 3.3.1 + resolution: "foreground-child@npm:3.3.1" dependencies: - cross-spawn: "npm:^7.0.0" + cross-spawn: "npm:^7.0.6" signal-exit: "npm:^4.0.1" - checksum: 10c0/028f1d41000553fcfa6c4bb5c372963bf3d9bf0b1f25a87d1a6253014343fb69dfb1b42d9625d7cf44c8ba429940f3d0ff718b62105d4d4a4f6ef8ca0a53faa2 + checksum: 10c0/8986e4af2430896e65bc2788d6679067294d6aee9545daefc84923a0a4b399ad9c7a3ea7bd8c0b2b80fdf4a92de4c69df3f628233ff3224260e9c1541a9e9ed3 languageName: node linkType: hard @@ -8864,25 +8973,27 @@ __metadata: linkType: hard "form-data@npm:^2.5.0": - version: 2.5.2 - resolution: "form-data@npm:2.5.2" + version: 2.5.3 + resolution: "form-data@npm:2.5.3" dependencies: asynckit: "npm:^0.4.0" - combined-stream: "npm:^1.0.6" - mime-types: "npm:^2.1.12" + combined-stream: "npm:^1.0.8" + es-set-tostringtag: "npm:^2.1.0" + mime-types: "npm:^2.1.35" safe-buffer: "npm:^5.2.1" - checksum: 10c0/af7cb13fc8423ff95fd59c62d101c84b5458a73e1e426b0bc459afbf5b93b1e447dc6c225ac31c6df59f36b209904a3f1a10b4eb9e7a17e0fe394019749142cc + checksum: 10c0/48b910745d4fcd403f3d6876e33082a334e712199b8c86c4eb82f6da330a59b859943999d793856758c5ff18ca5261ced4d1062235a14543022d986bd21faa7d languageName: node linkType: hard "form-data@npm:^4.0.0": - version: 4.0.1 - resolution: "form-data@npm:4.0.1" + version: 4.0.2 + resolution: "form-data@npm:4.0.2" dependencies: asynckit: "npm:^0.4.0" combined-stream: "npm:^1.0.8" + es-set-tostringtag: "npm:^2.1.0" mime-types: "npm:^2.1.12" - checksum: 10c0/bb102d570be8592c23f4ea72d7df9daa50c7792eb0cf1c5d7e506c1706e7426a4e4ae48a35b109e91c85f1c0ec63774a21ae252b66f4eb981cb8efef7d0463c8 + checksum: 10c0/e534b0cf025c831a0929bf4b9bbe1a9a6b03e273a8161f9947286b9b13bf8fb279c6944aae0070c4c311100c6d6dbb815cd955dc217728caf73fad8dc5b8ee9c languageName: node linkType: hard @@ -8897,22 +9008,6 @@ __metadata: languageName: node linkType: hard -"formdata-polyfill@npm:^4.0.10": - version: 4.0.10 - resolution: "formdata-polyfill@npm:4.0.10" - dependencies: - fetch-blob: "npm:^3.1.2" - checksum: 10c0/5392ec484f9ce0d5e0d52fb5a78e7486637d516179b0eb84d81389d7eccf9ca2f663079da56f761355c0a65792810e3b345dc24db9a8bbbcf24ef3c8c88570c6 - languageName: node - linkType: hard - -"forwarded@npm:0.2.0": - version: 0.2.0 - resolution: "forwarded@npm:0.2.0" - checksum: 10c0/9b67c3fac86acdbc9ae47ba1ddd5f2f81526fa4c8226863ede5600a3f7c7416ef451f6f1e240a3cc32d0fd79fcfe6beb08fd0da454f360032bde70bf80afbb33 - languageName: node - linkType: hard - "fraction.js@npm:^4.3.6": version: 4.3.7 resolution: "fraction.js@npm:4.3.7" @@ -8969,13 +9064,13 @@ __metadata: linkType: hard "fs-extra@npm:^11.2.0": - version: 11.2.0 - resolution: "fs-extra@npm:11.2.0" + version: 11.3.0 + resolution: "fs-extra@npm:11.3.0" dependencies: graceful-fs: "npm:^4.2.0" jsonfile: "npm:^6.0.1" universalify: "npm:^2.0.0" - checksum: 10c0/d77a9a9efe60532d2e790e938c81a02c1b24904ef7a3efb3990b835514465ba720e99a6ea56fd5e2db53b4695319b644d76d5a0e9988a2beef80aa7b1da63398 + checksum: 10c0/5f95e996186ff45463059feb115a22fb048bdaf7e487ecee8a8646c78ed8fdca63630e3077d4c16ce677051f5e60d3355a06f3cd61f3ca43f48cc58822a44d0a languageName: node linkType: hard @@ -9137,21 +9232,21 @@ __metadata: languageName: node linkType: hard -"get-intrinsic@npm:^1.2.4, get-intrinsic@npm:^1.2.5, get-intrinsic@npm:^1.2.6": - version: 1.2.6 - resolution: "get-intrinsic@npm:1.2.6" +"get-intrinsic@npm:^1.2.4, get-intrinsic@npm:^1.2.5, get-intrinsic@npm:^1.2.6, get-intrinsic@npm:^1.2.7": + version: 1.3.0 + resolution: "get-intrinsic@npm:1.3.0" dependencies: - call-bind-apply-helpers: "npm:^1.0.1" - dunder-proto: "npm:^1.0.0" + call-bind-apply-helpers: "npm:^1.0.2" es-define-property: "npm:^1.0.1" es-errors: "npm:^1.3.0" - es-object-atoms: "npm:^1.0.0" + es-object-atoms: "npm:^1.1.1" function-bind: "npm:^1.1.2" + get-proto: "npm:^1.0.1" gopd: "npm:^1.2.0" has-symbols: "npm:^1.1.0" hasown: "npm:^2.0.2" - math-intrinsics: "npm:^1.0.0" - checksum: 10c0/0f1ea6d807d97d074e8a31ac698213a12757fcfa9a8f4778263d2e4702c40fe83198aadd3dba2e99aabc2e4cf8a38345545dbb0518297d3df8b00b56a156c32a + math-intrinsics: "npm:^1.1.0" + checksum: 10c0/52c81808af9a8130f581e6a6a83e1ba4a9f703359e7a438d1369a5267a25412322f03dcbd7c549edaef0b6214a0630a28511d7df0130c93cfd380f4fa0b5b66a languageName: node linkType: hard @@ -9169,6 +9264,16 @@ __metadata: languageName: node linkType: hard +"get-proto@npm:^1.0.0, get-proto@npm:^1.0.1": + version: 1.0.1 + resolution: "get-proto@npm:1.0.1" + dependencies: + dunder-proto: "npm:^1.0.1" + es-object-atoms: "npm:^1.0.0" + checksum: 10c0/9224acb44603c5526955e83510b9da41baf6ae73f7398875fba50edc5e944223a89c4a72b070fcd78beb5f7bdda58ecb6294adc28f7acfc0da05f76a2399643c + languageName: node + linkType: hard + "get-stream@npm:^4.0.0": version: 4.1.0 resolution: "get-stream@npm:4.1.0" @@ -9205,12 +9310,12 @@ __metadata: languageName: node linkType: hard -"get-tsconfig@npm:^4.7.5": - version: 4.8.1 - resolution: "get-tsconfig@npm:4.8.1" +"get-tsconfig@npm:^4.10.0": + version: 4.10.0 + resolution: "get-tsconfig@npm:4.10.0" dependencies: resolve-pkg-maps: "npm:^1.0.0" - checksum: 10c0/536ee85d202f604f4b5fb6be81bcd6e6d9a96846811e83e9acc6de4a04fb49506edea0e1b8cf1d5ee7af33e469916ec2809d4c5445ab8ae015a7a51fbd1572f9 + checksum: 10c0/c9b5572c5118923c491c04285c73bd55b19e214992af957c502a3be0fc0043bb421386ffd45ca3433c0a7fba81221ca300479e8393960acf15d0ed4563f38a86 languageName: node linkType: hard @@ -9332,8 +9437,8 @@ __metadata: linkType: hard "glob@npm:^11.0.0": - version: 11.0.0 - resolution: "glob@npm:11.0.0" + version: 11.0.1 + resolution: "glob@npm:11.0.1" dependencies: foreground-child: "npm:^3.1.0" jackspeak: "npm:^4.0.1" @@ -9343,7 +9448,7 @@ __metadata: path-scurry: "npm:^2.0.0" bin: glob: dist/esm/bin.mjs - checksum: 10c0/419866015d8795258a8ac51de5b9d1a99c72634fc3ead93338e4da388e89773ab21681e494eac0fbc4250b003451ca3110bb4f1c9393d15d14466270094fdb4e + checksum: 10c0/2b32588be52e9e90f914c7d8dec32f3144b81b84054b0f70e9adfebf37cd7014570489f2a79d21f7801b9a4bd4cca94f426966bfd00fb64a5b705cfe10da3a03 languageName: node linkType: hard @@ -9454,7 +9559,7 @@ __metadata: languageName: node linkType: hard -"goober@npm:^2.1.10": +"goober@npm:^2.1.16": version: 2.1.16 resolution: "goober@npm:2.1.16" peerDependencies: @@ -9577,7 +9682,7 @@ __metadata: languageName: node linkType: hard -"has-tostringtag@npm:^1.0.0, has-tostringtag@npm:^1.0.2": +"has-tostringtag@npm:^1.0.2": version: 1.0.2 resolution: "has-tostringtag@npm:1.0.2" dependencies: @@ -9625,7 +9730,7 @@ __metadata: languageName: node linkType: hard -"hasown@npm:^2.0.0, hasown@npm:^2.0.1, hasown@npm:^2.0.2": +"hasown@npm:^2.0.0, hasown@npm:^2.0.2": version: 2.0.2 resolution: "hasown@npm:2.0.2" dependencies: @@ -9672,18 +9777,18 @@ __metadata: linkType: hard "hast-util-from-parse5@npm:^8.0.0": - version: 8.0.2 - resolution: "hast-util-from-parse5@npm:8.0.2" + version: 8.0.3 + resolution: "hast-util-from-parse5@npm:8.0.3" dependencies: "@types/hast": "npm:^3.0.0" "@types/unist": "npm:^3.0.0" devlop: "npm:^1.0.0" hastscript: "npm:^9.0.0" - property-information: "npm:^6.0.0" + property-information: "npm:^7.0.0" vfile: "npm:^6.0.0" vfile-location: "npm:^5.0.0" web-namespaces: "npm:^2.0.0" - checksum: 10c0/921f40d7bd71fe7415b68df5e2d53ba62f0a35808be0504fa24584e6f6a85bfbf14dc20d171c7ccc1cf84058bcc445d12a746598d324cece1ec1e52ea9d489af + checksum: 10c0/40ace6c0ad43c26f721c7499fe408e639cde917b2350c9299635e6326559855896dae3c3ebf7440df54766b96c4276a7823e8f376a2b6a28b37b591f03412545 languageName: node linkType: hard @@ -9705,9 +9810,30 @@ __metadata: languageName: node linkType: hard +"hast-util-raw@npm:^9.0.0": + version: 9.1.0 + resolution: "hast-util-raw@npm:9.1.0" + dependencies: + "@types/hast": "npm:^3.0.0" + "@types/unist": "npm:^3.0.0" + "@ungap/structured-clone": "npm:^1.0.0" + hast-util-from-parse5: "npm:^8.0.0" + hast-util-to-parse5: "npm:^8.0.0" + html-void-elements: "npm:^3.0.0" + mdast-util-to-hast: "npm:^13.0.0" + parse5: "npm:^7.0.0" + unist-util-position: "npm:^5.0.0" + unist-util-visit: "npm:^5.0.0" + vfile: "npm:^6.0.0" + web-namespaces: "npm:^2.0.0" + zwitch: "npm:^2.0.0" + checksum: 10c0/d0d909d2aedecef6a06f0005cfae410d6475e6e182d768bde30c3af9fcbbe4f9beb0522bdc21d0679cb3c243c0df40385797ed255148d68b3d3f12e82d12aacc + languageName: node + linkType: hard + "hast-util-to-jsx-runtime@npm:^2.0.0": - version: 2.3.2 - resolution: "hast-util-to-jsx-runtime@npm:2.3.2" + version: 2.3.5 + resolution: "hast-util-to-jsx-runtime@npm:2.3.5" dependencies: "@types/estree": "npm:^1.0.0" "@types/hast": "npm:^3.0.0" @@ -9719,12 +9845,27 @@ __metadata: mdast-util-mdx-expression: "npm:^2.0.0" mdast-util-mdx-jsx: "npm:^3.0.0" mdast-util-mdxjs-esm: "npm:^2.0.0" - property-information: "npm:^6.0.0" + property-information: "npm:^7.0.0" space-separated-tokens: "npm:^2.0.0" style-to-object: "npm:^1.0.0" unist-util-position: "npm:^5.0.0" vfile-message: "npm:^4.0.0" - checksum: 10c0/97761b2a48b8bc37da3d66cb4872312ae06c6e8f9be59e33b04b21fa5af371a39cb23b3ca165dd8e898ba1caf9b76399da35c957e68bad02a587a3a324216d56 + checksum: 10c0/9db65b2b417cdaad1f1cc619b613abd8d1fa7196f5979ce54bd1dc8a937613f11fecb8b7a43425342cf36fd085b0fed89daadcce43bed8762786a4cdc21a1df8 + languageName: node + linkType: hard + +"hast-util-to-parse5@npm:^8.0.0": + version: 8.0.0 + resolution: "hast-util-to-parse5@npm:8.0.0" + dependencies: + "@types/hast": "npm:^3.0.0" + comma-separated-tokens: "npm:^2.0.0" + devlop: "npm:^1.0.0" + property-information: "npm:^6.0.0" + space-separated-tokens: "npm:^2.0.0" + web-namespaces: "npm:^2.0.0" + zwitch: "npm:^2.0.0" + checksum: 10c0/3c0c7fba026e0c4be4675daf7277f9ff22ae6da801435f1b7104f7740de5422576f1c025023c7b3df1d0a161e13a04c6ab8f98ada96eb50adb287b537849a2bd languageName: node linkType: hard @@ -9750,22 +9891,22 @@ __metadata: linkType: hard "hastscript@npm:^9.0.0": - version: 9.0.0 - resolution: "hastscript@npm:9.0.0" + version: 9.0.1 + resolution: "hastscript@npm:9.0.1" dependencies: "@types/hast": "npm:^3.0.0" comma-separated-tokens: "npm:^2.0.0" hast-util-parse-selector: "npm:^4.0.0" - property-information: "npm:^6.0.0" + property-information: "npm:^7.0.0" space-separated-tokens: "npm:^2.0.0" - checksum: 10c0/66eff826846c55482052ebbc99b6881c14aff6421526634f4c95318ba1d0d1f1bbf5aa38446f388943c0f32d5383fa38740c972b37678dd1cd0c82e6e5807fbf + checksum: 10c0/18dc8064e5c3a7a2ae862978e626b97a254e1c8a67ee9d0c9f06d373bba155ed805fc5b5ce21b990fb7bc174624889e5e1ce1cade264f1b1d58b48f994bc85ce languageName: node linkType: hard "highlight.js@npm:^11.10.0, highlight.js@npm:~11.11.0": - version: 11.11.0 - resolution: "highlight.js@npm:11.11.0" - checksum: 10c0/32288dd342ed182c0170459beaedd5b02b7c2ffb3a6b1ce6e078124b1debfa0d92aa905f0d2e7a855d2ec7cd38ded473e4a6242bf111bc39625dca61ae0c1be1 + version: 11.11.1 + resolution: "highlight.js@npm:11.11.1" + checksum: 10c0/40f53ac19dac079891fcefd5bd8a21cf2e8931fd47da5bd1dca73b7e4375c1defed0636fc39120c639b9c44119b7d110f7f0c15aa899557a5a1c8910f3c0144c languageName: node linkType: hard @@ -9819,6 +9960,13 @@ __metadata: languageName: node linkType: hard +"html-void-elements@npm:^3.0.0": + version: 3.0.0 + resolution: "html-void-elements@npm:3.0.0" + checksum: 10c0/a8b9ec5db23b7c8053876dad73a0336183e6162bf6d2677376d8b38d654fdc59ba74fdd12f8812688f7db6fad451210c91b300e472afc0909224e0a44c8610d2 + languageName: node + linkType: hard + "http-cache-semantics@npm:^4.0.0, http-cache-semantics@npm:^4.1.1": version: 4.1.1 resolution: "http-cache-semantics@npm:4.1.1" @@ -10024,12 +10172,12 @@ __metadata: linkType: hard "import-fresh@npm:^3.2.1": - version: 3.3.0 - resolution: "import-fresh@npm:3.3.0" + version: 3.3.1 + resolution: "import-fresh@npm:3.3.1" dependencies: parent-module: "npm:^1.0.0" resolve-from: "npm:^4.0.0" - checksum: 10c0/7f882953aa6b740d1f0e384d0547158bc86efbf2eea0f1483b8900a6f65c5a5123c2cf09b0d542cc419d0b98a759ecaeb394237e97ea427f2da221dc3cd80cc3 + checksum: 10c0/bf8cc494872fef783249709385ae883b447e3eb09db0ebd15dcead7d9afe7224dad7bd7591c6b73b0b19b3c0f9640eb8ee884f01cfaf2887ab995b0b36a0cbec languageName: node linkType: hard @@ -10141,10 +10289,10 @@ __metadata: languageName: node linkType: hard -"ipaddr.js@npm:1.9.1": - version: 1.9.1 - resolution: "ipaddr.js@npm:1.9.1" - checksum: 10c0/0486e775047971d3fdb5fb4f063829bac45af299ae0b82dcf3afa2145338e08290563a2a70f34b732d795ecc8311902e541a8530eeb30d75860a78ff4e94ce2a +"ipaddr.js@npm:^2.1.0": + version: 2.2.0 + resolution: "ipaddr.js@npm:2.2.0" + checksum: 10c0/e4ee875dc1bd92ac9d27e06cfd87cdb63ca786ff9fd7718f1d4f7a8ef27db6e5d516128f52d2c560408cbb75796ac2f83ead669e73507c86282d45f84c5abbb6 languageName: node linkType: hard @@ -10193,11 +10341,15 @@ __metadata: linkType: hard "is-async-function@npm:^2.0.0": - version: 2.0.0 - resolution: "is-async-function@npm:2.0.0" + version: 2.1.1 + resolution: "is-async-function@npm:2.1.1" dependencies: - has-tostringtag: "npm:^1.0.0" - checksum: 10c0/787bc931576aad525d751fc5ce211960fe91e49ac84a5c22d6ae0bc9541945fbc3f686dc590c3175722ce4f6d7b798a93f6f8ff4847fdb2199aea6f4baf5d668 + async-function: "npm:^1.0.0" + call-bound: "npm:^1.0.3" + get-proto: "npm:^1.0.1" + has-tostringtag: "npm:^1.0.2" + safe-regex-test: "npm:^1.1.0" + checksum: 10c0/d70c236a5e82de6fc4d44368ffd0c2fee2b088b893511ce21e679da275a5ecc6015ff59a7d7e1bdd7ca39f71a8dbdd253cf8cce5c6b3c91cdd5b42b5ce677298 languageName: node linkType: hard @@ -10229,12 +10381,12 @@ __metadata: linkType: hard "is-boolean-object@npm:^1.2.1": - version: 1.2.1 - resolution: "is-boolean-object@npm:1.2.1" + version: 1.2.2 + resolution: "is-boolean-object@npm:1.2.2" dependencies: - call-bound: "npm:^1.0.2" + call-bound: "npm:^1.0.3" has-tostringtag: "npm:^1.0.2" - checksum: 10c0/2ef601d255a39fdbde79cfe6be80c27b47430ed6712407f29b17d002e20f64c1e3d6692f1d842ba16bf1e9d8ddf1c4f13cac3ed7d9a4a21290f44879ebb4e8f5 + checksum: 10c0/36ff6baf6bd18b3130186990026f5a95c709345c39cd368468e6c1b6ab52201e9fd26d8e1f4c066357b4938b0f0401e1a5000e08257787c1a02f3a719457001e languageName: node linkType: hard @@ -10263,7 +10415,7 @@ __metadata: languageName: node linkType: hard -"is-callable@npm:^1.1.3, is-callable@npm:^1.2.7": +"is-callable@npm:^1.2.7": version: 1.2.7 resolution: "is-callable@npm:1.2.7" checksum: 10c0/ceebaeb9d92e8adee604076971dd6000d38d6afc40bb843ea8e45c5579b57671c3f3b50d7f04869618242c6cee08d1b67806a8cb8edaaaf7c0748b3720d6066f @@ -10433,11 +10585,14 @@ __metadata: linkType: hard "is-generator-function@npm:^1.0.10": - version: 1.0.10 - resolution: "is-generator-function@npm:1.0.10" + version: 1.1.0 + resolution: "is-generator-function@npm:1.1.0" dependencies: - has-tostringtag: "npm:^1.0.0" - checksum: 10c0/df03514df01a6098945b5a0cfa1abff715807c8e72f57c49a0686ad54b3b74d394e2d8714e6f709a71eb00c9630d48e73ca1796c1ccc84ac95092c1fecc0d98b + call-bound: "npm:^1.0.3" + get-proto: "npm:^1.0.0" + has-tostringtag: "npm:^1.0.2" + safe-regex-test: "npm:^1.1.0" + checksum: 10c0/fdfa96c8087bf36fc4cd514b474ba2ff404219a4dd4cfa6cf5426404a1eed259bdcdb98f082a71029a48d01f27733e3436ecc6690129a7ec09cb0434bee03a2a languageName: node linkType: hard @@ -10718,11 +10873,11 @@ __metadata: linkType: hard "is-weakref@npm:^1.0.2, is-weakref@npm:^1.1.0": - version: 1.1.0 - resolution: "is-weakref@npm:1.1.0" + version: 1.1.1 + resolution: "is-weakref@npm:1.1.1" dependencies: - call-bound: "npm:^1.0.2" - checksum: 10c0/aa835f62e29cb60132ecb3ec7d11bd0f39ec7322325abe8412b805aef47153ec2daefdb21759b049711c674f49b13202a31d8d126bcdff7d8671c78babd4ae5b + call-bound: "npm:^1.0.3" + checksum: 10c0/8e0a9c07b0c780949a100e2cab2b5560a48ecd4c61726923c1a9b77b6ab0aa0046c9e7fb2206042296817045376dee2c8ab1dabe08c7c3dfbf195b01275a085b languageName: node linkType: hard @@ -10904,16 +11059,16 @@ __metadata: linkType: hard "iterator.prototype@npm:^1.1.4": - version: 1.1.4 - resolution: "iterator.prototype@npm:1.1.4" + version: 1.1.5 + resolution: "iterator.prototype@npm:1.1.5" dependencies: define-data-property: "npm:^1.1.4" es-object-atoms: "npm:^1.0.0" get-intrinsic: "npm:^1.2.6" + get-proto: "npm:^1.0.0" has-symbols: "npm:^1.1.0" - reflect.getprototypeof: "npm:^1.0.8" set-function-name: "npm:^2.0.2" - checksum: 10c0/e63fcb5c1094192f43795b836fae9149a7dc2d445425958045e8e193df428407f909efca21bfdf0d885668ae8204681984afac7dd75478118e62f3cd3959c538 + checksum: 10c0/f7a262808e1b41049ab55f1e9c29af7ec1025a000d243b83edf34ce2416eedd56079b117fa59376bb4a724110690f13aa8427f2ee29a09eec63a7e72367626d0 languageName: node linkType: hard @@ -10944,11 +11099,11 @@ __metadata: linkType: hard "jackspeak@npm:^4.0.1": - version: 4.0.2 - resolution: "jackspeak@npm:4.0.2" + version: 4.1.0 + resolution: "jackspeak@npm:4.1.0" dependencies: "@isaacs/cliui": "npm:^8.0.2" - checksum: 10c0/b26039d11c0163a95b1e58851b9ac453cce64ad6d1eb98a00b303ad5eeb761b29d33c9419d1e16c016d3f7151c8edf7df223e6cf93a1907655fd95d6ce85c0de + checksum: 10c0/08a6a24a366c90b83aef3ad6ec41dcaaa65428ffab8d80bc7172add0fbb8b134a34f415ad288b2a6fbd406526e9a62abdb40ed4f399fbe00cb45c44056d4dce0 languageName: node linkType: hard @@ -11007,7 +11162,6 @@ __metadata: eslint: "npm:8.57.0" eslint-plugin-react: "npm:^7.34.0" fs-extra: "npm:^11.2.0" - node-fetch: "npm:2" pacote: "npm:^21.0.0" request: "npm:^2.88.2" request-progress: "npm:^3.0.0" @@ -11417,17 +11571,17 @@ __metadata: linkType: hard "jest-transform-css@npm:^6.0.1": - version: 6.0.1 - resolution: "jest-transform-css@npm:6.0.1" + version: 6.0.2 + resolution: "jest-transform-css@npm:6.0.2" dependencies: common-tags: "npm:1.8.2" - cross-spawn: "npm:7.0.3" + cross-spawn: "npm:^7.0.6" postcss-load-config: "npm:4.0.1" postcss-modules: "npm:4.3.1" style-inject: "npm:0.3.0" peerDependencies: postcss: ^8.4.12 - checksum: 10c0/96069345184e391bc0a753533b68187a6051f1eda8168a0420387b13775f1824978f4abc151dae913b50c55f32adaba1590a771f296f207b8f13c6f31938bf50 + checksum: 10c0/9f577efee31528f8903e0bd34c47c9569ffd043373ec7d499586f591053c977c38d017f6b6ef5c8e6f374c7d9e7ce7f66cbeb210a702c7c0b96d94dc7958bf79 languageName: node linkType: hard @@ -11541,8 +11695,8 @@ __metadata: linkType: hard "jotai@npm:^2.6.0": - version: 2.11.0 - resolution: "jotai@npm:2.11.0" + version: 2.12.1 + resolution: "jotai@npm:2.12.1" peerDependencies: "@types/react": ">=17.0.0" react: ">=17.0.0" @@ -11551,7 +11705,7 @@ __metadata: optional: true react: optional: true - checksum: 10c0/4c08ae1c5576788454c1dd00ce5c0c6d10f37041828e6fee4ac5041ec22d9d9a819b836cabcb8155b9778a7459614f72937a01ce2b9d7ddb6c0813451efb1b25 + checksum: 10c0/8ef622b7d626919d87595d7382467cb81698a14925befdd27abc3b03d441077eca35328d51d10dc6fe3e91ee4d4e9ba7456bacbdf36940161bd2afeba861ac83 languageName: node linkType: hard @@ -11682,23 +11836,23 @@ __metadata: languageName: node linkType: hard -"json-schema-ref-resolver@npm:^1.0.1": - version: 1.0.1 - resolution: "json-schema-ref-resolver@npm:1.0.1" +"json-schema-ref-resolver@npm:^2.0.0": + version: 2.0.1 + resolution: "json-schema-ref-resolver@npm:2.0.1" dependencies: - fast-deep-equal: "npm:^3.1.3" - checksum: 10c0/aa89d88108c0109ae35b913c89c132fb50c00f3b99fc8a8309b524b9e3a6a77414f19a6a35a1253871462984cbabc74279ebbd9bf103c6629fb7b37c9fb59bcf + dequal: "npm:^2.0.3" + checksum: 10c0/3ea894d79dd176b4ef31f1a3b7b335447b854780f2bc49af2918de0502d3eabad1889232a7a72c37f1c7ca429acc2eaad940ca5fd25f8ead044d5fecb00e0378 languageName: node linkType: hard -"json-schema-resolver@npm:^2.0.0": - version: 2.0.0 - resolution: "json-schema-resolver@npm:2.0.0" +"json-schema-resolver@npm:^3.0.0": + version: 3.0.0 + resolution: "json-schema-resolver@npm:3.0.0" dependencies: debug: "npm:^4.1.1" + fast-uri: "npm:^3.0.5" rfdc: "npm:^1.1.4" - uri-js: "npm:^4.2.2" - checksum: 10c0/d838ae7e955ed7a16cb45702abecf302a656d0ba7bb30843947ffc2d1c9554bcd18b93afa1132ab1e519ae2b0b7ef621d720efb82c5516978ac94532d3a39f07 + checksum: 10c0/f84edefb65da8833ee5949415abf599ebe18bec82ebf8f154b3565490552eaf1d9c6389d7310e5cdb611a21e655baaf20025f005c9222885ab69a092afd3f011 languageName: node linkType: hard @@ -11854,13 +12008,13 @@ __metadata: linkType: hard "katex@npm:^0.16.0, katex@npm:^0.16.10": - version: 0.16.18 - resolution: "katex@npm:0.16.18" + version: 0.16.21 + resolution: "katex@npm:0.16.21" dependencies: commander: "npm:^8.3.0" bin: katex: cli.js - checksum: 10c0/f80844710ae28d435395df522cf2439ce1be240cb5e7196e569e16459f705c232cd1335ff96bb6a76a3a87962ddebeb7e212e25271f11ad8f80a30dec575ba53 + checksum: 10c0/e2e4139ba72a13f2393308fbb2b4c5511611a19a40a6e39d956cf775e553af3517dbfd0a54477faaf401c923e4654e32296347846b8ff15dfa579f88ff8579bb languageName: node linkType: hard @@ -11971,13 +12125,13 @@ __metadata: linkType: hard "light-my-request@npm:^6.0.0": - version: 6.4.0 - resolution: "light-my-request@npm:6.4.0" + version: 6.6.0 + resolution: "light-my-request@npm:6.6.0" dependencies: cookie: "npm:^1.0.1" process-warning: "npm:^4.0.0" set-cookie-parser: "npm:^2.6.0" - checksum: 10c0/bdcd3afcfe14ebf0b910964a71a2b4e68fc9dc05f8e92709a3065a603502babdf58c2dbf6897b7c04577debcc9aa968bfa85a7a5b99248a6b6a9ea8290c39053 + checksum: 10c0/1440853cd3822ab83fbb1be4456099082dec8e9e3a4ea35c9d8d7d17a7ab98c83ad0a4c39a73a8c2b31b9ca70c57506e5b7a929495c149463ca0daca0d90dc6f languageName: node linkType: hard @@ -12286,7 +12440,7 @@ __metadata: languageName: node linkType: hard -"make-fetch-happen@npm:^14.0.0, make-fetch-happen@npm:^14.0.1, make-fetch-happen@npm:^14.0.3": +"make-fetch-happen@npm:^14.0.0, make-fetch-happen@npm:^14.0.1, make-fetch-happen@npm:^14.0.2, make-fetch-happen@npm:^14.0.3": version: 14.0.3 resolution: "make-fetch-happen@npm:14.0.3" dependencies: @@ -12330,6 +12484,13 @@ __metadata: languageName: node linkType: hard +"markdown-table@npm:^3.0.0": + version: 3.0.4 + resolution: "markdown-table@npm:3.0.4" + checksum: 10c0/1257b31827629a54c24a5030a3dac952256c559174c95ce3ef89bebd6bff0cb1444b1fd667b1a1bb53307f83278111505b3e26f0c4e7b731e0060d435d2d930b + languageName: node + linkType: hard + "marked@npm:^9.1.2": version: 9.1.6 resolution: "marked@npm:9.1.6" @@ -12348,7 +12509,7 @@ __metadata: languageName: node linkType: hard -"math-intrinsics@npm:^1.0.0, math-intrinsics@npm:^1.1.0": +"math-intrinsics@npm:^1.1.0": version: 1.1.0 resolution: "math-intrinsics@npm:1.1.0" checksum: 10c0/7579ff94e899e2f76ab64491d76cf606274c874d8f2af4a442c016bd85688927fcfca157ba6bf74b08e9439dc010b248ce05b96cc7c126a354c3bae7fcb48b7f @@ -12374,6 +12535,18 @@ __metadata: languageName: node linkType: hard +"mdast-util-find-and-replace@npm:^3.0.0": + version: 3.0.2 + resolution: "mdast-util-find-and-replace@npm:3.0.2" + dependencies: + "@types/mdast": "npm:^4.0.0" + escape-string-regexp: "npm:^5.0.0" + unist-util-is: "npm:^6.0.0" + unist-util-visit-parents: "npm:^6.0.0" + checksum: 10c0/c8417a35605d567772ff5c1aa08363ff3010b0d60c8ea68c53cba09bf25492e3dd261560425c1756535f3b7107f62e7ff3857cdd8fb1e62d1b2cc2ea6e074ca2 + languageName: node + linkType: hard + "mdast-util-from-markdown@npm:^2.0.0": version: 2.0.2 resolution: "mdast-util-from-markdown@npm:2.0.2" @@ -12394,6 +12567,83 @@ __metadata: languageName: node linkType: hard +"mdast-util-gfm-autolink-literal@npm:^2.0.0": + version: 2.0.1 + resolution: "mdast-util-gfm-autolink-literal@npm:2.0.1" + dependencies: + "@types/mdast": "npm:^4.0.0" + ccount: "npm:^2.0.0" + devlop: "npm:^1.0.0" + mdast-util-find-and-replace: "npm:^3.0.0" + micromark-util-character: "npm:^2.0.0" + checksum: 10c0/963cd22bd42aebdec7bdd0a527c9494d024d1ad0739c43dc040fee35bdfb5e29c22564330a7418a72b5eab51d47a6eff32bc0255ef3ccb5cebfe8970e91b81b6 + languageName: node + linkType: hard + +"mdast-util-gfm-footnote@npm:^2.0.0": + version: 2.1.0 + resolution: "mdast-util-gfm-footnote@npm:2.1.0" + dependencies: + "@types/mdast": "npm:^4.0.0" + devlop: "npm:^1.1.0" + mdast-util-from-markdown: "npm:^2.0.0" + mdast-util-to-markdown: "npm:^2.0.0" + micromark-util-normalize-identifier: "npm:^2.0.0" + checksum: 10c0/8ab965ee6be3670d76ec0e95b2ba3101fc7444eec47564943ab483d96ac17d29da2a4e6146a2a288be30c21b48c4f3938a1e54b9a46fbdd321d49a5bc0077ed0 + languageName: node + linkType: hard + +"mdast-util-gfm-strikethrough@npm:^2.0.0": + version: 2.0.0 + resolution: "mdast-util-gfm-strikethrough@npm:2.0.0" + dependencies: + "@types/mdast": "npm:^4.0.0" + mdast-util-from-markdown: "npm:^2.0.0" + mdast-util-to-markdown: "npm:^2.0.0" + checksum: 10c0/b053e93d62c7545019bd914271ea9e5667ad3b3b57d16dbf68e56fea39a7e19b4a345e781312714eb3d43fdd069ff7ee22a3ca7f6149dfa774554f19ce3ac056 + languageName: node + linkType: hard + +"mdast-util-gfm-table@npm:^2.0.0": + version: 2.0.0 + resolution: "mdast-util-gfm-table@npm:2.0.0" + dependencies: + "@types/mdast": "npm:^4.0.0" + devlop: "npm:^1.0.0" + markdown-table: "npm:^3.0.0" + mdast-util-from-markdown: "npm:^2.0.0" + mdast-util-to-markdown: "npm:^2.0.0" + checksum: 10c0/128af47c503a53bd1c79f20642561e54a510ad5e2db1e418d28fefaf1294ab839e6c838e341aef5d7e404f9170b9ca3d1d89605f234efafde93ee51174a6e31e + languageName: node + linkType: hard + +"mdast-util-gfm-task-list-item@npm:^2.0.0": + version: 2.0.0 + resolution: "mdast-util-gfm-task-list-item@npm:2.0.0" + dependencies: + "@types/mdast": "npm:^4.0.0" + devlop: "npm:^1.0.0" + mdast-util-from-markdown: "npm:^2.0.0" + mdast-util-to-markdown: "npm:^2.0.0" + checksum: 10c0/258d725288482b636c0a376c296431390c14b4f29588675297cb6580a8598ed311fc73ebc312acfca12cc8546f07a3a285a53a3b082712e2cbf5c190d677d834 + languageName: node + linkType: hard + +"mdast-util-gfm@npm:^3.0.0": + version: 3.1.0 + resolution: "mdast-util-gfm@npm:3.1.0" + dependencies: + mdast-util-from-markdown: "npm:^2.0.0" + mdast-util-gfm-autolink-literal: "npm:^2.0.0" + mdast-util-gfm-footnote: "npm:^2.0.0" + mdast-util-gfm-strikethrough: "npm:^2.0.0" + mdast-util-gfm-table: "npm:^2.0.0" + mdast-util-gfm-task-list-item: "npm:^2.0.0" + mdast-util-to-markdown: "npm:^2.0.0" + checksum: 10c0/4bedcfb6a20e39901c8772f0d2bb2d7a64ae87a54c13cbd92eec062cf470fbb68c2ad754e149af5b30794e2de61c978ab1de1ace03c0c40f443ca9b9b8044f81 + languageName: node + linkType: hard + "mdast-util-math@npm:^3.0.0": version: 3.0.0 resolution: "mdast-util-math@npm:3.0.0" @@ -12424,8 +12674,8 @@ __metadata: linkType: hard "mdast-util-mdx-jsx@npm:^3.0.0": - version: 3.1.3 - resolution: "mdast-util-mdx-jsx@npm:3.1.3" + version: 3.2.0 + resolution: "mdast-util-mdx-jsx@npm:3.2.0" dependencies: "@types/estree-jsx": "npm:^1.0.0" "@types/hast": "npm:^3.0.0" @@ -12439,7 +12689,7 @@ __metadata: stringify-entities: "npm:^4.0.0" unist-util-stringify-position: "npm:^4.0.0" vfile-message: "npm:^4.0.0" - checksum: 10c0/1b0b64215efbbbb1ee9ba2a2b3e5f11859dada7dff162949a0d503aefbd75c0308f17d404df126c54acea06d2224905915b2cac2e6c999514c919bd963b8de24 + checksum: 10c0/3acadaf3b962254f7ad2990fed4729961dc0217ca31fde9917986e880843f3ecf3392b1f22d569235cacd180d50894ad266db7af598aedca69d330d33c7ac613 languageName: node linkType: hard @@ -12562,6 +12812,99 @@ __metadata: languageName: node linkType: hard +"micromark-extension-gfm-autolink-literal@npm:^2.0.0": + version: 2.1.0 + resolution: "micromark-extension-gfm-autolink-literal@npm:2.1.0" + dependencies: + micromark-util-character: "npm:^2.0.0" + micromark-util-sanitize-uri: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + checksum: 10c0/84e6fbb84ea7c161dfa179665dc90d51116de4c28f3e958260c0423e5a745372b7dcbc87d3cde98213b532e6812f847eef5ae561c9397d7f7da1e59872ef3efe + languageName: node + linkType: hard + +"micromark-extension-gfm-footnote@npm:^2.0.0": + version: 2.1.0 + resolution: "micromark-extension-gfm-footnote@npm:2.1.0" + dependencies: + devlop: "npm:^1.0.0" + micromark-core-commonmark: "npm:^2.0.0" + micromark-factory-space: "npm:^2.0.0" + micromark-util-character: "npm:^2.0.0" + micromark-util-normalize-identifier: "npm:^2.0.0" + micromark-util-sanitize-uri: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + checksum: 10c0/d172e4218968b7371b9321af5cde8c77423f73b233b2b0fcf3ff6fd6f61d2e0d52c49123a9b7910612478bf1f0d5e88c75a3990dd68f70f3933fe812b9f77edc + languageName: node + linkType: hard + +"micromark-extension-gfm-strikethrough@npm:^2.0.0": + version: 2.1.0 + resolution: "micromark-extension-gfm-strikethrough@npm:2.1.0" + dependencies: + devlop: "npm:^1.0.0" + micromark-util-chunked: "npm:^2.0.0" + micromark-util-classify-character: "npm:^2.0.0" + micromark-util-resolve-all: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + checksum: 10c0/ef4f248b865bdda71303b494671b7487808a340b25552b11ca6814dff3fcfaab9be8d294643060bbdb50f79313e4a686ab18b99cbe4d3ee8a4170fcd134234fb + languageName: node + linkType: hard + +"micromark-extension-gfm-table@npm:^2.0.0": + version: 2.1.1 + resolution: "micromark-extension-gfm-table@npm:2.1.1" + dependencies: + devlop: "npm:^1.0.0" + micromark-factory-space: "npm:^2.0.0" + micromark-util-character: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + checksum: 10c0/04bc00e19b435fa0add62cd029d8b7eb6137522f77832186b1d5ef34544a9bd030c9cf85e92ddfcc5c31f6f0a58a43d4b96dba4fc21316037c734630ee12c912 + languageName: node + linkType: hard + +"micromark-extension-gfm-tagfilter@npm:^2.0.0": + version: 2.0.0 + resolution: "micromark-extension-gfm-tagfilter@npm:2.0.0" + dependencies: + micromark-util-types: "npm:^2.0.0" + checksum: 10c0/995558843fff137ae4e46aecb878d8a4691cdf23527dcf1e2f0157d66786be9f7bea0109c52a8ef70e68e3f930af811828ba912239438e31a9cfb9981f44d34d + languageName: node + linkType: hard + +"micromark-extension-gfm-task-list-item@npm:^2.0.0": + version: 2.1.0 + resolution: "micromark-extension-gfm-task-list-item@npm:2.1.0" + dependencies: + devlop: "npm:^1.0.0" + micromark-factory-space: "npm:^2.0.0" + micromark-util-character: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + checksum: 10c0/78aa537d929e9309f076ba41e5edc99f78d6decd754b6734519ccbbfca8abd52e1c62df68d41a6ae64d2a3fc1646cea955893c79680b0b4385ced4c52296181f + languageName: node + linkType: hard + +"micromark-extension-gfm@npm:^3.0.0": + version: 3.0.0 + resolution: "micromark-extension-gfm@npm:3.0.0" + dependencies: + micromark-extension-gfm-autolink-literal: "npm:^2.0.0" + micromark-extension-gfm-footnote: "npm:^2.0.0" + micromark-extension-gfm-strikethrough: "npm:^2.0.0" + micromark-extension-gfm-table: "npm:^2.0.0" + micromark-extension-gfm-tagfilter: "npm:^2.0.0" + micromark-extension-gfm-task-list-item: "npm:^2.0.0" + micromark-util-combine-extensions: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + checksum: 10c0/970e28df6ebdd7c7249f52a0dda56e0566fbfa9ae56c8eeeb2445d77b6b89d44096880cd57a1c01e7821b1f4e31009109fbaca4e89731bff7b83b8519690e5d9 + languageName: node + linkType: hard + "micromark-extension-math@npm:^3.0.0": version: 3.1.0 resolution: "micromark-extension-math@npm:3.1.0" @@ -12739,14 +13082,14 @@ __metadata: linkType: hard "micromark-util-subtokenize@npm:^2.0.0": - version: 2.0.3 - resolution: "micromark-util-subtokenize@npm:2.0.3" + version: 2.0.4 + resolution: "micromark-util-subtokenize@npm:2.0.4" dependencies: devlop: "npm:^1.0.0" micromark-util-chunked: "npm:^2.0.0" micromark-util-symbol: "npm:^2.0.0" micromark-util-types: "npm:^2.0.0" - checksum: 10c0/75501986ecb02a6f06c0f3e58b584ae3ff3553b520260e8ce27d2db8c79b8888861dd9d3b26e30f5c6084fddd90f96dc3ff551f02c2ac4d669ebe920e483b6d6 + checksum: 10c0/d1d19c6ede87e5d3778aa7f6c56ad736a48404556757abf71ea87bd2baac71927d18db3c9a1f76c4b3f42f32d6032aea97d1de739b49872daf168c6f8f373f39 languageName: node linkType: hard @@ -12868,7 +13211,7 @@ __metadata: languageName: node linkType: hard -"mime-types@npm:^2.1.12, mime-types@npm:~2.1.19": +"mime-types@npm:^2.1.12, mime-types@npm:^2.1.35, mime-types@npm:~2.1.19": version: 2.1.35 resolution: "mime-types@npm:2.1.35" dependencies: @@ -13166,12 +13509,12 @@ __metadata: languageName: node linkType: hard -"mnemonist@npm:0.39.8": - version: 0.39.8 - resolution: "mnemonist@npm:0.39.8" +"mnemonist@npm:0.40.0": + version: 0.40.0 + resolution: "mnemonist@npm:0.40.0" dependencies: - obliterator: "npm:^2.0.1" - checksum: 10c0/fa810768d290919c4ecd3f8ba5c8458bc45df08d1c72fac8f3897721cd90ab42ee1c642cc5208cfd649d40222998dc011127702117c0ca676f243cc80f42cc11 + obliterator: "npm:^2.0.4" + checksum: 10c0/7ab0a00cfe07a5beaf13c3b39e5275db422761aeebf37fd6f8561133a4c991ea558a51a3a26ff64db41ce18acadda997281cacb5b67649b098cdb9cdb1a00fe8 languageName: node linkType: hard @@ -13215,15 +13558,15 @@ __metadata: linkType: hard "nan@npm:^2.12.1": - version: 2.22.0 - resolution: "nan@npm:2.22.0" + version: 2.22.1 + resolution: "nan@npm:2.22.1" dependencies: node-gyp: "npm:latest" - checksum: 10c0/d5d31aefdb218deba308d44867c5f432b4d3aabeb57c70a2b236d62652e9fee7044e5d5afd380d9fef022fe7ebb2f2d6c85ca3cbcac5031aaca3592c844526bb + checksum: 10c0/582c3cce9cf436cc577d57d3362aeaf891dd5b62616c337ec9f4009b2c5f77f82f79707e6d4b68a34e6a443f1d34a61a586d1bf16cdde9eeba5259f45116d569 languageName: node linkType: hard -"nanoid@npm:^3.3.6, nanoid@npm:^3.3.7": +"nanoid@npm:^3.3.6, nanoid@npm:^3.3.8": version: 3.3.8 resolution: "nanoid@npm:3.3.8" bin: @@ -13232,12 +13575,12 @@ __metadata: languageName: node linkType: hard -"nanoid@npm:^5.0.0": - version: 5.0.9 - resolution: "nanoid@npm:5.0.9" +"nanoid@npm:^5.0.9": + version: 5.1.2 + resolution: "nanoid@npm:5.1.2" bin: nanoid: bin/nanoid.js - checksum: 10c0/a2d9710525d4998a8a1610bbe6eb9a92c254ebab7c567c1ab429046fe7eed9c4df3508b59fb44c58ffdc98edb28dd6f953715c14b64ea0a3a2ce37420cdfeefd + checksum: 10c0/60b3d30d1629704f4b156f79e53a454d10440a38f4ab14cda1c9aa08091389212d03afb35fbc09c11f4619f83bcf5076abc4719295e3b79c57abad0e40297177 languageName: node linkType: hard @@ -13400,25 +13743,7 @@ __metadata: languageName: node linkType: hard -"node-domexception@npm:^1.0.0": - version: 1.0.0 - resolution: "node-domexception@npm:1.0.0" - checksum: 10c0/5e5d63cda29856402df9472335af4bb13875e1927ad3be861dc5ebde38917aecbf9ae337923777af52a48c426b70148815e890a5d72760f1b4d758cc671b1a2b - languageName: node - linkType: hard - -"node-fetch@npm:*": - version: 3.3.2 - resolution: "node-fetch@npm:3.3.2" - dependencies: - data-uri-to-buffer: "npm:^4.0.0" - fetch-blob: "npm:^3.1.4" - formdata-polyfill: "npm:^4.0.10" - checksum: 10c0/f3d5e56190562221398c9f5750198b34cf6113aa304e34ee97c94fd300ec578b25b2c2906edba922050fce983338fde0d5d34fcb0fc3336ade5bd0e429ad7538 - languageName: node - linkType: hard - -"node-fetch@npm:2, node-fetch@npm:^2.6.1": +"node-fetch@npm:^2.6.1": version: 2.7.0 resolution: "node-fetch@npm:2.7.0" dependencies: @@ -13464,8 +13789,8 @@ __metadata: linkType: hard "node-gyp@npm:^11.0.0, node-gyp@npm:latest": - version: 11.0.0 - resolution: "node-gyp@npm:11.0.0" + version: 11.1.0 + resolution: "node-gyp@npm:11.1.0" dependencies: env-paths: "npm:^2.2.0" exponential-backoff: "npm:^3.1.1" @@ -13479,7 +13804,7 @@ __metadata: which: "npm:^5.0.0" bin: node-gyp: bin/node-gyp.js - checksum: 10c0/a3b885bbee2d271f1def32ba2e30ffcf4562a3db33af06b8b365e053153e2dd2051b9945783c3c8e852d26a0f20f65b251c7e83361623383a99635c0280ee573 + checksum: 10c0/c38977ce502f1ea41ba2b8721bd5b49bc3d5b3f813eabfac8414082faf0620ccb5211e15c4daecc23ed9f5e3e9cc4da00e575a0bcfc2a95a069294f2afa1e0cd languageName: node linkType: hard @@ -13509,13 +13834,13 @@ __metadata: linkType: hard "nopt@npm:^8.0.0": - version: 8.0.0 - resolution: "nopt@npm:8.0.0" + version: 8.1.0 + resolution: "nopt@npm:8.1.0" dependencies: - abbrev: "npm:^2.0.0" + abbrev: "npm:^3.0.0" bin: nopt: bin/nopt.js - checksum: 10c0/19cb986f79abaca2d0f0b560021da7b32ee6fcc3de48f3eaeb0c324d36755c17754f886a754c091f01f740c17caf7d6aea8237b7fbaf39f476ae5e30a249f18f + checksum: 10c0/62e9ea70c7a3eb91d162d2c706b6606c041e4e7b547cbbb48f8b3695af457dd6479904d7ace600856bf923dd8d1ed0696f06195c8c20f02ac87c1da0e1d315ef languageName: node linkType: hard @@ -13530,17 +13855,6 @@ __metadata: languageName: node linkType: hard -"normalize-package-data@npm:^7.0.0": - version: 7.0.0 - resolution: "normalize-package-data@npm:7.0.0" - dependencies: - hosted-git-info: "npm:^8.0.0" - semver: "npm:^7.3.5" - validate-npm-package-license: "npm:^3.0.4" - checksum: 10c0/d492cbc4cdd92e99cba517b08cec6adf40ff37f2e97ecf4484ccb2da1ef5bd81c6dfbd8b434d3bdc749df639492ecdc71f4a61de1a8b99fe97fdf4faac13e7f1 - languageName: node - linkType: hard - "normalize-path@npm:^2.0.0, normalize-path@npm:^2.0.1": version: 2.1.1 resolution: "normalize-path@npm:2.1.1" @@ -13634,14 +13948,14 @@ __metadata: linkType: hard "npm-package-arg@npm:^12.0.0": - version: 12.0.1 - resolution: "npm-package-arg@npm:12.0.1" + version: 12.0.2 + resolution: "npm-package-arg@npm:12.0.2" dependencies: hosted-git-info: "npm:^8.0.0" proc-log: "npm:^5.0.0" semver: "npm:^7.3.5" validate-npm-package-name: "npm:^6.0.0" - checksum: 10c0/e7cafb0952541858abe63dfa2fd7b45f1626e310c0b60d6266fafe20c1b5b76388913c3f39390820bee9eac035705639dc62adbcf14748536f867c4d06bbf209 + checksum: 10c0/a507046ca0999862d6f1a4878d2e22d47a728062b49d670ea7a965b0b555fc84ba4473daf34eb72c711b68aeb02e4f567fdb410d54385535cb7e4d85aaf49544 languageName: node linkType: hard @@ -13793,9 +14107,9 @@ __metadata: linkType: hard "object-inspect@npm:^1.13.3": - version: 1.13.3 - resolution: "object-inspect@npm:1.13.3" - checksum: 10c0/cc3f15213406be89ffdc54b525e115156086796a515410a8d390215915db9f23c8eab485a06f1297402f440a33715fe8f71a528c1dcbad6e1a3bcaf5a46921d4 + version: 1.13.4 + resolution: "object-inspect@npm:1.13.4" + checksum: 10c0/d7f8711e803b96ea3191c745d6f8056ce1f2496e530e6a19a0e92d89b0fa3c76d910c31f0aa270432db6bd3b2f85500a376a83aaba849a8d518c8845b3211692 languageName: node linkType: hard @@ -13894,10 +14208,10 @@ __metadata: languageName: node linkType: hard -"obliterator@npm:^2.0.1": - version: 2.0.4 - resolution: "obliterator@npm:2.0.4" - checksum: 10c0/ff2c10d4de7d62cd1d588b4d18dfc42f246c9e3a259f60d5716f7f88e5b3a3f79856b3207db96ec9a836a01d0958a21c15afa62a3f4e73a1e0b75f2c2f6bab40 +"obliterator@npm:^2.0.4": + version: 2.0.5 + resolution: "obliterator@npm:2.0.5" + checksum: 10c0/36e67d88271c51aa6412a7d449d6c60ae6387176f94dbc557eea67456bf6ccedbcbcecdb1e56438aa4f4694f68f531b3bf2be87b019e2f69961b144bec124e70 languageName: node linkType: hard @@ -13954,6 +14268,17 @@ __metadata: languageName: node linkType: hard +"own-keys@npm:^1.0.1": + version: 1.0.1 + resolution: "own-keys@npm:1.0.1" + dependencies: + get-intrinsic: "npm:^1.2.6" + object-keys: "npm:^1.1.1" + safe-push-apply: "npm:^1.0.0" + checksum: 10c0/6dfeb3455bff92ec3f16a982d4e3e65676345f6902d9f5ded1d8265a6318d0200ce461956d6d1c70053c7fe9f9fe65e552faac03f8140d37ef0fdd108e67013a + languageName: node + linkType: hard + "p-cancelable@npm:^2.0.0": version: 2.1.1 resolution: "p-cancelable@npm:2.1.1" @@ -14346,7 +14671,7 @@ __metadata: languageName: node linkType: hard -"picocolors@npm:^1.0.0, picocolors@npm:^1.1.0, picocolors@npm:^1.1.1": +"picocolors@npm:^1.0.0, picocolors@npm:^1.1.1": version: 1.1.1 resolution: "picocolors@npm:1.1.1" checksum: 10c0/e2e3e8170ab9d7c7421969adaa7e1b31434f789afb9b3f115f6b96d91945041ac3ceb02e9ec6fe6510ff036bcc0bf91e69a1772edc0b707e12b19c0f2d6bcf58 @@ -14454,27 +14779,27 @@ __metadata: languageName: node linkType: hard -"playwright-core@npm:1.49.1": - version: 1.49.1 - resolution: "playwright-core@npm:1.49.1" +"playwright-core@npm:1.50.1": + version: 1.50.1 + resolution: "playwright-core@npm:1.50.1" bin: playwright-core: cli.js - checksum: 10c0/990b619c75715cd98b2c10c1180a126e3a454b247063b8352bc67792fe01183ec07f31d30c8714c3768cefed12886d1d64ac06da701f2baafc2cad9b439e3919 + checksum: 10c0/c158764257d870897c31807a830ddcc3f5aaf4376719e05aeada3489a01f751650b2dc43e027201a40405a1b075084e89f58cd3730a985a229efe9d8cecfe360 languageName: node linkType: hard -"playwright@npm:1.49.1": - version: 1.49.1 - resolution: "playwright@npm:1.49.1" +"playwright@npm:1.50.1": + version: 1.50.1 + resolution: "playwright@npm:1.50.1" dependencies: fsevents: "npm:2.3.2" - playwright-core: "npm:1.49.1" + playwright-core: "npm:1.50.1" dependenciesMeta: fsevents: optional: true bin: playwright: cli.js - checksum: 10c0/2368762c898920d4a0a5788b153dead45f9c36c3f5cf4d2af5228d0b8ea65823e3bbe998877950a2b9bb23a211e4633996f854c6188769dc81a25543ac818ab5 + checksum: 10c0/b292ee6e0d122748a3d024b85ace86a0d9c848fc4121685d90ffc5d43d6bcf13ed7dc7488b1055f69040599c420052306ccba6fabfe2f69a15fc109c55171207 languageName: node linkType: hard @@ -14511,9 +14836,9 @@ __metadata: linkType: hard "possible-typed-array-names@npm:^1.0.0": - version: 1.0.0 - resolution: "possible-typed-array-names@npm:1.0.0" - checksum: 10c0/d9aa22d31f4f7680e20269db76791b41c3a32c01a373e25f8a4813b4d45f7456bfc2b6d68f752dc4aab0e0bb0721cb3d76fb678c9101cb7a16316664bc2c73fd + version: 1.1.0 + resolution: "possible-typed-array-names@npm:1.1.0" + checksum: 10c0/c810983414142071da1d644662ce4caebce890203eb2bc7bf119f37f3fe5796226e117e6cca146b521921fa6531072674174a3325066ac66fce089a53e1e5196 languageName: node linkType: hard @@ -14961,12 +15286,12 @@ __metadata: linkType: hard "postcss-selector-parser@npm:^7.0.0": - version: 7.0.0 - resolution: "postcss-selector-parser@npm:7.0.0" + version: 7.1.0 + resolution: "postcss-selector-parser@npm:7.1.0" dependencies: cssesc: "npm:^3.0.0" util-deprecate: "npm:^1.0.2" - checksum: 10c0/e96e096afcce70bf5c97789f5ea09d7415ae5eb701d82b05b5e8532885d31363b484fcb1ca9488c9a331f30508d9e5bb6c3109eb2eb5067ef3d3919f9928cd9d + checksum: 10c0/0fef257cfd1c0fe93c18a3f8a6e739b4438b527054fd77e9a62730a89b2d0ded1b59314a7e4aaa55bc256204f40830fecd2eb50f20f8cb7ab3a10b52aa06c8aa languageName: node linkType: hard @@ -15026,32 +15351,34 @@ __metadata: linkType: hard "postcss@npm:^8.4.47": - version: 8.4.49 - resolution: "postcss@npm:8.4.49" + version: 8.5.3 + resolution: "postcss@npm:8.5.3" dependencies: - nanoid: "npm:^3.3.7" + nanoid: "npm:^3.3.8" picocolors: "npm:^1.1.1" source-map-js: "npm:^1.2.1" - checksum: 10c0/f1b3f17aaf36d136f59ec373459f18129908235e65dbdc3aee5eef8eba0756106f52de5ec4682e29a2eab53eb25170e7e871b3e4b52a8f1de3d344a514306be3 + checksum: 10c0/b75510d7b28c3ab728c8733dd01538314a18c52af426f199a3c9177e63eb08602a3938bfb66b62dc01350b9aed62087eabbf229af97a1659eb8d3513cec823b3 languageName: node linkType: hard "posthog-js@npm:^1.194.6": - version: 1.203.1 - resolution: "posthog-js@npm:1.203.1" + version: 1.223.4 + resolution: "posthog-js@npm:1.223.4" dependencies: core-js: "npm:^3.38.1" fflate: "npm:^0.4.8" preact: "npm:^10.19.3" web-vitals: "npm:^4.2.0" - checksum: 10c0/818778dce43fe57a730837edee5f9109198f08d28b1ed227b5977278a3e85ae0587eec2b10d7d0b88543c8034c064a1d1e917f1a4024425ec9aea54e81052e21 + peerDependencies: + "@rrweb/types": 2.0.0-alpha.17 + checksum: 10c0/f3972939e6781fa5c699ddb1138ff61d180dbaf7eb9edceeaac1929340fc8b25c4fdaca591b03f37d65de814725e5ad439e6bfc91fd83ff151666503e4a4b42f languageName: node linkType: hard "preact@npm:^10.19.3, preact@npm:^10.5.13": - version: 10.25.3 - resolution: "preact@npm:10.25.3" - checksum: 10c0/b555a844e5c1b8e4f1feeb6d2f083dc3d44c7b3029c5d723e02b44283d5323c08ce881009a84345a43d9ebbabbc8ccdb868201f81ab3d5be3405e3378eca70be + version: 10.26.2 + resolution: "preact@npm:10.26.2" + checksum: 10c0/a301eaf1fb0b471f6bdbf0236707499a64e59d887b308286fc3b3180250a7d0b1040ddc293a602ec8f27d4259c3220b6bd37661975e3a6719636a74b08f44236 languageName: node linkType: hard @@ -15134,11 +15461,11 @@ __metadata: linkType: hard "prettier@npm:^3.0.3": - version: 3.4.2 - resolution: "prettier@npm:3.4.2" + version: 3.5.2 + resolution: "prettier@npm:3.5.2" bin: prettier: bin/prettier.cjs - checksum: 10c0/99e076a26ed0aba4ebc043880d0f08bbb8c59a4c6641cdee6cdadf2205bdd87aa1d7823f50c3aea41e015e99878d37c58d7b5f0e663bba0ef047f94e36b96446 + checksum: 10c0/d7b597ed33f39c32ace675896ad187f06a3e48dc8a1e80051b5c5f0dae3586d53981704b8fda5ac3b080e6c2e0e197d239131b953702674f044351621ca5e1ac languageName: node linkType: hard @@ -15195,9 +15522,9 @@ __metadata: linkType: hard "process-warning@npm:^4.0.0": - version: 4.0.0 - resolution: "process-warning@npm:4.0.0" - checksum: 10c0/5312a72b69d37a1b82ad03f3dfa0090dab3804a8fd995d06c28e3c002852bd82f5584217d9f4a3f197892bb2afc22d57e2c662c7e906b5abb48c0380c7b0880d + version: 4.0.1 + resolution: "process-warning@npm:4.0.1" + checksum: 10c0/577a268b9fd5c3d9f6dbb4348220099391d830905642845d591e7ee8b1e45043d98b7b9826a3c1379bdd1686cdfe0f6cf349cb812affc5853b662e6a9896579e languageName: node linkType: hard @@ -15288,13 +15615,10 @@ __metadata: languageName: node linkType: hard -"proxy-addr@npm:^2.0.7": - version: 2.0.7 - resolution: "proxy-addr@npm:2.0.7" - dependencies: - forwarded: "npm:0.2.0" - ipaddr.js: "npm:1.9.1" - checksum: 10c0/c3eed999781a35f7fd935f398b6d8920b6fb00bbc14287bc6de78128ccc1a02c89b95b56742bf7cf0362cc333c61d138532049c7dedc7a328ef13343eff81210 +"property-information@npm:^7.0.0": + version: 7.0.0 + resolution: "property-information@npm:7.0.0" + checksum: 10c0/bf443e3bbdfc154da8f4ff4c85ed97c3d21f5e5f77cce84d2fd653c6dfb974a75ad61eafbccb2b8d2285942be35d763eaa99d51e29dccc28b40917d3f018107e languageName: node linkType: hard @@ -15401,11 +15725,11 @@ __metadata: linkType: hard "react-circular-progressbar@npm:^2.1.0": - version: 2.1.0 - resolution: "react-circular-progressbar@npm:2.1.0" + version: 2.2.0 + resolution: "react-circular-progressbar@npm:2.2.0" peerDependencies: - react: ^0.14.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 - checksum: 10c0/4019235abdf588baa97491fb53e258e83e467aecce14672120bca687719fa025efd4a3b63b44c7a59867ebba547ee6edf035f3b883585d46332c5334cf505c85 + react: ">=0.14.0" + checksum: 10c0/77655598d48a826fff9a6fd2f6b61349bb2e762d1774c0bcd5a374916347e1d03821e51cd7ff0f294843f5088e569b0c266064af0a229403c510c238b3390a3b languageName: node linkType: hard @@ -15455,23 +15779,24 @@ __metadata: linkType: hard "react-hot-toast@npm:^2.4.1": - version: 2.4.1 - resolution: "react-hot-toast@npm:2.4.1" + version: 2.5.2 + resolution: "react-hot-toast@npm:2.5.2" dependencies: - goober: "npm:^2.1.10" + csstype: "npm:^3.1.3" + goober: "npm:^2.1.16" peerDependencies: react: ">=16" react-dom: ">=16" - checksum: 10c0/591ecec3c6adc1cdb70f00165a57baa3d7f75d0d30fa767213c36496bdcc6be2b2e6a3edbf7c04f7d726a1b17dcfb5e7feb2136b04b17c9ccb769894b970f365 + checksum: 10c0/2db00b491bd1d2ec3ed04754a32b640272cdb32985f95e32ef033fcc996588a93e67d9764b005f9f391ee2bad5d0f9f343ba290dca82fcd439e08e708a161d76 languageName: node linkType: hard "react-icons@npm:*": - version: 5.4.0 - resolution: "react-icons@npm:5.4.0" + version: 5.5.0 + resolution: "react-icons@npm:5.5.0" peerDependencies: react: "*" - checksum: 10c0/698b0c4616870152d86de2585fb709bf3eeb9292d971d689965dade5f0ee71cdc92d2125b728ab220cc39a4c6d6bad1ed526b9b934ab39a7b6001bc23b73ee16 + checksum: 10c0/a24309bfc993c19cbcbfc928157e53a137851822779977b9588f6dd41ffc4d11ebc98b447f4039b0d309a858f0a42980f6bfb4477fb19f9f2d1bc2e190fcf79c languageName: node linkType: hard @@ -15506,10 +15831,11 @@ __metadata: linkType: hard "react-markdown@npm:^9.0.1": - version: 9.0.1 - resolution: "react-markdown@npm:9.0.1" + version: 9.1.0 + resolution: "react-markdown@npm:9.1.0" dependencies: "@types/hast": "npm:^3.0.0" + "@types/mdast": "npm:^4.0.0" devlop: "npm:^1.0.0" hast-util-to-jsx-runtime: "npm:^2.0.0" html-url-attributes: "npm:^3.0.0" @@ -15522,7 +15848,7 @@ __metadata: peerDependencies: "@types/react": ">=18" react: ">=18" - checksum: 10c0/3a3895dbd56647bc864b8da46dd575e71a9e609eb1e43fea8e8e6209d86e208eddd5b07bf8d7b5306a194b405440760a8d134aebd5a4ce5dc7dee4299e84db96 + checksum: 10c0/5bd645d39379f776d64588105f4060c390c3c8e4ff048552c9fa0ad31b756bb3ff7c11081542dc58d840ccf183a6dd4fd4d4edab44d8c24dee8b66551a5fd30d languageName: node linkType: hard @@ -15561,26 +15887,26 @@ __metadata: languageName: node linkType: hard -"react-remove-scroll@npm:^2.6.1": - version: 2.6.2 - resolution: "react-remove-scroll@npm:2.6.2" +"react-remove-scroll@npm:^2.6.3": + version: 2.6.3 + resolution: "react-remove-scroll@npm:2.6.3" dependencies: react-remove-scroll-bar: "npm:^2.3.7" - react-style-singleton: "npm:^2.2.1" + react-style-singleton: "npm:^2.2.3" tslib: "npm:^2.1.0" use-callback-ref: "npm:^1.3.3" - use-sidecar: "npm:^1.1.2" + use-sidecar: "npm:^1.1.3" peerDependencies: "@types/react": "*" react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc peerDependenciesMeta: "@types/react": optional: true - checksum: 10c0/8273e3f67a460af84b3387c93459b33920d48be15091c5ea10e8c1c4f514ad41f71dad028ee13df25370e5de16cadf02697fe28adaacbdacdf8b57bbf03ee559 + checksum: 10c0/068e9704ff26816fffc4c8903e2c6c8df7291ee08615d7c1ab0cf8751f7080e2c5a5d78ef5d908b11b9cfc189f176d312e44cb02ea291ca0466d8283b479b438 languageName: node linkType: hard -"react-style-singleton@npm:^2.2.1, react-style-singleton@npm:^2.2.2": +"react-style-singleton@npm:^2.2.2, react-style-singleton@npm:^2.2.3": version: 2.2.3 resolution: "react-style-singleton@npm:2.2.3" dependencies: @@ -15690,12 +16016,25 @@ __metadata: languageName: node linkType: hard -"readable-web-to-node-stream@npm:^3.0.0": - version: 3.0.2 - resolution: "readable-web-to-node-stream@npm:3.0.2" +"readable-stream@npm:^4.7.0": + version: 4.7.0 + resolution: "readable-stream@npm:4.7.0" dependencies: - readable-stream: "npm:^3.6.0" - checksum: 10c0/533d5cd1580232a2c753e52a245be13fc552e6f82c5053a8a8da7ea1063d73a34f936a86b3d4433cdb4a13dd683835cfc87f230936cb96d329a1e28b6040f42e + abort-controller: "npm:^3.0.0" + buffer: "npm:^6.0.3" + events: "npm:^3.3.0" + process: "npm:^0.11.10" + string_decoder: "npm:^1.3.0" + checksum: 10c0/fd86d068da21cfdb10f7a4479f2e47d9c0a9b0c862fc0c840a7e5360201580a55ac399c764b12a4f6fa291f8cee74d9c4b7562e0d53b3c4b2769f2c98155d957 + languageName: node + linkType: hard + +"readable-web-to-node-stream@npm:^3.0.0": + version: 3.0.4 + resolution: "readable-web-to-node-stream@npm:3.0.4" + dependencies: + readable-stream: "npm:^4.7.0" + checksum: 10c0/2dc417d5d0b0c0191fcf57f87df3b2853db21d1da5554ec32b1e1c5a515e5a1243fc077a23f74046d711c2d736628f64b31054a8379b95bb016212430b5110c5 languageName: node linkType: hard @@ -15720,9 +16059,9 @@ __metadata: linkType: hard "readdirp@npm:^4.0.1": - version: 4.0.2 - resolution: "readdirp@npm:4.0.2" - checksum: 10c0/a16ecd8ef3286dcd90648c3b103e3826db2b766cdb4a988752c43a83f683d01c7059158d623cbcd8bdfb39e65d302d285be2d208e7d9f34d022d912b929217dd + version: 4.1.2 + resolution: "readdirp@npm:4.1.2" + checksum: 10c0/60a14f7619dec48c9c850255cd523e2717001b0e179dc7037cfa0895da7b9e9ab07532d324bfb118d73a710887d1e35f79c495fa91582784493e085d18c72c62 languageName: node linkType: hard @@ -15759,19 +16098,19 @@ __metadata: languageName: node linkType: hard -"reflect.getprototypeof@npm:^1.0.6, reflect.getprototypeof@npm:^1.0.8, reflect.getprototypeof@npm:^1.0.9": - version: 1.0.9 - resolution: "reflect.getprototypeof@npm:1.0.9" +"reflect.getprototypeof@npm:^1.0.6, reflect.getprototypeof@npm:^1.0.9": + version: 1.0.10 + resolution: "reflect.getprototypeof@npm:1.0.10" dependencies: call-bind: "npm:^1.0.8" define-properties: "npm:^1.2.1" - dunder-proto: "npm:^1.0.1" - es-abstract: "npm:^1.23.6" + es-abstract: "npm:^1.23.9" es-errors: "npm:^1.3.0" - get-intrinsic: "npm:^1.2.6" - gopd: "npm:^1.2.0" + es-object-atoms: "npm:^1.0.0" + get-intrinsic: "npm:^1.2.7" + get-proto: "npm:^1.0.1" which-builtin-type: "npm:^1.2.1" - checksum: 10c0/db42118a8699fa8b5856e6aa06eac32498a7bbc3c22832729049501733d060662bf16f204c546db87df8bb78b36491ecd6b3b0478c0a27be6c8302cc0770a42e + checksum: 10c0/7facec28c8008876f8ab98e80b7b9cb4b1e9224353fd4756dda5f2a4ab0d30fa0a5074777c6df24e1e0af463a2697513b0a11e548d99cf52f21f7bc6ba48d3ac languageName: node linkType: hard @@ -15816,39 +16155,42 @@ __metadata: linkType: hard "regexp.prototype.flags@npm:^1.5.3": - version: 1.5.3 - resolution: "regexp.prototype.flags@npm:1.5.3" + version: 1.5.4 + resolution: "regexp.prototype.flags@npm:1.5.4" dependencies: - call-bind: "npm:^1.0.7" + call-bind: "npm:^1.0.8" define-properties: "npm:^1.2.1" es-errors: "npm:^1.3.0" + get-proto: "npm:^1.0.1" + gopd: "npm:^1.2.0" set-function-name: "npm:^2.0.2" - checksum: 10c0/e1a7c7dc42cc91abf73e47a269c4b3a8f225321b7f617baa25821f6a123a91d23a73b5152f21872c566e699207e1135d075d2251cd3e84cc96d82a910adf6020 + checksum: 10c0/83b88e6115b4af1c537f8dabf5c3744032cb875d63bc05c288b1b8c0ef37cbe55353f95d8ca817e8843806e3e150b118bc624e4279b24b4776b4198232735a77 languageName: node linkType: hard "rehype-highlight-code-lines@npm:^1.0.4": - version: 1.0.4 - resolution: "rehype-highlight-code-lines@npm:1.0.4" + version: 1.1.3 + resolution: "rehype-highlight-code-lines@npm:1.1.3" dependencies: "@types/hast": "npm:^3.0.4" parse-numeric-range: "npm:^1.3.0" - unified: "npm:^11.0.5" unist-util-visit: "npm:^5.0.0" - checksum: 10c0/99d58281e74b90f1992dc31349c031c9749fa31c2911ad13b5723f9a33bc26ec89178493b9a324c2cc4d4f2a20c09442ec5f576954367220d7ab979b9e822f7a + peerDependencies: + unified: ^11 + checksum: 10c0/0b7199301a2f1083b9ff307ca98691f3e848745f40727e74c54dd0181b2cfefa7b6de41ffea97fa60b932bc2e6666af321cdaee3f60dfdd3ef2e6263e79743f3 languageName: node linkType: hard "rehype-highlight@npm:^7.0.1": - version: 7.0.1 - resolution: "rehype-highlight@npm:7.0.1" + version: 7.0.2 + resolution: "rehype-highlight@npm:7.0.2" dependencies: "@types/hast": "npm:^3.0.0" hast-util-to-text: "npm:^4.0.0" lowlight: "npm:^3.0.0" unist-util-visit: "npm:^5.0.0" vfile: "npm:^6.0.0" - checksum: 10c0/cb995cef8f0660538fdf988cea8184fdfb1ab8f74f20f67705b32617d7c484356feccb80b6faebc08e5cec7bc32977718b1d6c012ebd054719633e0cd22fe544 + checksum: 10c0/b62effff554f9a3f2ad8688c675bc7580e6dcf20a6988f86a25e95f1adea2f4900f8a13f96ec7db6a543314aed28267e4057f8dbc71c02a76a9511a716e88da2 languageName: node linkType: hard @@ -15867,6 +16209,31 @@ __metadata: languageName: node linkType: hard +"rehype-raw@npm:^7.0.0": + version: 7.0.0 + resolution: "rehype-raw@npm:7.0.0" + dependencies: + "@types/hast": "npm:^3.0.0" + hast-util-raw: "npm:^9.0.0" + vfile: "npm:^6.0.0" + checksum: 10c0/1435b4b6640a5bc3abe3b2133885c4dbff5ef2190ef9cfe09d6a63f74dd7d7ffd0cede70603278560ccf1acbfb9da9faae4b68065a28bc5aa88ad18e40f32d52 + languageName: node + linkType: hard + +"remark-gfm@npm:^4.0.0": + version: 4.0.1 + resolution: "remark-gfm@npm:4.0.1" + dependencies: + "@types/mdast": "npm:^4.0.0" + mdast-util-gfm: "npm:^3.0.0" + micromark-extension-gfm: "npm:^3.0.0" + remark-parse: "npm:^11.0.0" + remark-stringify: "npm:^11.0.0" + unified: "npm:^11.0.0" + checksum: 10c0/427ecc6af3e76222662061a5f670a3e4e33ec5fffe2cabf04034da6a3f9a1bda1fc023e838a636385ba314e66e2bebbf017ca61ebea357eb0f5200fe0625a4b7 + languageName: node + linkType: hard + "remark-math@npm:^6.0.0": version: 6.0.0 resolution: "remark-math@npm:6.0.0" @@ -15904,6 +16271,17 @@ __metadata: languageName: node linkType: hard +"remark-stringify@npm:^11.0.0": + version: 11.0.0 + resolution: "remark-stringify@npm:11.0.0" + dependencies: + "@types/mdast": "npm:^4.0.0" + mdast-util-to-markdown: "npm:^2.0.0" + unified: "npm:^11.0.0" + checksum: 10c0/0cdb37ce1217578f6f847c7ec9f50cbab35df5b9e3903d543e74b405404e67c07defcb23cd260a567b41b769400f6de03c2c3d9cd6ae7a6707d5c8d89ead489f + languageName: node + linkType: hard + "remove-trailing-separator@npm:^1.0.1": version: 1.1.0 resolution: "remove-trailing-separator@npm:1.1.0" @@ -16124,9 +16502,9 @@ __metadata: linkType: hard "reusify@npm:^1.0.4": - version: 1.0.4 - resolution: "reusify@npm:1.0.4" - checksum: 10c0/c19ef26e4e188f408922c46f7ff480d38e8dfc55d448310dfb518736b23ed2c4f547fb64a6ed5bdba92cd7e7ddc889d36ff78f794816d5e71498d645ef476107 + version: 1.1.0 + resolution: "reusify@npm:1.1.0" + checksum: 10c0/4eff0d4a5f9383566c7d7ec437b671cc51b25963bd61bf127c3f3d3f68e44a026d99b8d2f1ad344afff8d278a8fe70a8ea092650a716d22287e8bef7126bb2fa languageName: node linkType: hard @@ -16423,11 +16801,11 @@ __metadata: linkType: hard "rxjs@npm:^7.8.1": - version: 7.8.1 - resolution: "rxjs@npm:7.8.1" + version: 7.8.2 + resolution: "rxjs@npm:7.8.2" dependencies: tslib: "npm:^2.1.0" - checksum: 10c0/3c49c1ecd66170b175c9cacf5cef67f8914dcbc7cd0162855538d365c83fea631167cacb644b3ce533b2ea0e9a4d0b12175186985f89d75abe73dbd8f7f06f68 + checksum: 10c0/1fcd33d2066ada98ba8f21fcbbcaee9f0b271de1d38dc7f4e256bfbc6ffcdde68c8bfb69093de7eeb46f24b1fb820620bf0223706cff26b4ab99a7ff7b2e2c45 languageName: node linkType: hard @@ -16465,6 +16843,16 @@ __metadata: languageName: node linkType: hard +"safe-push-apply@npm:^1.0.0": + version: 1.0.0 + resolution: "safe-push-apply@npm:1.0.0" + dependencies: + es-errors: "npm:^1.3.0" + isarray: "npm:^2.0.5" + checksum: 10c0/831f1c9aae7436429e7862c7e46f847dfe490afac20d0ee61bae06108dbf5c745a0de3568ada30ccdd3eeb0864ca8331b2eef703abd69bfea0745b21fd320750 + languageName: node + linkType: hard + "safe-regex-test@npm:^1.0.3, safe-regex-test@npm:^1.1.0": version: 1.1.0 resolution: "safe-regex-test@npm:1.1.0" @@ -16477,11 +16865,11 @@ __metadata: linkType: hard "safe-regex2@npm:^4.0.0": - version: 4.0.0 - resolution: "safe-regex2@npm:4.0.0" + version: 4.0.1 + resolution: "safe-regex2@npm:4.0.1" dependencies: ret: "npm:~0.5.0" - checksum: 10c0/faebf910036228868e83b4a33a84405b04e8e89f01283efe847e17e96b6b4658cc65c6560cef11de3bd5aef3b28b58dffac48744df67ca2ae46e073f668cb71d + checksum: 10c0/fe6edc2c0fa9847b572d0f0fc2b1f487c36ae603fec65445ae38cfb40483afa85107d3b6ffe63cbe029fd06e6ccb5c5730415c1595a1011fa00bafa2b866a8f0 languageName: node linkType: hard @@ -16517,9 +16905,9 @@ __metadata: languageName: node linkType: hard -"sass@npm:^1.69.4": - version: 1.83.0 - resolution: "sass@npm:1.83.0" +"sass@npm:^1.69.4, sass@npm:^1.83.1": + version: 1.85.1 + resolution: "sass@npm:1.85.1" dependencies: "@parcel/watcher": "npm:^2.4.1" chokidar: "npm:^4.0.0" @@ -16530,24 +16918,7 @@ __metadata: optional: true bin: sass: sass.js - checksum: 10c0/4415361229879a9041d77c953da85482e89032aa4321ba13250a9987d39c80fac6c88af3777f2a2d76a4e8b0c8afbd21c1970fdbe84e0b3ec25fb26741f92beb - languageName: node - linkType: hard - -"sass@npm:^1.83.1": - version: 1.83.1 - resolution: "sass@npm:1.83.1" - dependencies: - "@parcel/watcher": "npm:^2.4.1" - chokidar: "npm:^4.0.0" - immutable: "npm:^5.0.2" - source-map-js: "npm:>=0.6.2 <2.0.0" - dependenciesMeta: - "@parcel/watcher": - optional: true - bin: - sass: sass.js - checksum: 10c0/9772506cd8290df7b5e800055098e91a8a65100840fd9e90c660deb74b248b3ddbbd1a274b8f7f09777d472d2c873575357bd87939a40fb5a80bdf654985486f + checksum: 10c0/f843aa1df1dca2f0e9cb2fb247e4939fd514ae4c182cdd1900a0622c0d71b40dfb1c4225f78b78e165a318287ca137ec597695db3e496408bd16a921a2bc2b3f languageName: node linkType: hard @@ -16593,9 +16964,9 @@ __metadata: linkType: hard "secure-json-parse@npm:^3.0.1": - version: 3.0.1 - resolution: "secure-json-parse@npm:3.0.1" - checksum: 10c0/4e4555f62a570fd11a37fe7853fb0fd6661084e53ed11324c68496128f5300309c81279d890fe5145e8ec79887c58682be33e67693392c44cc835859c041dd12 + version: 3.0.2 + resolution: "secure-json-parse@npm:3.0.2" + checksum: 10c0/4c9c005e7fdd8528df35fcdec41dc4e8e15820ce52de19f8102da808f9400a9ed8c0a28971e3efe24b001ee1e60296af553f12bbaab81a152f702dd00af2092d languageName: node linkType: hard @@ -16624,12 +16995,12 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.1.1, semver@npm:^7.2.1, semver@npm:^7.3.2, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.3.8, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0, semver@npm:^7.6.3": - version: 7.6.3 - resolution: "semver@npm:7.6.3" +"semver@npm:^7.1.1, semver@npm:^7.2.1, semver@npm:^7.3.2, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.3.8, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0, semver@npm:^7.6.3, semver@npm:^7.7.1": + version: 7.7.1 + resolution: "semver@npm:7.7.1" bin: semver: bin/semver.js - checksum: 10c0/88f33e148b210c153873cb08cfe1e281d518aaa9a666d4d148add6560db5cd3c582f3a08ccb91f38d5f379ead256da9931234ed122057f40bb5766e65e58adaf + checksum: 10c0/fd603a6fb9c399c6054015433051bdbe7b99a940a8fb44b85c2b524c4004b023d7928d47cb22154f8d054ea7ee8597f586605e05b52047f048278e4ac56ae958 languageName: node linkType: hard @@ -16684,6 +17055,17 @@ __metadata: languageName: node linkType: hard +"set-proto@npm:^1.0.0": + version: 1.0.0 + resolution: "set-proto@npm:1.0.0" + dependencies: + dunder-proto: "npm:^1.0.1" + es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.0.0" + checksum: 10c0/ca5c3ccbba479d07c30460e367e66337cec825560b11e8ba9c5ebe13a2a0d6021ae34eddf94ff3dfe17a3104dc1f191519cb6c48378b503e5c3f36393938776a + languageName: node + linkType: hard + "set-value@npm:^2.0.0, set-value@npm:^2.0.1": version: 2.0.1 resolution: "set-value@npm:2.0.1" @@ -16826,16 +17208,16 @@ __metadata: linkType: hard "sigstore@npm:^3.0.0": - version: 3.0.0 - resolution: "sigstore@npm:3.0.0" + version: 3.1.0 + resolution: "sigstore@npm:3.1.0" dependencies: - "@sigstore/bundle": "npm:^3.0.0" + "@sigstore/bundle": "npm:^3.1.0" "@sigstore/core": "npm:^2.0.0" - "@sigstore/protobuf-specs": "npm:^0.3.2" - "@sigstore/sign": "npm:^3.0.0" - "@sigstore/tuf": "npm:^3.0.0" - "@sigstore/verify": "npm:^2.0.0" - checksum: 10c0/9f9fa8419d07cb4ebb4fbe324e8a68023f851827629a4906d2ffa59b51f17551f514d80aa541c2d2b9918340a1c42cfda2e1ba0ac65a2f9768e8437c520beecd + "@sigstore/protobuf-specs": "npm:^0.4.0" + "@sigstore/sign": "npm:^3.1.0" + "@sigstore/tuf": "npm:^3.1.0" + "@sigstore/verify": "npm:^2.1.0" + checksum: 10c0/c037f5526e698ec6de8654f6be6b6fa52bf52f2ffcd78109cdefc6d824bbb8390324522dcb0f84d57a674948ac53aef34dd77f9de66c91bcd91d0af56bb91c7e languageName: node linkType: hard @@ -16993,12 +17375,12 @@ __metadata: linkType: hard "socks@npm:^2.8.3": - version: 2.8.3 - resolution: "socks@npm:2.8.3" + version: 2.8.4 + resolution: "socks@npm:2.8.4" dependencies: ip-address: "npm:^9.0.5" smart-buffer: "npm:^4.2.0" - checksum: 10c0/d54a52bf9325165770b674a67241143a3d8b4e4c8884560c4e0e078aace2a728dffc7f70150660f51b85797c4e1a3b82f9b7aa25e0a0ceae1a243365da5c51a7 + checksum: 10c0/00c3271e233ccf1fb83a3dd2060b94cc37817e0f797a93c560b9a7a86c4a0ec2961fb31263bdd24a3c28945e24868b5f063cd98744171d9e942c513454b50ae5 languageName: node linkType: hard @@ -17114,9 +17496,9 @@ __metadata: linkType: hard "spdx-license-ids@npm:^3.0.0": - version: 3.0.20 - resolution: "spdx-license-ids@npm:3.0.20" - checksum: 10c0/bdff7534fad6ef59be49becda1edc3fb7f5b3d6f296a715516ab9d972b8ad59af2c34b2003e01db8970d4c673d185ff696ba74c6b61d3bf327e2b3eac22c297c + version: 3.0.21 + resolution: "spdx-license-ids@npm:3.0.21" + checksum: 10c0/ecb24c698d8496aa9efe23e0b1f751f8a7a89faedcdfcbfabae772b546c2db46ccde8f3bc447a238eb86bbcd4f73fea88720ef3b8394f7896381bec3d7736411 languageName: node linkType: hard @@ -17362,7 +17744,7 @@ __metadata: languageName: node linkType: hard -"string_decoder@npm:^1.1.1": +"string_decoder@npm:^1.1.1, string_decoder@npm:^1.3.0": version: 1.3.0 resolution: "string_decoder@npm:1.3.0" dependencies: @@ -17601,14 +17983,14 @@ __metadata: linkType: hard "swr@npm:^2.2.5": - version: 2.3.0 - resolution: "swr@npm:2.3.0" + version: 2.3.2 + resolution: "swr@npm:2.3.2" dependencies: dequal: "npm:^2.0.3" use-sync-external-store: "npm:^1.4.0" peerDependencies: react: ^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - checksum: 10c0/192497881013654bc82d2787b60ad0701113e8ae41c511dfa8d55bcf58582657a92a4cb2854d4ea2ceaa1055e67e58daf9bd98ada2786a3035ba12898da578f1 + checksum: 10c0/981d3138c1959f1f15ddb74ed3c98f34fbcae8e68ee1b0e6ce3af7e1fcf65ecdb3a2c525b42338cbcef0f7a992d41e1aeb3982501e86239e8aeef6c34fe3b580 languageName: node linkType: hard @@ -17738,8 +18120,8 @@ __metadata: linkType: hard "terser@npm:^5.17.4": - version: 5.37.0 - resolution: "terser@npm:5.37.0" + version: 5.39.0 + resolution: "terser@npm:5.39.0" dependencies: "@jridgewell/source-map": "npm:^0.3.3" acorn: "npm:^8.8.2" @@ -17747,7 +18129,7 @@ __metadata: source-map-support: "npm:~0.5.20" bin: terser: bin/terser - checksum: 10c0/ff0dc79b0a0da821e7f5bf7a047eab6d04e70e88b62339a0f1d71117db3310e255f5c00738fa3b391f56c3571f800a00047720261ba04ced0241c1f9922199f4 + checksum: 10c0/83326545ea1aecd6261030568b6191ccfa4cb6aa61d9ea41746a52479f50017a78b77e4725fbbc207c5df841ffa66a773c5ac33636e95c7ab94fe7e0379ae5c7 languageName: node linkType: hard @@ -17845,6 +18227,16 @@ __metadata: languageName: node linkType: hard +"tinyglobby@npm:^0.2.12": + version: 0.2.12 + resolution: "tinyglobby@npm:0.2.12" + dependencies: + fdir: "npm:^6.4.3" + picomatch: "npm:^4.0.2" + checksum: 10c0/7c9be4fd3625630e262dcb19015302aad3b4ba7fc620f269313e688f2161ea8724d6cb4444baab5ef2826eb6bed72647b169a33ec8eea37501832a2526ff540f + languageName: node + linkType: hard + "tmp-promise@npm:^3.0.2": version: 3.0.3 resolution: "tmp-promise@npm:3.0.3" @@ -18026,8 +18418,8 @@ __metadata: linkType: hard "ts-jest@npm:^29.2.5": - version: 29.2.5 - resolution: "ts-jest@npm:29.2.5" + version: 29.2.6 + resolution: "ts-jest@npm:29.2.6" dependencies: bs-logger: "npm:^0.2.6" ejs: "npm:^3.1.10" @@ -18036,7 +18428,7 @@ __metadata: json5: "npm:^2.2.3" lodash.memoize: "npm:^4.1.2" make-error: "npm:^1.3.6" - semver: "npm:^7.6.3" + semver: "npm:^7.7.1" yargs-parser: "npm:^21.1.1" peerDependencies: "@babel/core": ">=7.0.0-beta.0 <8" @@ -18058,7 +18450,7 @@ __metadata: optional: true bin: ts-jest: cli.js - checksum: 10c0/acb62d168faec073e64b20873b583974ba8acecdb94681164eb346cef82ade8fb481c5b979363e01a97ce4dd1e793baf64d9efd90720bc941ad7fc1c3d6f3f68 + checksum: 10c0/2a79bdb2631bbd004cd6ec171d62dc3681b86e7d1c20eece7f56e7c3df11a0f5a14f4831960b1ba8d1836787395c8f9dcbd084fd7f59246bbee8048feb93f892 languageName: node linkType: hard @@ -18235,22 +18627,22 @@ __metadata: linkType: hard "typescript@npm:^5.3.3, typescript@npm:^5.7.2": - version: 5.7.2 - resolution: "typescript@npm:5.7.2" + version: 5.7.3 + resolution: "typescript@npm:5.7.3" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10c0/a873118b5201b2ef332127ef5c63fb9d9c155e6fdbe211cbd9d8e65877283797cca76546bad742eea36ed7efbe3424a30376818f79c7318512064e8625d61622 + checksum: 10c0/b7580d716cf1824736cc6e628ab4cd8b51877408ba2be0869d2866da35ef8366dd6ae9eb9d0851470a39be17cbd61df1126f9e211d8799d764ea7431d5435afa languageName: node linkType: hard "typescript@patch:typescript@npm%3A^5.3.3#optional!builtin, typescript@patch:typescript@npm%3A^5.7.2#optional!builtin": - version: 5.7.2 - resolution: "typescript@patch:typescript@npm%3A5.7.2#optional!builtin::version=5.7.2&hash=5786d5" + version: 5.7.3 + resolution: "typescript@patch:typescript@npm%3A5.7.3#optional!builtin::version=5.7.3&hash=5786d5" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10c0/f3b8082c9d1d1629a215245c9087df56cb784f9fb6f27b5d55577a20e68afe2a889c040aacff6d27e35be165ecf9dca66e694c42eb9a50b3b2c451b36b5675cb + checksum: 10c0/6fd7e0ed3bf23a81246878c613423730c40e8bdbfec4c6e4d7bf1b847cbb39076e56ad5f50aa9d7ebd89877999abaee216002d3f2818885e41c907caaa192cc4 languageName: node linkType: hard @@ -18297,13 +18689,13 @@ __metadata: linkType: hard "undici@npm:^6.11.1": - version: 6.21.0 - resolution: "undici@npm:6.21.0" - checksum: 10c0/afa9bde6dcf8e0f5cf1ff2fa977ba73dd5510299ddfca0e1f37ff326554172ae31cb3d4a40b5a729601be1f21b96a2684f974d74dab53f9b6930fd47d1949246 + version: 6.21.1 + resolution: "undici@npm:6.21.1" + checksum: 10c0/d604080e4f8db89b35a63b483b5f96a5f8b19ec9f716e934639345449405809d2997e1dd7212d67048f210e54534143384d712bd9075e4394f0788895ef9ca8e languageName: node linkType: hard -"unified@npm:^11.0.0, unified@npm:^11.0.5": +"unified@npm:^11.0.0": version: 11.0.5 resolution: "unified@npm:11.0.5" dependencies: @@ -18484,16 +18876,16 @@ __metadata: linkType: hard "update-browserslist-db@npm:^1.1.1": - version: 1.1.1 - resolution: "update-browserslist-db@npm:1.1.1" + version: 1.1.2 + resolution: "update-browserslist-db@npm:1.1.2" dependencies: escalade: "npm:^3.2.0" - picocolors: "npm:^1.1.0" + picocolors: "npm:^1.1.1" peerDependencies: browserslist: ">= 4.21.0" bin: update-browserslist-db: cli.js - checksum: 10c0/536a2979adda2b4be81b07e311bd2f3ad5e978690987956bc5f514130ad50cac87cd22c710b686d79731e00fbee8ef43efe5fcd72baa241045209195d43dcc80 + checksum: 10c0/9cb353998d6d7d6ba1e46b8fa3db888822dd972212da4eda609d185eb5c3557a93fd59780ceb757afd4d84240518df08542736969e6a5d6d6ce2d58e9363aac6 languageName: node linkType: hard @@ -18556,7 +18948,7 @@ __metadata: languageName: node linkType: hard -"use-sidecar@npm:^1.1.2": +"use-sidecar@npm:^1.1.3": version: 1.1.3 resolution: "use-sidecar@npm:1.1.3" dependencies: @@ -18772,13 +19164,6 @@ __metadata: languageName: node linkType: hard -"web-streams-polyfill@npm:^3.0.3": - version: 3.3.3 - resolution: "web-streams-polyfill@npm:3.3.3" - checksum: 10c0/64e855c47f6c8330b5436147db1c75cb7e7474d924166800e8e2aab5eb6c76aac4981a84261dd2982b3e754490900b99791c80ae1407a9fa0dcff74f82ea3a7f - languageName: node - linkType: hard - "web-vitals@npm:^4.2.0": version: 4.2.4 resolution: "web-vitals@npm:4.2.4" @@ -19011,8 +19396,8 @@ __metadata: linkType: hard "ws@npm:^8.11.0, ws@npm:^8.16.0": - version: 8.18.0 - resolution: "ws@npm:8.18.0" + version: 8.18.1 + resolution: "ws@npm:8.18.1" peerDependencies: bufferutil: ^4.0.1 utf-8-validate: ">=5.0.2" @@ -19021,7 +19406,7 @@ __metadata: optional: true utf-8-validate: optional: true - checksum: 10c0/25eb33aff17edcb90721ed6b0eb250976328533ad3cd1a28a274bd263682e7296a6591ff1436d6cbc50fa67463158b062f9d1122013b361cec99a05f84680e06 + checksum: 10c0/e498965d6938c63058c4310ffb6967f07d4fa06789d3364829028af380d299fe05762961742971c764973dce3d1f6a2633fe8b2d9410c9b52e534b4b882a99fa languageName: node linkType: hard @@ -19146,11 +19531,11 @@ __metadata: linkType: hard "yaml@npm:^2.1.1, yaml@npm:^2.3.4, yaml@npm:^2.4.1, yaml@npm:^2.4.2": - version: 2.6.1 - resolution: "yaml@npm:2.6.1" + version: 2.7.0 + resolution: "yaml@npm:2.7.0" bin: yaml: bin.mjs - checksum: 10c0/aebf07f61c72b38c74d2b60c3a3ccf89ee4da45bcd94b2bfb7899ba07a5257625a7c9f717c65a6fc511563d48001e01deb1d9e55f0133f3e2edf86039c8c1be7 + checksum: 10c0/886a7d2abbd70704b79f1d2d05fe9fb0aa63aefb86e1cb9991837dced65193d300f5554747a872b4b10ae9a12bc5d5327e4d04205f70336e863e35e89d8f4ea9 languageName: node linkType: hard @@ -19205,9 +19590,9 @@ __metadata: linkType: hard "zod@npm:^3.23.8, zod@npm:^3.24.1": - version: 3.24.1 - resolution: "zod@npm:3.24.1" - checksum: 10c0/0223d21dbaa15d8928fe0da3b54696391d8e3e1e2d0283a1a070b5980a1dbba945ce631c2d1eccc088fdbad0f2dfa40155590bf83732d3ac4fcca2cc9237591b + version: 3.24.2 + resolution: "zod@npm:3.24.2" + checksum: 10c0/c638c7220150847f13ad90635b3e7d0321b36cce36f3fc6050ed960689594c949c326dfe2c6fa87c14b126ee5d370ccdebd6efb304f41ef5557a4aaca2824565 languageName: node linkType: hard