fix(sec): update npm deps to resolve npm audit warnings

pin brace-expansion to 5.0.8
update concurrently to 10.0.4
update electron-builder to 26.15.3
update eslint to 10.8.0
update eslint-plugin-perfectionist to 5.10.0
update @assistant-ui/react to 0.15.0
update @assistant-ui/react-streamdown to 0.3.8
update radix-ui to 1.6.7
update react-router-dom to react-router@8.3.0 - react-router-dom is no longer a standalone package, it just reexports react-router
remove @radix-ui/react-slot: we import this from `radix-ui`
remove eslint-plugin-react: we imported it, but never actually used it!
This commit is contained in:
ethernet 2026-07-30 15:29:19 -04:00
parent 1f70e7ee7e
commit 390a1771b2
61 changed files with 7271 additions and 3899 deletions

View file

@ -20,8 +20,8 @@
},
"dependencies": {
"@nous-research/ui": "0.16.0",
"@tailwindcss/vite": "^4.2.4",
"@tailwindcss/typography": "^0.5.19",
"@tailwindcss/vite": "^4.2.4",
"@tauri-apps/api": "^2.0.0",
"@tauri-apps/plugin-dialog": "^2.0.0",
"@tauri-apps/plugin-opener": "^2.0.0",
@ -33,7 +33,7 @@
"katex": "^0.16.45",
"lucide-react": "^0.577.0",
"nanostores": "^1.3.0",
"radix-ui": "^1.4.3",
"radix-ui": "1.6.7",
"react": "^19.2.4",
"react-dom": "^19.2.4",
"tailwind-merge": "^3.5.0",
@ -46,9 +46,8 @@
"@types/react": "^19.2.14",
"@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^6.0.2",
"eslint": "^9.39.4",
"eslint-plugin-perfectionist": "^5.9.0",
"eslint-plugin-react": "^7.37.5",
"eslint": "10.8.0",
"eslint-plugin-perfectionist": "^5.10.0",
"eslint-plugin-react-hooks": "^7.1.1",
"eslint-plugin-unused-imports": "^4.4.1",
"globals": "^17.4.0",

View file

@ -12,9 +12,9 @@
},
"scripts": {
"clean": "npm run clean:e2e && npm run clean:renderer && npm run clean:electron",
"clean:e2e":"tsc --build tsconfig.e2e.json --clean",
"clean:renderer":"tsc --build tsconfig.json --clean ",
"clean:electron":"tsc --build tsconfig.electron.json --clean",
"clean:e2e": "tsc --build tsconfig.e2e.json --clean",
"clean:renderer": "tsc --build tsconfig.json --clean ",
"clean:electron": "tsc --build tsconfig.electron.json --clean",
"dev": "concurrently -k \"npm:dev:renderer\" \"npm:dev:electron\"",
"dev:fake-boot": "cross-env HERMES_DESKTOP_BOOT_FAKE=1 HERMES_DESKTOP_BOOT_FAKE_STEP_MS=650 npm run dev",
"dev:mock": "node scripts/dev-mock.mjs",
@ -64,8 +64,8 @@
"test:e2e:update-snapshots": "npm run build && WLR_BACKENDS=headless WLR_NO_HARDWARE_CURSORS=1 cage -- npx playwright test e2e/ --reporter=list --update-snapshots"
},
"dependencies": {
"@assistant-ui/react": "^0.14.23",
"@assistant-ui/react-streamdown": "^0.3.4",
"@assistant-ui/react": "^0.15.0",
"@assistant-ui/react-streamdown": "^0.3.8",
"@audiowave/react": "^0.6.2",
"@chenglou/pretext": "^0.0.6",
"@codemirror/commands": "^6.10.4",
@ -81,7 +81,6 @@
"@lezer/highlight": "^1.2.3",
"@nanostores/react": "^1.1.0",
"@nous-research/ui": "^0.13.0",
"@radix-ui/react-slot": "^1.2.4",
"@streamdown/code": "^1.1.1",
"@tabler/icons-react": "^3.41.1",
"@tailwindcss/typography": "^0.5.19",
@ -112,12 +111,12 @@
"motion": "^12.38.0",
"nanostores": "^1.3.0",
"node-pty": "1.1.0",
"radix-ui": "^1.6.5",
"radix-ui": "1.6.2",
"react": "^19.2.5",
"react-arborist": "^3.5.0",
"react-dnd-html5-backend": "^14.0.3",
"react-dom": "^19.2.5",
"react-router-dom": "^7.17.0",
"react-router": "^8.3.0",
"react-shiki": "^0.9.3",
"remark-math": "^6.0.0",
"remend": "^1.3.0",
@ -149,14 +148,13 @@
"@typescript-eslint/parser": "^8.59.1",
"@vitejs/plugin-react": "^6.0.1",
"bippy": "0.5.43",
"concurrently": "^10.0.3",
"concurrently": "10.0.4",
"cross-env": "^10.1.0",
"electron": "40.10.2",
"electron-builder": "^26.8.1",
"electron-builder": "^26.15.3",
"esbuild": "^0.28.1",
"eslint": "^9.39.4",
"eslint-plugin-perfectionist": "^5.9.0",
"eslint-plugin-react": "^7.37.5",
"eslint": "10.8.0",
"eslint-plugin-perfectionist": "^5.10.0",
"eslint-plugin-react-hooks": "^7.1.1",
"eslint-plugin-unused-imports": "^4.4.1",
"globals": "^16.5.0",

View file

@ -1,6 +1,6 @@
import type * as React from 'react'
import { memo, useCallback, useEffect, useMemo, useState } from 'react'
import { useNavigate } from 'react-router-dom'
import { useNavigate } from 'react-router'
import { ZoomableImage } from '@/components/chat/zoomable-image'
import { PageLoader } from '@/components/page-loader'

View file

@ -10,15 +10,11 @@ import { type ComposerScope, ComposerScopeProvider, MAIN_COMPOSER_SCOPE } from '
import { useComposerDraft } from './use-composer-draft'
const mockComposerApi = { setText: vi.fn() }
const mockComposerApi = { setText: vi.fn(), getState: () => ({ text: '' }) }
vi.mock('@assistant-ui/react', () => ({
useAui: () => ({ composer: () => mockComposerApi }),
useAuiState: (selector: (state: { composer: { text: string } }) => unknown) => selector({ composer: { text: '' } }),
useComposerRuntime: () => ({
getState: () => ({ text: '' }),
subscribe: () => () => undefined
})
useAui: () => ({ composer: () => mockComposerApi, subscribe: () => () => undefined }),
useAuiState: (selector: (state: { composer: { text: string } }) => unknown) => selector({ composer: { text: '' } })
}))
interface ProbeHarnessProps {

View file

@ -1,4 +1,4 @@
import { useAui, useAuiState, useComposerRuntime } from '@assistant-ui/react'
import { useAui, useAuiState } from '@assistant-ui/react'
import { type RefObject, useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react'
import { SLASH_COMMAND_RE } from '@/lib/chat-runtime'
@ -58,7 +58,6 @@ export function useComposerDraft({
sessionId
}: UseComposerDraftArgs) {
const aui = useAui()
const composerRuntime = useComposerRuntime()
// Which composer this is on the focus bus + which attachment set it owns.
const { attachments: attachmentScope, target } = useComposerScope()
@ -79,7 +78,7 @@ export function useComposerDraft({
const setComposerText = useCallback(
(value: string) => {
try {
aui.composer().setText(value)
aui.composer.setText(value)
} catch {
// Composer core not bound yet — DOM/draftRef carry the text.
}
@ -272,7 +271,7 @@ export function useComposerDraft({
// eslint-disable-next-line no-restricted-syntax -- legitimate non-atom ref write (see eslint rule comment)
useEffect(() => {
const sync = () => {
const text = composerRuntime.getState().text
const text = aui.composer.getState().text
draftRef.current = text
const editor = editorRef.current
@ -304,13 +303,13 @@ export function useComposerDraft({
}, DRAFT_PERSIST_DEBOUNCE_MS)
}
const unsubscribe = composerRuntime.subscribe(sync)
const unsubscribe = aui.subscribe(sync)
return () => {
unsubscribe()
window.clearTimeout(draftPersistTimerRef.current)
}
}, [composerRuntime, queueEditRef])
}, [aui, queueEditRef])
const insertText = (text: string) => {
const base = draftRef.current

View file

@ -1,5 +1,5 @@
import { cleanup, render, screen } from '@testing-library/react'
import { MemoryRouter } from 'react-router-dom'
import { MemoryRouter } from 'react-router'
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
import { I18nProvider } from '@/i18n'

View file

@ -1,6 +1,6 @@
import { useStore } from '@nanostores/react'
import { type ReactNode, useEffect, useMemo } from 'react'
import { useNavigate } from 'react-router-dom'
import { useNavigate } from 'react-router'
import { blurComposerInput } from '@/app/chat/composer/focus'
import { AGENTS_ROUTE } from '@/app/routes'

View file

@ -4,7 +4,7 @@ import { useQuery } from '@tanstack/react-query'
import type { ReadableAtom } from 'nanostores'
import type * as React from 'react'
import { Suspense, useCallback, useEffect, useMemo, useState } from 'react'
import { useLocation } from 'react-router-dom'
import { useLocation } from 'react-router'
import type { SubmitTextOptions } from '@/app/session/hooks/use-prompt-actions/utils'
import { Thread } from '@/components/assistant-ui/thread'

View file

@ -3,7 +3,7 @@ import { sortableKeyboardCoordinates } from '@dnd-kit/sortable'
import { useStore } from '@nanostores/react'
import type * as React from 'react'
import { useCallback, useEffect, useMemo, useRef, useState } from 'react'
import { useLocation } from 'react-router-dom'
import { useLocation } from 'react-router'
import { PlatformAvatar } from '@/app/messaging/platform-icon'
import { Button } from '@/components/ui/button'

View file

@ -20,7 +20,7 @@ import {
import { CSS } from '@dnd-kit/utilities'
import { useStore } from '@nanostores/react'
import { useEffect, useRef, useState } from 'react'
import { useNavigate } from 'react-router-dom'
import { useNavigate } from 'react-router'
import { CodeEditor } from '@/components/chat/code-editor'
import { Button } from '@/components/ui/button'

View file

@ -2,7 +2,7 @@ import { useStore } from '@nanostores/react'
import { useQuery } from '@tanstack/react-query'
import { Dialog as DialogPrimitive } from 'radix-ui'
import { memo, useCallback, useDeferredValue, useEffect, useMemo, useRef, useState } from 'react'
import { useNavigate } from 'react-router-dom'
import { useNavigate } from 'react-router'
import {
HUD_HEADING,

View file

@ -9,7 +9,7 @@
import { useStore } from '@nanostores/react'
import { type ComponentProps, lazy, memo, type ReactNode, Suspense, useMemo } from 'react'
import { Navigate, Route, Routes, useParams } from 'react-router-dom'
import { Navigate, Route, Routes, useParams } from 'react-router'
import { ContribBoundary } from '@/contrib/react/boundary'
import { useContributions } from '@/contrib/react/use-contributions'

View file

@ -11,7 +11,7 @@
import { useStore } from '@nanostores/react'
import { useQueryClient } from '@tanstack/react-query'
import { type CSSProperties, lazy, type ReactNode, Suspense, useCallback, useEffect, useMemo, useRef } from 'react'
import { useLocation, useNavigate } from 'react-router-dom'
import { useLocation, useNavigate } from 'react-router'
import { formatRefValue } from '@/components/assistant-ui/directive-text'
import { BootFailureOverlay } from '@/components/boot-failure-overlay'

View file

@ -1,5 +1,5 @@
import { useEffect, useRef } from 'react'
import { useNavigate } from 'react-router-dom'
import { useNavigate } from 'react-router'
import { closeActiveTab } from '@/app/chat/close-tab'
import { $terminalTakeover, setTerminalTakeover } from '@/app/right-sidebar/store'

View file

@ -1,5 +1,5 @@
import { useCallback, useMemo } from 'react'
import { useLocation, useNavigate } from 'react-router-dom'
import { useLocation, useNavigate } from 'react-router'
// Read/write an enum-shaped URL search param (e.g. ?tab=foo). Used to make
// tabbed views survive a refresh. Always navigates with replace so tab clicks

View file

@ -1,4 +1,4 @@
import { useLocation } from 'react-router-dom'
import { useLocation } from 'react-router'
import { appViewForPath, isOverlayView } from '@/app/routes'

View file

@ -1,6 +1,6 @@
// @vitest-environment jsdom
import { act, cleanup, fireEvent, render, screen, waitFor } from '@testing-library/react'
import { MemoryRouter } from 'react-router-dom'
import { MemoryRouter } from 'react-router'
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
import type { MessagingPlatformInfo } from '@/types/hermes'

View file

@ -1,6 +1,6 @@
import { useStore } from '@nanostores/react'
import { useEffect, useRef, useState } from 'react'
import { useNavigate } from 'react-router-dom'
import { useNavigate } from 'react-router'
import { useGatewayRequest } from '@/app/gateway/hooks/use-gateway-request'
import { SETTINGS_ROUTE } from '@/app/routes'

View file

@ -1,7 +1,7 @@
import { useStore } from '@nanostores/react'
import { useEffect, useRef } from 'react'
import { createPortal } from 'react-dom'
import { useNavigate } from 'react-router-dom'
import { useNavigate } from 'react-router'
import { sessionTitle } from '@/lib/chat-runtime'
import { cn } from '@/lib/utils'

View file

@ -1,6 +1,6 @@
import { useStore } from '@nanostores/react'
import { type MutableRefObject, useCallback, useEffect, useRef } from 'react'
import type { NavigateFunction } from 'react-router-dom'
import type { NavigateFunction } from 'react-router'
import { revealTreePane } from '@/components/pane-shell/tree/store'
import { deleteSession, getSessionMessages, setSessionArchived } from '@/hermes'

View file

@ -1,7 +1,7 @@
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
import { cleanup, fireEvent, render, screen, waitFor } from '@testing-library/react'
import type { ReactNode } from 'react'
import { MemoryRouter } from 'react-router-dom'
import { MemoryRouter } from 'react-router'
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
import {

View file

@ -2,7 +2,7 @@ import { useStore } from '@nanostores/react'
import { useQuery } from '@tanstack/react-query'
import type { ChangeEvent } from 'react'
import { useEffect, useMemo, useRef, useState } from 'react'
import { useSearchParams } from 'react-router-dom'
import { useSearchParams } from 'react-router'
import { Button } from '@/components/ui/button'
import { Input } from '@/components/ui/input'

View file

@ -1,5 +1,5 @@
import { useCallback, useEffect, useMemo, useRef } from 'react'
import { useLocation, useNavigate } from 'react-router-dom'
import { useLocation, useNavigate } from 'react-router'
import { codiconIcon } from '@/components/ui/codicon'
import { Tip } from '@/components/ui/tooltip'

View file

@ -1,6 +1,6 @@
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
import { act, cleanup, fireEvent, render, screen, waitFor } from '@testing-library/react'
import { MemoryRouter } from 'react-router-dom'
import { MemoryRouter } from 'react-router'
import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from 'vitest'
// Radix Select calls scrollIntoView on its items when the content opens; jsdom

View file

@ -1,8 +1,8 @@
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
import { cleanup, fireEvent, render as rtlRender, screen, waitFor } from '@testing-library/react'
import type { ReactElement } from 'react'
import { MemoryRouter } from 'react-router-dom'
import type * as ReactRouterDom from 'react-router-dom'
import { MemoryRouter } from 'react-router'
import type * as ReactRouterDom from 'react-router'
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
import type { ToolsetConfig } from '@/types/hermes'
@ -11,7 +11,7 @@ import type { ToolsetConfig } from '@/types/hermes'
// needs a router context. The navigate spy asserts the deep-link target.
const navigateSpy = vi.fn()
vi.mock('react-router-dom', async importOriginal => ({
vi.mock('react-router', async importOriginal => ({
...(await importOriginal<typeof ReactRouterDom>()),
useNavigate: () => navigateSpy
}))

View file

@ -1,5 +1,5 @@
import { useCallback, useEffect, useMemo, useRef, useState } from 'react'
import { useNavigate } from 'react-router-dom'
import { useNavigate } from 'react-router'
import { SETTINGS_ROUTE } from '@/app/routes'
import { Button } from '@/components/ui/button'

View file

@ -1,5 +1,5 @@
import { useEffect } from 'react'
import { useSearchParams } from 'react-router-dom'
import { useSearchParams } from 'react-router'
interface DeepLinkHighlightOptions {
param: string

View file

@ -1,5 +1,5 @@
import { cleanup, fireEvent, render, screen, waitFor, within } from '@testing-library/react'
import { MemoryRouter } from 'react-router-dom'
import { MemoryRouter } from 'react-router'
import { afterEach, beforeAll, describe, expect, it, vi } from 'vitest'
import { StatusbarControls } from '@/app/shell/statusbar-controls'

View file

@ -1,5 +1,5 @@
import { useCallback, useEffect, useMemo, useRef } from 'react'
import { useLocation, useNavigate } from 'react-router-dom'
import { useLocation, useNavigate } from 'react-router'
import { type CommandCenterSection } from '@/app/command-center'
import {

View file

@ -1,6 +1,6 @@
import { useStore } from '@nanostores/react'
import { type ComponentProps, memo, type ReactNode, useMemo, useState } from 'react'
import { useNavigate } from 'react-router-dom'
import { useNavigate } from 'react-router'
import {
ContextMenu,

View file

@ -1,5 +1,5 @@
import { cleanup, fireEvent, render, screen, within } from '@testing-library/react'
import { MemoryRouter } from 'react-router-dom'
import { MemoryRouter } from 'react-router'
import { afterEach, beforeAll, describe, expect, it, vi } from 'vitest'
import { StatusbarControls, type StatusbarItem } from '@/app/shell/statusbar-controls'

View file

@ -1,6 +1,6 @@
import { useStore } from '@nanostores/react'
import { type ComponentProps, type MouseEvent, type ReactNode, useEffect, useState } from 'react'
import { useLocation, useNavigate } from 'react-router-dom'
import { useLocation, useNavigate } from 'react-router'
import { toggleLayoutEditMode } from '@/components/pane-shell/edit-mode'
import { resetLayoutTree } from '@/components/pane-shell/tree/store'

View file

@ -1,8 +1,8 @@
// @vitest-environment jsdom
import { QueryClientProvider } from '@tanstack/react-query'
import { act, cleanup, fireEvent, render, screen, waitFor } from '@testing-library/react'
import { MemoryRouter } from 'react-router-dom'
import type * as ReactRouterDom from 'react-router-dom'
import { MemoryRouter } from 'react-router'
import type * as ReactRouterDom from 'react-router'
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
import type * as HermesApi from '@/hermes'
@ -40,7 +40,7 @@ vi.mock('@/store/notifications', () => ({
// so the deep-link target is assertable.
const navigateSpy = vi.fn()
vi.mock('react-router-dom', async importOriginal => ({
vi.mock('react-router', async importOriginal => ({
...(await importOriginal<typeof ReactRouterDom>()),
useNavigate: () => navigateSpy
}))

View file

@ -2,7 +2,7 @@ import { useStore } from '@nanostores/react'
import { useQuery } from '@tanstack/react-query'
import type * as React from 'react'
import { useCallback, useEffect, useMemo, useRef, useState } from 'react'
import { useNavigate } from 'react-router-dom'
import { useNavigate } from 'react-router'
import { ArchiveSkillConfirmDialog } from '@/app/learning/archive-skill-confirm-dialog'
import { CodeEditor } from '@/components/chat/code-editor'

View file

@ -3,8 +3,8 @@ import {
BranchPickerPrimitive,
ErrorPrimitive,
MessagePrimitive,
useAui,
useAuiState,
useMessageRuntime
} from '@assistant-ui/react'
import { useStore } from '@nanostores/react'
import { type FC, useCallback, useMemo, useState } from 'react'
@ -54,7 +54,7 @@ export const AssistantMessage: FC<{
onDismissError?: (messageId: string) => void
}> = ({ onBranchInNewChat, onDismissError }) => {
const messageId = useAuiState(s => s.message.id)
const messageRuntime = useMessageRuntime()
const messageRuntime = useAui().message
const { t } = useI18n()
// PERF: this component must NOT subscribe to the streaming text. Every

View file

@ -1,4 +1,4 @@
import { useAuiState, useMessageRuntime } from '@assistant-ui/react'
import { useAui, useAuiState } from '@assistant-ui/react'
import { useStore } from '@nanostores/react'
import { type MouseEvent, useCallback } from 'react'
@ -106,7 +106,7 @@ export function useTapbackDoubleClick(
role: ChatMessage['role']
): ((event: MouseEvent<HTMLElement>) => void) | undefined {
const enabled = useStore($reactionsEnabled)
const messageRuntime = useMessageRuntime()
const messageRuntime = useAui().message
const onDoubleClick = useCallback(
(event: MouseEvent<HTMLElement>) => {

View file

@ -164,7 +164,7 @@ export const UserEditComposer: FC<UserEditComposerProps> = ({ cwd, gateway, sess
const next = `${base}${sep}${value}`
draftRef.current = next
aui.composer().setText(next)
aui.composer.setText(next)
const editor = editorRef.current
@ -229,7 +229,7 @@ export const UserEditComposer: FC<UserEditComposerProps> = ({ cwd, gateway, sess
if (nextDraft !== draftRef.current) {
draftRef.current = nextDraft
aui.composer().setText(nextDraft)
aui.composer.setText(nextDraft)
}
return nextDraft
@ -337,7 +337,7 @@ export const UserEditComposer: FC<UserEditComposerProps> = ({ cwd, gateway, sess
const finish = () => {
draftRef.current = composerPlainText(editor)
aui.composer().setText(draftRef.current)
aui.composer.setText(draftRef.current)
requestEditFocus()
starter ? window.setTimeout(refreshTrigger, 0) : closeTrigger()
}
@ -380,7 +380,7 @@ export const UserEditComposer: FC<UserEditComposerProps> = ({ cwd, gateway, sess
rememberInitialDraft()
const nextDraft = composerPlainText(editor)
draftRef.current = nextDraft
aui.composer().setText(nextDraft)
aui.composer.setText(nextDraft)
requestEditFocus()
return true
@ -580,7 +580,7 @@ export const UserEditComposer: FC<UserEditComposerProps> = ({ cwd, gateway, sess
// and leave revert as the only way out (#49903 is the same unguarded-core
// hazard on the main composer).
try {
aui.composer().send()
aui.composer.send()
} catch {
setSubmitting(false)
}
@ -623,7 +623,7 @@ export const UserEditComposer: FC<UserEditComposerProps> = ({ cwd, gateway, sess
// down (a send/cancel raced this timer), cancel() throws "Composer is
// not available" as an uncaught renderer error. Nothing to cancel then.
try {
aui.composer().cancel()
aui.composer.cancel()
} catch {
// Composer core already gone — the edit is closing anyway.
}
@ -689,7 +689,7 @@ export const UserEditComposer: FC<UserEditComposerProps> = ({ cwd, gateway, sess
if (event.key === 'Escape') {
event.preventDefault()
aui.composer().cancel()
aui.composer.cancel()
return
}

View file

@ -1,5 +1,5 @@
import { act, cleanup, fireEvent, render, screen, waitFor } from '@testing-library/react'
import { MemoryRouter, useNavigate } from 'react-router-dom'
import { MemoryRouter, useNavigate } from 'react-router'
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
import { FindBar } from '@/components/find-bar'

View file

@ -1,6 +1,6 @@
import { useStore } from '@nanostores/react'
import { useEffect, useRef, useState } from 'react'
import { useLocation } from 'react-router-dom'
import { useLocation } from 'react-router'
import { Tip } from '@/components/ui/tooltip'
import { useI18n } from '@/i18n'

View file

@ -14,7 +14,7 @@ import '@/debug/dev-only'
import { QueryClientProvider } from '@tanstack/react-query'
import { StrictMode } from 'react'
import { createRoot } from 'react-dom/client'
import { HashRouter } from 'react-router-dom'
import { HashRouter } from 'react-router'
import App from './app'
import { ErrorBoundary } from './components/error-boundary'

View file

@ -20,7 +20,7 @@
},
"devDependencies": {
"@eslint/js": "^9.39.4",
"eslint": "^9.39.4",
"eslint": "10.8.0",
"globals": "^17.4.0",
"typescript": "^6.0.3",
"typescript-eslint": "^8.56.1"

View file

@ -15,7 +15,6 @@ import js from '@eslint/js'
import typescriptEslint from '@typescript-eslint/eslint-plugin'
import typescriptParser from '@typescript-eslint/parser'
import perfectionist from 'eslint-plugin-perfectionist'
import reactPlugin from 'eslint-plugin-react'
import hooksPlugin from 'eslint-plugin-react-hooks'
import unusedImports from 'eslint-plugin-unused-imports'
import globals from 'globals'
@ -41,7 +40,6 @@ export default [
plugins: {
'@typescript-eslint': typescriptEslint,
perfectionist,
react: reactPlugin,
'react-hooks': hooksPlugin,
'unused-imports': unusedImports
},
@ -95,9 +93,6 @@ export default [
'react-hooks/exhaustive-deps': 'warn',
'react-hooks/rules-of-hooks': 'error',
'unused-imports/no-unused-imports': 'error'
},
settings: {
react: { version: 'detect' }
}
},
{

10971
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -41,7 +41,8 @@
"overrides": {
"lodash": "4.18.1",
"yauzl": "^3.3.1",
"protobufjs": "^8.7.1"
"protobufjs": "^8.7.1",
"brace-expansion": "5.0.8"
},
"engines": {
"node": ">=20.0.0"

View file

@ -11,8 +11,8 @@
"fix": "npm run lint:fix"
},
"devDependencies": {
"eslint": "^9.39.4",
"@types/plist": "^3.0.5",
"eslint": "10.8.0",
"plist": "^3.1.0",
"typescript": "^6.0.3",
"vitest": "^4.1.9"

View file

@ -36,9 +36,8 @@
"@typescript-eslint/eslint-plugin": "^8",
"@typescript-eslint/parser": "^8",
"esbuild": "^0.28.1",
"eslint": "^9",
"eslint-plugin-perfectionist": "^5",
"eslint-plugin-react": "^7",
"eslint": "10.8.0",
"eslint-plugin-perfectionist": "^5.10.0",
"eslint-plugin-react-hooks": "^7",
"eslint-plugin-unused-imports": "^4",
"globals": "^16",

View file

@ -34,7 +34,7 @@
"qrcode": "^1.5.4",
"react": "^19.2.4",
"react-dom": "^19.2.4",
"react-router-dom": "^7.17.0",
"react-router": "^8.3.0",
"tailwind-merge": "^3.5.0",
"tailwindcss": "^4.2.1",
"unicode-animations": "^1.0.3"
@ -46,7 +46,7 @@
"@types/react": "^19.2.14",
"@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^6.0.2",
"eslint": "^9.39.4",
"eslint": "10.8.0",
"eslint-plugin-react-hooks": "^7.0.1",
"eslint-plugin-react-refresh": "^0.5.2",
"globals": "^17.4.0",

View file

@ -19,7 +19,7 @@ import {
Navigate,
useLocation,
useNavigate,
} from "react-router-dom";
} from "react-router";
import {
Activity,
BarChart3,

View file

@ -23,7 +23,7 @@ import { ListItem } from "@nous-research/ui/ui/components/list-item";
import { Spinner } from "@nous-research/ui/ui/components/spinner";
import { AlertCircle, MessageSquarePlus, RefreshCw } from "lucide-react";
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
import { useSearchParams } from "react-router-dom";
import { useSearchParams } from "react-router";
import { useI18n } from "@/i18n";
import { api, type SessionInfo } from "@/lib/api";

View file

@ -1,4 +1,4 @@
import { Link } from "react-router-dom";
import { Link } from "react-router";
import type { StatusResponse } from "@/lib/api";
import { cn } from "@/lib/utils";
import { useI18n } from "@/i18n";

View file

@ -1,5 +1,5 @@
import { useLayoutEffect, useMemo, useState, type ReactNode } from "react";
import { useLocation } from "react-router-dom";
import { useLocation } from "react-router";
import { PageHeaderContext } from "./page-header-context";
import { resolvePageTitle } from "@/lib/resolve-page-title";
import { cn } from "@/lib/utils";

View file

@ -5,7 +5,7 @@ import {
useState,
type ReactNode,
} from "react";
import { useLocation, useSearchParams } from "react-router-dom";
import { useLocation, useSearchParams } from "react-router";
import { api, setManagementProfile } from "@/lib/api";
import { ProfileContext } from "@/contexts/profile-context";

View file

@ -1,5 +1,5 @@
import { createRoot } from "react-dom/client";
import { BrowserRouter } from "react-router-dom";
import { BrowserRouter } from "react-router";
import "./index.css";
import App from "./App";
import { SystemActionsProvider } from "./contexts/SystemActions";

View file

@ -28,7 +28,7 @@ import { cn } from "@/lib/utils";
import { Copy, PanelRight, RotateCcw, X } from "lucide-react";
import { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from "react";
import { createPortal } from "react-dom";
import { useSearchParams } from "react-router-dom";
import { useSearchParams } from "react-router";
import { ChatSidebar } from "@/components/ChatSidebar";
import { ChatSessionList } from "@/components/ChatSessionList";

View file

@ -1,7 +1,7 @@
import { useCallback, useEffect, useState } from "react";
import { ExternalLink, RefreshCw, Trash2, Eye, EyeOff } from "lucide-react";
import type { Translations } from "@/i18n/types";
import { Link } from "react-router-dom";
import { Link } from "react-router";
import { api } from "@/lib/api";
import type {
HubAgentPluginRow,

View file

@ -1,5 +1,5 @@
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
import { useNavigate } from "react-router-dom";
import { useNavigate } from "react-router";
import { H2 } from "@nous-research/ui/ui/components/typography/h2";
import { Card, CardContent } from "@nous-research/ui/ui/components/card";
import { Badge } from "@nous-research/ui/ui/components/badge";

View file

@ -6,7 +6,7 @@ import {
useRef,
useState,
} from "react";
import { useNavigate } from "react-router-dom";
import { useNavigate } from "react-router";
import { useProfileScope } from "@/contexts/useProfileScope";
import {
AlignLeft,

View file

@ -6,7 +6,7 @@ import {
useCallback,
useRef,
} from "react";
import { useNavigate } from "react-router-dom";
import { useNavigate } from "react-router";
import {
AlertTriangle,
CheckCircle2,

View file

@ -1,5 +1,5 @@
import { useEffect, useLayoutEffect, useState, useMemo, useCallback } from "react";
import { useNavigate } from "react-router-dom";
import { useNavigate } from "react-router";
import {
Package,
Search,

View file

@ -1,5 +1,5 @@
import { useCallback, useEffect, useRef, useState } from "react";
import { Link } from "react-router-dom";
import { Link } from "react-router";
import {
Activity,
Brain,

View file

@ -101,7 +101,7 @@ export default defineConfig({
groups: [
{
name: "react-vendor",
test: /node_modules[\\/](react|react-dom|scheduler|react-router|react-router-dom)([\\/]|$)/,
test: /node_modules[\\/](react|react-dom|scheduler|react-router|react-router)([\\/]|$)/,
},
{
name: "xterm",