Merge branch 'main' into feat/end-user-oauth

This commit is contained in:
zhsama
2025-12-08 16:49:57 +08:00
204 changed files with 7347 additions and 5943 deletions

View File

@ -61,13 +61,13 @@ if $web_modified; then
lint-staged
if $web_ts_modified; then
echo "Running TypeScript type-check"
if ! pnpm run type-check; then
echo "Type check failed. Please run 'pnpm run type-check' to fix the errors."
echo "Running TypeScript type-check:tsgo"
if ! pnpm run type-check:tsgo; then
echo "Type check failed. Please run 'pnpm run type-check:tsgo' to fix the errors."
exit 1
fi
else
echo "No staged TypeScript changes detected, skipping type-check"
echo "No staged TypeScript changes detected, skipping type-check:tsgo"
fi
echo "Running unit tests check"

View File

@ -121,7 +121,7 @@ const DatasetDetailLayout: FC<IAppDetailLayoutProps> = (props) => {
<div
className={cn(
'flex grow overflow-hidden',
hideHeader && isPipelineCanvas ? '' : 'rounded-t-2xl border-t border-effects-highlight',
hideHeader && isPipelineCanvas ? '' : 'rounded-t-2xl',
)}
>
<DatasetDetailContext.Provider value={{

View File

@ -94,8 +94,8 @@ const NormalForm = () => {
<>
<div className="mx-auto mt-8 w-full">
<div className="mx-auto w-full">
<h2 className="title-4xl-semi-bold text-text-primary">{t('login.pageTitle')}</h2>
{!systemFeatures.branding.enabled && <p className='body-md-regular mt-2 text-text-tertiary'>{t('login.welcome')}</p>}
<h2 className="title-4xl-semi-bold text-text-primary">{systemFeatures.branding.enabled ? t('login.pageTitleForE') : t('login.pageTitle')}</h2>
<p className='body-md-regular mt-2 text-text-tertiary'>{t('login.welcome')}</p>
</div>
<div className="relative">
<div className="mt-6 flex flex-col gap-3">

View File

@ -27,24 +27,33 @@ export type QueryParam = {
sort_by?: string
}
const defaultQueryParams: QueryParam = {
period: '2',
annotation_status: 'all',
sort_by: '-created_at',
}
const logsStateCache = new Map<string, {
queryParams: QueryParam
currPage: number
limit: number
}>()
const Logs: FC<ILogsProps> = ({ appDetail }) => {
const { t } = useTranslation()
const router = useRouter()
const pathname = usePathname()
const searchParams = useSearchParams()
const [queryParams, setQueryParams] = useState<QueryParam>({
period: '2',
annotation_status: 'all',
sort_by: '-created_at',
})
const getPageFromParams = useCallback(() => {
const pageParam = Number.parseInt(searchParams.get('page') || '1', 10)
if (Number.isNaN(pageParam) || pageParam < 1)
return 0
return pageParam - 1
}, [searchParams])
const [currPage, setCurrPage] = React.useState<number>(() => getPageFromParams())
const [limit, setLimit] = React.useState<number>(APP_PAGE_LIMIT)
const cachedState = logsStateCache.get(appDetail.id)
const [queryParams, setQueryParams] = useState<QueryParam>(cachedState?.queryParams ?? defaultQueryParams)
const [currPage, setCurrPage] = React.useState<number>(() => cachedState?.currPage ?? getPageFromParams())
const [limit, setLimit] = React.useState<number>(cachedState?.limit ?? APP_PAGE_LIMIT)
const debouncedQueryParams = useDebounce(queryParams, { wait: 500 })
useEffect(() => {
@ -52,6 +61,14 @@ const Logs: FC<ILogsProps> = ({ appDetail }) => {
setCurrPage(prev => (prev === pageFromParams ? prev : pageFromParams))
}, [getPageFromParams])
useEffect(() => {
logsStateCache.set(appDetail.id, {
queryParams,
currPage,
limit,
})
}, [appDetail.id, currPage, limit, queryParams])
// Get the app type first
const isChatMode = appDetail.mode !== AppModeEnum.COMPLETION
@ -85,6 +102,11 @@ const Logs: FC<ILogsProps> = ({ appDetail }) => {
const total = isChatMode ? chatConversations?.total : completionConversations?.total
const handleQueryParamsChange = useCallback((next: QueryParam) => {
setCurrPage(0)
setQueryParams(next)
}, [])
const handlePageChange = useCallback((page: number) => {
setCurrPage(page)
const params = new URLSearchParams(searchParams.toString())
@ -101,7 +123,7 @@ const Logs: FC<ILogsProps> = ({ appDetail }) => {
<div className='flex h-full grow flex-col'>
<p className='system-sm-regular shrink-0 text-text-tertiary'>{t('appLog.description')}</p>
<div className='flex max-h-[calc(100%-16px)] flex-1 grow flex-col py-4'>
<Filter isChatMode={isChatMode} appId={appDetail.id} queryParams={queryParams} setQueryParams={setQueryParams} />
<Filter isChatMode={isChatMode} appId={appDetail.id} queryParams={queryParams} setQueryParams={handleQueryParamsChange} />
{total === undefined
? <Loading type='app' />
: total > 0

View File

@ -31,7 +31,7 @@ const ResultItemExternal: FC<Props> = ({ payload, positionId }) => {
{/* Main */}
<div className='mt-1 px-3'>
<div className='body-md-regular line-clamp-2 break-all'>{content}</div>
<div className='body-md-regular line-clamp-2 break-all text-text-primary'>{content}</div>
</div>
{/* Foot */}

View File

@ -28,7 +28,7 @@ const HeaderWrapper = ({
return (
<div className={classNames(
'sticky left-0 right-0 top-0 z-[15] flex min-h-[56px] shrink-0 grow-0 basis-auto flex-col',
'sticky left-0 right-0 top-0 z-[30] flex min-h-[56px] shrink-0 grow-0 basis-auto flex-col',
s.header,
isBordered ? 'border-b border-divider-regular' : '',
hideHeader && (inWorkflowCanvas || isPipelineCanvas) && 'hidden',

View File

@ -45,7 +45,8 @@ const Header = () => {
const renderLogo = () => (
<h1>
<Link href="/apps" className='flex h-8 shrink-0 items-center justify-center px-0.5 indent-[-9999px]'>
<Link href="/apps" className='flex h-8 shrink-0 items-center justify-center overflow-hidden whitespace-nowrap px-0.5 indent-[-9999px]'>
{isBrandingEnabled && systemFeatures.branding.application_title ? systemFeatures.branding.application_title : 'Dify'}
{systemFeatures.branding.enabled && systemFeatures.branding.workspace_logo
? <img
src={systemFeatures.branding.workspace_logo}
@ -53,7 +54,6 @@ const Header = () => {
alt='logo'
/>
: <DifyLogo />}
{isBrandingEnabled && systemFeatures.branding.application_title ? systemFeatures.branding.application_title : 'dify'}
</Link>
</h1>
)

View File

@ -1,3 +1,4 @@
import React from 'react'
import { RiInstallLine } from '@remixicon/react'
import { formatNumber } from '@/utils/format'
@ -5,7 +6,7 @@ type Props = {
downloadCount: number
}
const DownloadCount = ({
const DownloadCountComponent = ({
downloadCount,
}: Props) => {
return (
@ -16,4 +17,7 @@ const DownloadCount = ({
)
}
// Memoize to prevent unnecessary re-renders
const DownloadCount = React.memo(DownloadCountComponent)
export default DownloadCount

View File

@ -1,3 +1,4 @@
import React from 'react'
import DownloadCount from './base/download-count'
type Props = {
@ -5,7 +6,7 @@ type Props = {
tags: string[]
}
const CardMoreInfo = ({
const CardMoreInfoComponent = ({
downloadCount,
tags,
}: Props) => {
@ -33,4 +34,7 @@ const CardMoreInfo = ({
)
}
// Memoize to prevent unnecessary re-renders when tags array hasn't changed
const CardMoreInfo = React.memo(CardMoreInfoComponent)
export default CardMoreInfo

View File

@ -1,4 +1,5 @@
'use client'
import React, { useMemo } from 'react'
import { useTheme } from 'next-themes'
import { RiArrowRightUpLine } from '@remixicon/react'
import { getPluginDetailLinkInMarketplace, getPluginLinkInMarketplace } from '../utils'
@ -17,7 +18,7 @@ type CardWrapperProps = {
showInstallButton?: boolean
locale?: string
}
const CardWrapper = ({
const CardWrapperComponent = ({
plugin,
showInstallButton,
locale,
@ -31,6 +32,18 @@ const CardWrapper = ({
const { locale: localeFromLocale } = useI18N()
const { getTagLabel } = useTags(t)
// Memoize marketplace link params to prevent unnecessary re-renders
const marketplaceLinkParams = useMemo(() => ({
language: localeFromLocale,
theme,
}), [localeFromLocale, theme])
// Memoize tag labels to prevent recreating array on every render
const tagLabels = useMemo(() =>
plugin.tags.map(tag => getTagLabel(tag.name)),
[plugin.tags, getTagLabel],
)
if (showInstallButton) {
return (
<div
@ -43,12 +56,12 @@ const CardWrapper = ({
footer={
<CardMoreInfo
downloadCount={plugin.install_count}
tags={plugin.tags.map(tag => getTagLabel(tag.name))}
tags={tagLabels}
/>
}
/>
{
<div className='absolute bottom-0 hidden w-full items-center space-x-2 rounded-b-xl bg-gradient-to-tr from-components-panel-on-panel-item-bg to-background-gradient-mask-transparent px-4 pb-4 pt-8 group-hover:flex'>
<div className='absolute bottom-0 hidden w-full items-center space-x-2 rounded-b-xl bg-gradient-to-tr from-components-panel-on-panel-item-bg to-background-gradient-mask-transparent px-4 pb-4 pt-4 group-hover:flex'>
<Button
variant='primary'
className='w-[calc(50%-4px)]'
@ -56,7 +69,7 @@ const CardWrapper = ({
>
{t('plugin.detailPanel.operation.install')}
</Button>
<a href={getPluginLinkInMarketplace(plugin, { language: localeFromLocale, theme })} target='_blank' className='block w-[calc(50%-4px)] flex-1 shrink-0'>
<a href={getPluginLinkInMarketplace(plugin, marketplaceLinkParams)} target='_blank' className='block w-[calc(50%-4px)] flex-1 shrink-0'>
<Button
className='w-full gap-0.5'
>
@ -92,7 +105,7 @@ const CardWrapper = ({
footer={
<CardMoreInfo
downloadCount={plugin.install_count}
tags={plugin.tags.map(tag => getTagLabel(tag.name))}
tags={tagLabels}
/>
}
/>
@ -100,4 +113,7 @@ const CardWrapper = ({
)
}
// Memoize the component to prevent unnecessary re-renders when props haven't changed
const CardWrapper = React.memo(CardWrapperComponent)
export default CardWrapper

View File

@ -1,5 +1,5 @@
'use client'
import React from 'react'
import React, { useMemo } from 'react'
import type { FC } from 'react'
import { useTheme } from 'next-themes'
import { useTranslation } from 'react-i18next'
@ -23,7 +23,7 @@ type Props = {
payload: Plugin
}
const ProviderCard: FC<Props> = ({
const ProviderCardComponent: FC<Props> = ({
className,
payload,
}) => {
@ -37,6 +37,9 @@ const ProviderCard: FC<Props> = ({
const { org, label } = payload
const { locale } = useI18N()
// Memoize the marketplace link params to prevent unnecessary re-renders
const marketplaceLinkParams = useMemo(() => ({ language: locale, theme }), [locale, theme])
return (
<div className={cn('group relative rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-on-panel-item-bg p-4 pb-3 shadow-xs hover:bg-components-panel-on-panel-item-bg', className)}>
{/* Header */}
@ -63,7 +66,7 @@ const ProviderCard: FC<Props> = ({
))}
</div>
<div
className='absolute bottom-0 left-0 right-0 hidden items-center gap-2 rounded-xl bg-gradient-to-tr from-components-panel-on-panel-item-bg to-background-gradient-mask-transparent p-4 pt-8 group-hover:flex'
className='absolute bottom-0 left-0 right-0 hidden items-center gap-2 rounded-xl bg-gradient-to-tr from-components-panel-on-panel-item-bg to-background-gradient-mask-transparent p-4 pt-4 group-hover:flex'
>
<Button
className='grow'
@ -76,7 +79,7 @@ const ProviderCard: FC<Props> = ({
className='grow'
variant='secondary'
>
<a href={`${getPluginLinkInMarketplace(payload)}?language=${locale}${theme ? `&theme=${theme}` : ''}`} target='_blank' className='flex items-center gap-0.5'>
<a href={getPluginLinkInMarketplace(payload, marketplaceLinkParams)} target='_blank' className='flex items-center gap-0.5'>
{t('plugin.detailPanel.operation.detail')}
<RiArrowRightUpLine className='h-4 w-4' />
</a>
@ -96,4 +99,7 @@ const ProviderCard: FC<Props> = ({
)
}
// Memoize the component to prevent unnecessary re-renders when props haven't changed
const ProviderCard = React.memo(ProviderCardComponent)
export default ProviderCard

View File

@ -1,5 +1,5 @@
import { useCallback } from 'react'
import useNodes from '@/app/components/workflow/store/workflow/use-nodes'
import { useNodes } from 'reactflow'
import { uniqBy } from 'lodash-es'
import {
useIsChatMode,

View File

@ -1,6 +1,6 @@
import type { FC } from 'react'
import React from 'react'
import useNodes from '@/app/components/workflow/store/workflow/use-nodes'
import { useNodes } from 'reactflow'
import { useTranslation } from 'react-i18next'
import type { AssignerNodeType } from './types'
import { isSystemVar } from '@/app/components/workflow/nodes/_base/components/variable/utils'

View File

@ -1,6 +1,6 @@
import type { FC } from 'react'
import React from 'react'
import useNodes from '@/app/components/workflow/store/workflow/use-nodes'
import { useNodes } from 'reactflow'
import { useTranslation } from 'react-i18next'
import type { DocExtractorNodeType } from './types'
import { isSystemVar } from '@/app/components/workflow/nodes/_base/components/variable/utils'

View File

@ -3,7 +3,7 @@ import {
useMemo,
} from 'react'
import { useTranslation } from 'react-i18next'
import useNodes from '@/app/components/workflow/store/workflow/use-nodes'
import { useNodes } from 'reactflow'
import { ComparisonOperator } from '../types'
import {
comparisonOperatorNotRequireValue,

View File

@ -1,6 +1,6 @@
import type { FC } from 'react'
import React from 'react'
import useNodes from '@/app/components/workflow/store/workflow/use-nodes'
import { useNodes } from 'reactflow'
import { useTranslation } from 'react-i18next'
import type { ListFilterNodeType } from './types'
import { isSystemVar } from '@/app/components/workflow/nodes/_base/components/variable/utils'

View File

@ -3,7 +3,7 @@ import {
useMemo,
} from 'react'
import { useTranslation } from 'react-i18next'
import useNodes from '@/app/components/workflow/store/workflow/use-nodes'
import { useNodes } from 'reactflow'
import { useStore } from '../../../store'
import { BlockEnum } from '../../../types'
import type {

View File

@ -2,7 +2,7 @@ import { useCallback } from 'react'
import {
useStoreApi,
} from 'reactflow'
import useNodes from '@/app/components/workflow/store/workflow/use-nodes'
import { useNodes } from 'reactflow'
import { uniqBy } from 'lodash-es'
import { produce } from 'immer'

View File

@ -158,7 +158,7 @@ const UpdateDSLModal = ({
}
return true
}
catch (err: any) {
catch {
notify({ type: 'error', message: t('workflow.common.importFailure') })
return false
}

View File

@ -78,6 +78,7 @@ export default combine(
},
{
ignores: [
'storybook-static/**',
'**/node_modules/*',
'**/dist/',
'**/build/',
@ -255,10 +256,5 @@ export default combine(
'tailwindcss/migration-from-tailwind-2': 'warn',
},
},
oxlint.configs['flat/recommended'],
{
rules: {
'react-hooks/exhaustive-deps': 'warn',
},
},
...oxlint.buildFromOxlintConfigFile('./.oxlintrc.json'),
)

View File

@ -29,6 +29,7 @@ const translation = {
vectorSpace: 'Vektorraum',
vectorSpaceTooltip: 'Vektorraum ist das Langzeitspeichersystem, das erforderlich ist, damit LLMs Ihre Daten verstehen können.',
documentProcessingPriority: 'Priorität der Dokumentenverarbeitung',
documentProcessingPriorityTip: 'Für eine höhere Priorität bei der Dokumentenverarbeitung upgraden Sie bitte Ihren Plan.',
documentProcessingPriorityUpgrade: 'Mehr Daten mit höherer Genauigkeit bei schnelleren Geschwindigkeiten verarbeiten.',
priority: {
'standard': 'Standard',

View File

@ -76,6 +76,7 @@ const translation = {
unlimitedApiRate: 'No Dify API Rate Limit',
apiRateLimitTooltip: 'API Rate Limit applies to all requests made through the Dify API, including text generation, chat conversations, workflow executions, and document processing.',
documentProcessingPriority: ' Document Processing',
documentProcessingPriorityTip: 'For higher document processing priority, please upgrade your plan.',
documentProcessingPriorityUpgrade: 'Process more data with higher accuracy at faster speeds.',
priority: {
'standard': 'Standard',

View File

@ -30,6 +30,7 @@ const translation = {
vectorSpace: 'Espacio Vectorial',
vectorSpaceTooltip: 'El Espacio Vectorial es el sistema de memoria a largo plazo necesario para que los LLMs comprendan tus datos.',
documentProcessingPriority: 'Prioridad de Procesamiento de Documentos',
documentProcessingPriorityTip: 'Para una mayor prioridad en el procesamiento de documentos, actualice su plan.',
documentProcessingPriorityUpgrade: 'Procesa más datos con mayor precisión y velocidad.',
priority: {
'standard': 'Estándar',

View File

@ -197,258 +197,6 @@ const translation = {
},
contentEnableLabel: 'مدیریت محتوا فعال شده است',
},
generate: {
title: 'تولید کننده دستورالعمل',
description: 'تولید کننده دستورالعمل از مدل تنظیم شده برای بهینه سازی دستورالعمل‌ها برای کیفیت بالاتر و ساختار بهتر استفاده می‌کند. لطفاً دستورالعمل‌های واضح و دقیقی بنویسید.',
tryIt: 'امتحان کنید',
instruction: 'دستورالعمل‌ها',
instructionPlaceHolder: 'دستورالعمل‌های واضح و خاصی بنویسید.',
generate: 'تولید',
resTitle: 'دستورالعمل تولید شده',
noDataLine1: 'موارد استفاده خود را در سمت چپ توصیف کنید،',
noDataLine2: 'پیش‌نمایش ارکستراسیون در اینجا نشان داده خواهد شد.',
apply: 'اعمال',
loading: 'در حال ارکستراسیون برنامه برای شما...',
overwriteTitle: 'آیا تنظیمات موجود را لغو می‌کنید؟',
overwriteMessage: 'اعمال این دستورالعمل تنظیمات موجود را لغو خواهد کرد.',
template: {
pythonDebugger: {
name: 'اشکال‌زدای پایتون',
instruction: 'یک بات که می‌تواند بر اساس دستورالعمل شما کد تولید و اشکال‌زدایی کند',
},
translation: {
name: 'ترجمه',
instruction: 'یک مترجم که می‌تواند چندین زبان را ترجمه کند',
},
professionalAnalyst: {
name: 'تحلیلگر حرفه‌ای',
instruction: 'استخراج بینش‌ها، شناسایی ریسک و خلاصه‌سازی اطلاعات کلیدی از گزارش‌های طولانی به یک یادداشت کوتاه',
},
excelFormulaExpert: {
name: 'کارشناس فرمول اکسل',
instruction: 'یک چت‌بات که می‌تواند به کاربران مبتدی کمک کند فرمول‌های اکسل را بر اساس دستورالعمل‌های کاربر درک، استفاده و ایجاد کنند',
},
travelPlanning: {
name: 'برنامه‌ریزی سفر',
instruction: 'دستیار برنامه‌ریزی سفر یک ابزار هوشمند است که به کاربران کمک می‌کند سفرهای خود را به راحتی برنامه‌ریزی کنند',
},
SQLSorcerer: {
name: 'جادوگر SQL',
instruction: 'تبدیل زبان روزمره به پرس و جوهای SQL',
},
GitGud: {
name: 'Git gud',
instruction: 'تولید دستورات مناسب Git بر اساس اقدامات توصیف شده توسط کاربر در کنترل نسخه',
},
meetingTakeaways: {
name: 'نتایج جلسات',
instruction: 'خلاصه‌سازی جلسات به صورت مختصر شامل موضوعات بحث، نکات کلیدی و موارد اقدام',
},
writingsPolisher: {
name: 'پولیش‌گر نوشته‌ها',
instruction: 'استفاده از تکنیک‌های ویرایش پیشرفته برای بهبود نوشته‌های شما',
},
},
},
resetConfig: {
title: 'بازنشانی تأیید می‌شود؟',
message: 'بازنشانی تغییرات را لغو کرده و تنظیمات منتشر شده آخر را بازیابی می‌کند.',
},
errorMessage: {
nameOfKeyRequired: 'نام کلید: {{key}} مورد نیاز است',
valueOfVarRequired: 'مقدار {{key}} نمی‌تواند خالی باشد',
queryRequired: 'متن درخواست مورد نیاز است.',
waitForResponse: 'لطفاً منتظر پاسخ به پیام قبلی بمانید.',
waitForBatchResponse: 'لطفاً منتظر پاسخ به کار دسته‌ای بمانید.',
notSelectModel: 'لطفاً یک مدل را انتخاب کنید',
waitForImgUpload: 'لطفاً منتظر بارگذاری تصویر بمانید',
},
chatSubTitle: 'دستورالعمل‌ها',
completionSubTitle: 'پیشوند پرس و جو',
promptTip: 'دستورالعمل‌ها و محدودیت‌ها پاسخ‌های AI را هدایت می‌کنند. متغیرهایی مانند {{input}} را درج کنید. این دستورالعمل برای کاربران قابل مشاهده نخواهد بود.',
formattingChangedTitle: 'قالب‌بندی تغییر کرد',
formattingChangedText: 'تغییر قالب‌بندی منطقه اشکال‌زدایی را بازنشانی خواهد کرد، آیا مطمئن هستید؟',
variableTitle: 'متغیرها',
variableTip: 'کاربران متغیرها را در فرم پر می‌کنند و به طور خودکار متغیرها را در دستورالعمل‌ها جایگزین می‌کنند.',
notSetVar: 'متغیرها به کاربران اجازه می‌دهند که کلمات پرس و جو یا جملات ابتدایی را هنگام پر کردن فرم معرفی کنند. شما می‌توانید سعی کنید "{{input}}" را در کلمات پرس و جو وارد کنید.',
autoAddVar: 'متغیرهای تعریف نشده‌ای که در پیش‌پرسش ذکر شده‌اند، آیا می‌خواهید آنها را به فرم ورودی کاربر اضافه کنید؟',
variableTable: {
key: 'کلید متغیر',
name: 'نام فیلد ورودی کاربر',
optional: 'اختیاری',
type: 'نوع ورودی',
action: 'اقدامات',
typeString: 'رشته',
typeSelect: 'انتخاب',
},
varKeyError: {
canNoBeEmpty: '{{key}} مطلوب',
tooLong: '{{key}} طولانی است. نمی‌تواند بیش از 30 کاراکتر باشد',
notValid: '{{key}} نامعتبر است. فقط می‌تواند شامل حروف، اعداد و زیرخط باشد',
notStartWithNumber: '{{key}} نمی‌تواند با عدد شروع شود',
keyAlreadyExists: '{{key}} از قبل وجود دارد',
},
otherError: {
promptNoBeEmpty: 'پرس و جو نمی‌تواند خالی باشد',
historyNoBeEmpty: 'تاریخچه مکالمه باید در پرس و جو تنظیم شود',
queryNoBeEmpty: 'پرس و جو باید در پرس و جو تنظیم شود',
},
variableConfig: {
'addModalTitle': 'افزودن فیلد ورودی',
'editModalTitle': 'ویرایش فیلد ورودی',
'description': 'تنظیم برای متغیر {{varName}}',
'fieldType': 'نوع فیلد',
'string': 'متن کوتاه',
'text-input': 'متن کوتاه',
'paragraph': 'پاراگراف',
'select': 'انتخاب',
'number': 'عدد',
'notSet': 'تنظیم نشده، سعی کنید {{input}} را در پرس و جو وارد کنید',
'stringTitle': 'گزینه‌های جعبه متن فرم',
'maxLength': 'حداکثر طول',
'options': 'گزینه‌ها',
'addOption': 'افزودن گزینه',
'apiBasedVar': 'متغیر مبتنی بر API',
'varName': 'نام متغیر',
'labelName': 'نام برچسب',
'inputPlaceholder': 'لطفاً وارد کنید',
'content': 'محتوا',
'required': 'مورد نیاز',
'hide': 'مخفی کردن',
'errorMsg': {
labelNameRequired: 'نام برچسب مورد نیاز است',
varNameCanBeRepeat: 'نام متغیر نمی‌تواند تکراری باشد',
atLeastOneOption: 'حداقل یک گزینه مورد نیاز است',
optionRepeat: 'گزینه‌های تکراری وجود دارد',
},
},
vision: {
name: 'بینایی',
description: 'فعال کردن بینایی به مدل اجازه می‌دهد تصاویر را دریافت کند و به سوالات مربوط به آنها پاسخ دهد.',
settings: 'تنظیمات',
visionSettings: {
title: 'تنظیمات بینایی',
resolution: 'وضوح',
resolutionTooltip: `وضوح پایین به مدل اجازه می‌دهد نسخه 512x512 کم‌وضوح تصویر را دریافت کند و تصویر را با بودجه 65 توکن نمایش دهد. این به API اجازه می‌دهد پاسخ‌های سریع‌تری بدهد و توکن‌های ورودی کمتری برای موارد استفاده که نیاز به جزئیات بالا ندارند مصرف کند.
\n
وضوح بالا ابتدا به مدل اجازه می‌دهد تصویر کم‌وضوح را ببیند و سپس قطعات جزئیات تصویر ورودی را به عنوان مربع‌های 512px ایجاد کند. هر کدام از قطعات جزئیات از بودجه توکن دو برابر استفاده می‌کنند که در مجموع 129 توکن است.`,
high: 'بالا',
low: 'پایین',
uploadMethod: 'روش بارگذاری',
both: 'هر دو',
localUpload: 'بارگذاری محلی',
url: 'URL',
uploadLimit: 'محدودیت بارگذاری',
},
},
voice: {
name: 'صدا',
defaultDisplay: 'صدا پیش فرض',
description: 'تنظیمات تبدیل متن به گفتار',
settings: 'تنظیمات',
voiceSettings: {
title: 'تنظیمات صدا',
language: 'زبان',
resolutionTooltip: 'پشتیبانی از زبان صدای تبدیل متن به گفتار.',
voice: 'صدا',
autoPlay: 'پخش خودکار',
autoPlayEnabled: 'روشن کردن',
autoPlayDisabled: 'خاموش کردن',
},
},
openingStatement: {
title: 'شروع مکالمه',
add: 'افزودن',
writeOpener: 'نوشتن آغازگر',
placeholder: 'پیام آغازگر خود را اینجا بنویسید، می‌توانید از متغیرها استفاده کنید، سعی کنید {{variable}} را تایپ کنید.',
openingQuestion: 'سوالات آغازین',
openingQuestionPlaceholder: 'می‌توانید از متغیرها استفاده کنید، سعی کنید {{variable}} را تایپ کنید.',
noDataPlaceHolder: 'شروع مکالمه با کاربر می‌تواند به AI کمک کند تا ارتباط نزدیک‌تری با آنها برقرار کند.',
varTip: 'می‌توانید از متغیرها استفاده کنید، سعی کنید {{variable}} را تایپ کنید',
tooShort: 'حداقل 20 کلمه از پرسش اولیه برای تولید نظرات آغازین مکالمه مورد نیاز است.',
notIncludeKey: 'پرسش اولیه شامل متغیر: {{key}} نمی‌شود. لطفاً آن را به پرسش اولیه اضافه کنید.',
},
modelConfig: {
model: 'مدل',
setTone: 'تنظیم لحن پاسخ‌ها',
title: 'مدل و پارامترها',
modeType: {
chat: 'چت',
completion: 'تکمیل',
},
},
inputs: {
title: 'اشکال‌زدایی و پیش‌نمایش',
noPrompt: 'سعی کنید پرسش‌هایی را در ورودی پیش‌پرسش بنویسید',
userInputField: 'فیلد ورودی کاربر',
noVar: 'مقدار متغیر را پر کنید، که به طور خودکار در کلمات پرس و جو در هر بار شروع یک جلسه جدید جایگزین می‌شود.',
chatVarTip: 'مقدار متغیر را پر کنید، که به طور خودکار در کلمات پرس و جو در هر بار شروع یک جلسه جدید جایگزین می‌شود',
completionVarTip: 'مقدار متغیر را پر کنید، که به طور خودکار در کلمات پرس و جو در هر بار ارسال سوال جایگزین می‌شود.',
previewTitle: 'پیش‌نمایش پرس و جو',
queryTitle: 'محتوای پرس و جو',
queryPlaceholder: 'لطفاً متن درخواست را وارد کنید.',
run: 'اجرا',
},
result: 'متن خروجی',
datasetConfig: {
settingTitle: 'تنظیمات بازیابی',
knowledgeTip: 'روی دکمه "+" کلیک کنید تا دانش اضافه شود',
retrieveOneWay: {
title: 'بازیابی N به 1',
description: 'بر اساس نیت کاربر و توصیفات دانش، عامل بهترین دانش را برای پرس و جو به طور خودکار انتخاب می‌کند. بهترین برای برنامه‌هایی با دانش محدود و مشخص.',
},
retrieveMultiWay: {
title: 'بازیابی چند مسیره',
description: 'بر اساس نیت کاربر، از تمام دانش پرس و جو می‌کند، متن‌های مرتبط از منابع چندگانه بازیابی می‌کند و بهترین نتایج مطابقت با پرس و جوی کاربر را پس از مرتب‌سازی مجدد انتخاب می‌کند.',
},
rerankModelRequired: 'مدل مرتب‌سازی مجدد مورد نیاز است',
params: 'پارامترها',
top_k: 'Top K',
top_kTip: 'برای فیلتر کردن تکه‌هایی که بیشترین شباهت به سوالات کاربر دارند استفاده می‌شود. سیستم همچنین به طور دینامیک مقدار Top K را بر اساس max_tokens مدل انتخاب شده تنظیم می‌کند.',
score_threshold: 'آستانه نمره',
score_thresholdTip: 'برای تنظیم آستانه شباهت برای فیلتر کردن تکه‌ها استفاده می‌شود.',
retrieveChangeTip: 'تغییر حالت شاخص و حالت بازیابی ممکن است بر برنامه‌های مرتبط با این دانش تأثیر بگذارد.',
},
debugAsSingleModel: 'اشکال‌زدایی به عنوان مدل تک',
debugAsMultipleModel: 'اشکال‌زدایی به عنوان مدل چندگانه',
duplicateModel: 'تکراری',
publishAs: 'انتشار به عنوان',
assistantType: {
name: 'نوع دستیار',
chatAssistant: {
name: 'دستیار پایه',
description: 'ساخت دستیار مبتنی بر چت با استفاده از مدل زبان بزرگ',
},
agentAssistant: {
name: 'دستیار عامل',
description: 'ساخت یک عامل هوشمند که می‌تواند ابزارها را به طور خودکار برای تکمیل وظایف انتخاب کند',
},
},
agent: {
agentMode: 'حالت عامل',
agentModeDes: 'تنظیم نوع حالت استنتاج برای عامل',
agentModeType: {
ReACT: 'ReAct',
functionCall: 'فراخوانی تابع',
},
setting: {
name: 'تنظیمات عامل',
description: 'تنظیمات دستیار عامل به شما اجازه می‌دهد حالت عامل و ویژگی‌های پیشرفته مانند پرسش‌های ساخته شده را تنظیم کنید، فقط در نوع عامل موجود است.',
maximumIterations: {
name: 'حداکثر تکرارها',
description: 'محدود کردن تعداد تکرارهایی که دستیار عامل می‌تواند اجرا کند',
},
},
buildInPrompt: 'پرسش‌های ساخته شده',
firstPrompt: 'اولین پرسش',
nextIteration: 'تکرار بعدی',
promptPlaceholder: 'پرسش خود را اینجا بنویسید',
tools: {
name: 'ابزارها',
description: 'استفاده از ابزارها می‌تواند قابلیت‌های LLM را گسترش دهد، مانند جستجو در اینترنت یا انجام محاسبات علمی',
enabled: 'فعال',
},
},
fileUpload: {
title: 'آپلود فایل',
description: 'جعبه ورودی چت امکان آپلود تصاویر، اسناد و سایر فایل‌ها را فراهم می‌کند.',
@ -536,13 +284,10 @@ const translation = {
resTitle: 'اعلان تولید شده',
overwriteTitle: 'پیکربندی موجود را لغو کنید؟',
generate: 'تولید',
noDataLine1: 'مورد استفاده خود را در سمت چپ شرح دهید،',
apply: 'درخواست',
instruction: 'دستورالعمل',
overwriteMessage: 'اعمال این اعلان پیکربندی موجود را لغو می کند.',
instructionPlaceHolder: 'دستورالعمل های واضح و مشخص بنویسید.',
tryIt: 'آن را امتحان کنید',
noDataLine2: 'پیش نمایش ارکستراسیون در اینجا نشان داده می شود.',
loading: 'هماهنگ کردن برنامه برای شما...',
description: 'Prompt Generator از مدل پیکربندی شده برای بهینه سازی درخواست ها برای کیفیت بالاتر و ساختار بهتر استفاده می کند. لطفا دستورالعمل های واضح و دقیق بنویسید.',
press: 'فشار',

View File

@ -30,6 +30,7 @@ const translation = {
vectorSpace: 'فضای وکتور',
vectorSpaceTooltip: 'فضای وکتور سیستم حافظه بلند مدت است که برای درک داده‌های شما توسط LLMها مورد نیاز است.',
documentProcessingPriority: 'اولویت پردازش مستندات',
documentProcessingPriorityTip: 'برای اولویت بالاتر پردازش اسناد، لطفاً برنامه خود را ارتقا دهید.',
documentProcessingPriorityUpgrade: 'داده‌های بیشتری را با دقت بالاتر و سرعت بیشتر پردازش کنید.',
priority: {
'standard': 'استاندارد',

View File

@ -29,6 +29,7 @@ const translation = {
vectorSpace: 'Espace Vectoriel',
vectorSpaceTooltip: 'L\'espace vectoriel est le système de mémoire à long terme nécessaire pour que les LLMs comprennent vos données.',
documentProcessingPriority: 'Priorité de Traitement de Document',
documentProcessingPriorityTip: 'Pour une priorité de traitement des documents plus élevée, veuillez mettre à niveau votre plan.',
documentProcessingPriorityUpgrade: 'Traitez plus de données avec une précision plus élevée à des vitesses plus rapides.',
priority: {
'standard': 'Standard',

View File

@ -32,6 +32,7 @@ const translation = {
vectorSpaceTooltip:
'वेक्टर स्पेस वह दीर्घकालिक स्मृति प्रणाली है जिसकी आवश्यकता LLMs को आपके डेटा को समझने के लिए होती है।',
documentProcessingPriority: 'दस्तावेज़ प्रसंस्करण प्राथमिकता',
documentProcessingPriorityTip: 'उच्च दस्तावेज़ प्रसंस्करण प्राथमिकता के लिए, कृपया अपनी योजना को अपग्रेड करें।',
documentProcessingPriorityUpgrade:
'तेजी से गति पर उच्च सटीकता के साथ अधिक डेटा संसाधित करें।',
priority: {

View File

@ -82,6 +82,7 @@ const translation = {
annualBilling: 'Penagihan Tahunan',
contractSales: 'Hubungi penjualan',
documentProcessingPriority: 'Pemrosesan Dokumen',
documentProcessingPriorityTip: 'Untuk prioritas pemrosesan dokumen yang lebih tinggi, silakan tingkatkan paket Anda.',
startForFree: 'Mulai Gratis',
documentsRequestQuotaTooltip: 'Menentukan jumlah total tindakan yang dapat dilakukan ruang kerja per menit dalam pangkalan pengetahuan, termasuk pembuatan, penghapusan, pembaruan, pengunggahan dokumen, modifikasi, pengarsipan, dan kueri basis pengetahuan himpunan data. Metrik ini digunakan untuk mengevaluasi performa permintaan basis pengetahuan. Misalnya, jika pengguna Sandbox melakukan 10 pengujian hit berturut-turut dalam satu menit, ruang kerja mereka akan dibatasi sementara untuk melakukan tindakan berikut selama menit berikutnya: pembuatan, penghapusan, pembaruan, dan unggahan atau modifikasi himpunan data.',
unlimited: 'Unlimited',

View File

@ -32,6 +32,7 @@ const translation = {
vectorSpaceTooltip:
'Lo Spazio Vettoriale è il sistema di memoria a lungo termine necessario per permettere agli LLM di comprendere i tuoi dati.',
documentProcessingPriority: 'Priorità di Elaborazione Documenti',
documentProcessingPriorityTip: 'Per una maggiore priorità nell\'elaborazione dei documenti, aggiorna il tuo piano.',
documentProcessingPriorityUpgrade:
'Elabora più dati con maggiore precisione a velocità più elevate.',
priority: {

View File

@ -74,6 +74,7 @@ const translation = {
unlimitedApiRate: '無制限の API コール',
apiRateLimitTooltip: 'API レート制限は、テキスト生成、チャットボット、ワークフロー、ドキュメント処理など、Dify API 経由のすべてのリクエストに適用されます。',
documentProcessingPriority: '文書処理',
documentProcessingPriorityTip: 'より高い文書処理優先度が必要な場合は、プランをアップグレードしてください。',
documentProcessingPriorityUpgrade: 'より高い精度と高速な速度でデータを処理します。',
priority: {
'standard': '標準',

View File

@ -30,6 +30,7 @@ const translation = {
vectorSpaceTooltip:
'벡터 공간은 LLM 이 데이터를 이해하는 데 필요한 장기 기억 시스템입니다.',
documentProcessingPriority: '문서 처리 우선순위',
documentProcessingPriorityTip: '더 높은 문서 처리 우선순위가 필요하면 플랜을 업그레이드하세요.',
documentProcessingPriorityUpgrade:
'더 높은 정확성과 빠른 속도로 데이터를 처리합니다.',
priority: {

View File

@ -31,6 +31,7 @@ const translation = {
vectorSpaceTooltip:
'Przestrzeń wektorowa jest systemem pamięci długoterminowej wymaganym dla LLM, aby zrozumieć Twoje dane.',
documentProcessingPriority: 'Priorytet przetwarzania dokumentów',
documentProcessingPriorityTip: 'Aby uzyskać wyższy priorytet przetwarzania dokumentów, zaktualizuj swój plan.',
documentProcessingPriorityUpgrade:
'Przetwarzaj więcej danych z większą dokładnością i w szybszym tempie.',
priority: {

View File

@ -28,6 +28,7 @@ const translation = {
vectorSpace: 'Espaço Vetorial',
vectorSpaceTooltip: 'O Espaço Vetorial é o sistema de memória de longo prazo necessário para que LLMs compreendam seus dados.',
documentProcessingPriority: 'Prioridade no Processamento de Documentos',
documentProcessingPriorityTip: 'Para maior prioridade no processamento de documentos, atualize seu plano.',
documentProcessingPriorityUpgrade: 'Processe mais dados com maior precisão e velocidade.',
priority: {
'standard': 'Padrão',

View File

@ -393,6 +393,7 @@ const translation = {
writeOpener: 'Scrieți deschizătorul',
placeholder: 'Scrieți aici mesajul de deschidere, puteți utiliza variabile, încercați să tastați {{variable}}.',
openingQuestion: 'Întrebări de deschidere',
openingQuestionPlaceholder: 'Puteți utiliza variabile, încercați să tastați {{variable}}.',
noDataPlaceHolder:
'Începerea conversației cu utilizatorul poate ajuta AI să stabilească o conexiune mai strânsă cu ei în aplicațiile conversaționale.',
varTip: 'Puteți utiliza variabile, încercați să tastați {{variable}}',

View File

@ -29,6 +29,7 @@ const translation = {
vectorSpace: 'Spațiu vectorial',
vectorSpaceTooltip: 'Spațiul vectorial este sistemul de memorie pe termen lung necesar pentru ca LLM-urile să înțeleagă datele dvs.',
documentProcessingPriority: 'Prioritatea procesării documentelor',
documentProcessingPriorityTip: 'Pentru o prioritate mai mare a procesării documentelor, vă rugăm să vă actualizați planul.',
documentProcessingPriorityUpgrade: 'Procesați mai multe date cu o acuratețe mai mare și la viteze mai rapide.',
priority: {
'standard': 'Standard',

View File

@ -30,6 +30,7 @@ const translation = {
vectorSpace: 'Векторное пространство',
vectorSpaceTooltip: 'Векторное пространство - это система долговременной памяти, необходимая LLM для понимания ваших данных.',
documentProcessingPriority: 'Приоритет обработки документов',
documentProcessingPriorityTip: 'Для повышения приоритета обработки документов обновите свой план.',
documentProcessingPriorityUpgrade: 'Обрабатывайте больше данных с большей точностью и на более высоких скоростях.',
priority: {
'standard': 'Стандартный',

View File

@ -30,6 +30,7 @@ const translation = {
vectorSpace: 'Prostor za vektorje',
vectorSpaceTooltip: 'Prostor za vektorje je dolgoročni pomnilniški sistem, potreben za to, da LLM-ji razumejo vaše podatke.',
documentProcessingPriority: 'Prioriteta obdelave dokumentov',
documentProcessingPriorityTip: 'Za višjo prednost obdelave dokumentov nadgradite svoj načrt.',
documentProcessingPriorityUpgrade: 'Obdelujte več podatkov z večjo natančnostjo in hitrostjo.',
priority: {
'standard': 'Standard',

View File

@ -479,87 +479,6 @@ const translation = {
loadBalancingLeastKeyWarning: 'Za omogočanje uravnoteženja obremenitev morata biti omogočena vsaj 2 ključa.',
loadBalancingInfo: 'Privzeto uravnoteženje obremenitev uporablja strategijo Round-robin. Če se sproži omejitev hitrosti, se uporabi 1-minutno obdobje ohlajanja.',
upgradeForLoadBalancing: 'Nadgradite svoj načrt, da omogočite uravnoteženje obremenitev.',
dataSource: {
notion: {
selector: {
},
},
website: {
},
},
plugin: {
serpapi: {
},
},
apiBasedExtension: {
selector: {
},
modal: {
name: {
},
apiEndpoint: {
},
apiKey: {
},
},
},
about: {
},
appMenus: {
},
environment: {
},
appModes: {
},
datasetMenus: {
},
voiceInput: {
},
modelName: {
'gpt-3.5-turbo': 'GPT-3.5-Turbo',
'gpt-3.5-turbo-16k': 'GPT-3.5-Turbo-16K',
'gpt-4': 'GPT-4',
'gpt-4-32k': 'GPT-4-32K',
'text-davinci-003': 'Text-Davinci-003',
'text-embedding-ada-002': 'Text-Embedding-Ada-002',
'whisper-1': 'Whisper-1',
'claude-instant-1': 'Claude-Instant',
'claude-2': 'Claude-2',
},
chat: {
citation: {
},
},
promptEditor: {
context: {
item: {
},
modal: {
},
},
history: {
item: {
},
modal: {
},
},
variable: {
item: {
},
outputToolDisabledItem: {
},
modal: {
},
},
query: {
item: {
},
},
},
imageUploader: {
},
tag: {
},
discoverMore: 'Odkrijte več v',
installProvider: 'Namestitev ponudnikov modelov',
emptyProviderTitle: 'Ponudnik modelov ni nastavljen',

View File

@ -30,6 +30,7 @@ const translation = {
vectorSpace: 'พื้นที่เวกเตอร์',
vectorSpaceTooltip: 'Vector Space เป็นระบบหน่วยความจําระยะยาวที่จําเป็นสําหรับ LLM ในการทําความเข้าใจข้อมูลของคุณ',
documentProcessingPriority: 'ลําดับความสําคัญในการประมวลผลเอกสาร',
documentProcessingPriorityTip: 'สำหรับความสำคัญในการประมวลผลเอกสารที่สูงขึ้น โปรดอัปเกรดแผนของคุณ',
documentProcessingPriorityUpgrade: 'ประมวลผลข้อมูลได้มากขึ้นด้วยความแม่นยําที่สูงขึ้นด้วยความเร็วที่เร็วขึ้น',
priority: {
'standard': 'มาตรฐาน',

View File

@ -348,7 +348,6 @@ const translation = {
'description': 'Değişken ayarı {{varName}}',
'fieldType': 'Alan türü',
'string': 'Kısa Metin',
'textInput': 'Kısa Metin',
'paragraph': 'Paragraf',
'select': 'Seçim',
'number': 'Numara',
@ -364,7 +363,6 @@ const translation = {
'content': 'İçerik',
'required': 'Gerekli',
'errorMsg': {
varNameRequired: 'Değişken adı gereklidir',
labelNameRequired: 'Etiket adı gereklidir',
varNameCanBeRepeat: 'Değişken adı tekrar edemez',
atLeastOneOption: 'En az bir seçenek gereklidir',

View File

@ -30,6 +30,7 @@ const translation = {
vectorSpace: 'Vektör Alanı',
vectorSpaceTooltip: 'Vektör Alanı, LLM\'lerin verilerinizi anlaması için gerekli uzun süreli hafıza sistemidir.',
documentProcessingPriority: 'Doküman İşleme Önceliği',
documentProcessingPriorityTip: 'Daha yüksek belge işleme önceliği için lütfen planınızı yükseltin.',
documentProcessingPriorityUpgrade: 'Daha fazla veriyi daha yüksek doğrulukla ve daha hızlı işleyin.',
priority: {
'standard': 'Standart',

View File

@ -596,7 +596,6 @@ const translation = {
'authorizationType': 'Yetkilendirme Türü',
'no-auth': 'Yok',
'api-key': 'API Anahtarı',
'authType': 'Yetki Türü',
'basic': 'Temel',
'bearer': 'Bearer',
'custom': 'Özel',

View File

@ -29,6 +29,7 @@ const translation = {
vectorSpace: 'Векторний простір',
vectorSpaceTooltip: 'Векторний простір це система довгострокової пам\'яті, необхідна LLM для розуміння ваших даних.',
documentProcessingPriority: 'Пріоритет обробки документів',
documentProcessingPriorityTip: 'Для вищого пріоритету обробки документів оновіть свій план.',
documentProcessingPriorityUpgrade: 'Обробляйте більше даних із вищою точністю та на більших швидкостях.',
priority: {
'standard': 'Стандартний',

View File

@ -29,6 +29,7 @@ const translation = {
vectorSpace: 'Không gian Vector',
vectorSpaceTooltip: 'Không gian Vector là hệ thống bộ nhớ dài hạn cần thiết cho LLMs để hiểu dữ liệu của bạn.',
documentProcessingPriority: 'Ưu tiên Xử lý Tài liệu',
documentProcessingPriorityTip: 'Để có mức độ ưu tiên xử lý tài liệu cao hơn, vui lòng nâng cấp gói của bạn.',
documentProcessingPriorityUpgrade: 'Xử lý nhiều dữ liệu với độ chính xác cao và tốc độ nhanh hơn.',
priority: {
'standard': 'Tiêu chuẩn',

View File

@ -75,6 +75,7 @@ const translation = {
unlimitedApiRate: 'API 请求频率无限制',
apiRateLimitTooltip: 'API 请求频率限制涵盖所有通过 Dify API 发起的调用,例如文本生成、聊天对话、工作流执行和文档处理等。',
documentProcessingPriority: '文档处理',
documentProcessingPriorityTip: '如需更高的文档处理优先级,请升级您的套餐。',
documentProcessingPriorityUpgrade: '以更快的速度、更高的精度处理更多的数据。',
priority: {
'standard': '标准',

View File

@ -29,6 +29,7 @@ const translation = {
vectorSpace: '向量空間',
vectorSpaceTooltip: '向量空間是 LLMs 理解您的資料所需的長期記憶系統。',
documentProcessingPriority: '文件處理優先順序',
documentProcessingPriorityTip: '如需更高的文件處理優先順序,請升級您的方案。',
documentProcessingPriorityUpgrade: '以更快的速度、更高的精度處理更多的資料。',
priority: {
'standard': '標準',

View File

@ -23,11 +23,13 @@
"build": "next build",
"build:docker": "next build && node scripts/optimize-standalone.js",
"start": "node ./scripts/copy-and-start.mjs",
"lint": "eslint --cache --cache-location node_modules/.cache/eslint/.eslint-cache",
"lint:fix": "eslint --cache --cache-location node_modules/.cache/eslint/.eslint-cache --fix",
"lint:quiet": "eslint --cache --cache-location node_modules/.cache/eslint/.eslint-cache --quiet",
"lint:complexity": "eslint --cache --cache-location node_modules/.cache/eslint/.eslint-cache --rule 'complexity: [error, {max: 15}]' --quiet",
"lint:oxlint": "oxlint --config .oxlintrc.json .",
"lint": "pnpm run lint:oxlint && eslint --cache --cache-location node_modules/.cache/eslint/.eslint-cache",
"lint:fix": "pnpm run lint:oxlint && eslint --cache --cache-location node_modules/.cache/eslint/.eslint-cache --fix",
"lint:quiet": "pnpm run lint:oxlint && eslint --cache --cache-location node_modules/.cache/eslint/.eslint-cache --quiet",
"lint:complexity": "pnpm run lint:oxlint && eslint --cache --cache-location node_modules/.cache/eslint/.eslint-cache --rule 'complexity: [error, {max: 15}]' --quiet",
"type-check": "tsc --noEmit",
"type-check:tsgo": "tsgo --noEmit",
"prepare": "cd ../ && node -e \"if (process.env.NODE_ENV !== 'production'){process.exit(1)} \" || husky ./web/.husky",
"gen-icons": "node ./app/components/base/icons/script.mjs",
"uglify-embed": "node ./bin/uglify-embed",
@ -53,13 +55,13 @@
"@headlessui/react": "2.2.1",
"@heroicons/react": "^2.2.0",
"@hookform/resolvers": "^3.10.0",
"@lexical/code": "^0.36.2",
"@lexical/link": "^0.36.2",
"@lexical/code": "^0.38.2",
"@lexical/link": "^0.38.2",
"@lexical/list": "^0.38.2",
"@lexical/react": "^0.36.2",
"@lexical/selection": "^0.37.0",
"@lexical/react": "^0.38.2",
"@lexical/selection": "^0.38.2",
"@lexical/text": "^0.38.2",
"@lexical/utils": "^0.37.0",
"@lexical/utils": "^0.38.2",
"@monaco-editor/react": "^4.7.0",
"@octokit/core": "^6.1.6",
"@octokit/request-error": "^6.1.8",
@ -97,7 +99,7 @@
"katex": "^0.16.25",
"ky": "^1.12.0",
"lamejs": "^1.2.1",
"lexical": "^0.36.2",
"lexical": "^0.38.2",
"line-clamp": "^1.0.0",
"lodash-es": "^4.17.21",
"mermaid": "~11.11.0",
@ -181,6 +183,7 @@
"@types/semver": "^7.7.1",
"@types/sortablejs": "^1.15.8",
"@types/uuid": "^10.0.0",
"@typescript/native-preview": "^7.0.0-dev",
"autoprefixer": "^10.4.21",
"babel-loader": "^10.0.0",
"bing-translate-api": "^4.1.0",
@ -201,6 +204,7 @@
"lodash": "^4.17.21",
"magicast": "^0.3.5",
"nock": "^14.0.10",
"oxlint": "^1.31.0",
"postcss": "^8.5.6",
"react-scan": "^0.4.3",
"sass": "^1.93.2",
@ -227,13 +231,12 @@
"eslint --fix"
],
"**/*.ts?(x)": [
"oxlint --config .oxlintrc.json",
"eslint --fix"
]
},
"pnpm": {
"overrides": {
"lexical": "0.37.0",
"@lexical/*": "0.37.0",
"@monaco-editor/loader": "1.5.0",
"@eslint/plugin-kit@<0.3.4": "0.3.4",
"brace-expansion@<2.0.2": "2.0.2",

560
web/pnpm-lock.yaml generated
View File

@ -15,8 +15,6 @@ overrides:
vite: ~6.4.1
prismjs: ~1.30
brace-expansion: ~2.0
lexical: 0.37.0
'@lexical/*': 0.37.0
'@monaco-editor/loader': 1.5.0
'@eslint/plugin-kit@<0.3.4': 0.3.4
brace-expansion@<2.0.2: 2.0.2
@ -85,26 +83,26 @@ importers:
specifier: ^3.10.0
version: 3.10.0(react-hook-form@7.67.0(react@19.2.1))
'@lexical/code':
specifier: ^0.36.2
version: 0.36.2
specifier: ^0.38.2
version: 0.38.2
'@lexical/link':
specifier: ^0.36.2
version: 0.36.2
specifier: ^0.38.2
version: 0.38.2
'@lexical/list':
specifier: ^0.38.2
version: 0.38.2
'@lexical/react':
specifier: ^0.36.2
version: 0.36.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(yjs@13.6.27)
specifier: ^0.38.2
version: 0.38.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(yjs@13.6.27)
'@lexical/selection':
specifier: ^0.37.0
version: 0.37.0
specifier: ^0.38.2
version: 0.38.2
'@lexical/text':
specifier: ^0.38.2
version: 0.38.2
'@lexical/utils':
specifier: ^0.37.0
version: 0.37.0
specifier: ^0.38.2
version: 0.38.2
'@monaco-editor/react':
specifier: ^4.7.0
version: 4.7.0(monaco-editor@0.55.1)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)
@ -217,8 +215,8 @@ importers:
specifier: ^1.2.1
version: 1.2.1
lexical:
specifier: 0.37.0
version: 0.37.0
specifier: ^0.38.2
version: 0.38.2
line-clamp:
specifier: ^1.0.0
version: 1.0.0
@ -463,6 +461,9 @@ importers:
'@types/uuid':
specifier: ^10.0.0
version: 10.0.0
'@typescript/native-preview':
specifier: ^7.0.0-dev
version: 7.0.0-dev.20251204.1
autoprefixer:
specifier: ^10.4.21
version: 10.4.22(postcss@8.5.6)
@ -523,6 +524,9 @@ importers:
nock:
specifier: ^14.0.10
version: 14.0.10
oxlint:
specifier: ^1.31.0
version: 1.31.0
postcss:
specifier: ^8.5.6
version: 8.5.6
@ -2129,122 +2133,77 @@ packages:
'@jridgewell/trace-mapping@0.3.9':
resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==}
'@lexical/clipboard@0.36.2':
resolution: {integrity: sha512-l7z52jltlMz1HmJRmG7ZdxySPjheRRxdV/75QEnzalMtqfLPgh4G5IpycISjbX+95PgEaC6rXbcjPix0CyHDJg==}
'@lexical/clipboard@0.37.0':
resolution: {integrity: sha512-hRwASFX/ilaI5r8YOcZuQgONFshRgCPfdxfofNL7uruSFYAO6LkUhsjzZwUgf0DbmCJmbBADFw15FSthgCUhGA==}
'@lexical/clipboard@0.38.2':
resolution: {integrity: sha512-dDShUplCu8/o6BB9ousr3uFZ9bltR+HtleF/Tl8FXFNPpZ4AXhbLKUoJuucRuIr+zqT7RxEv/3M6pk/HEoE6NQ==}
'@lexical/code@0.36.2':
resolution: {integrity: sha512-dfS62rNo3uKwNAJQ39zC+8gYX0k8UAoW7u+JPIqx+K2VPukZlvpsPLNGft15pdWBkHc7Pv+o9gJlB6gGv+EBfA==}
'@lexical/code@0.38.2':
resolution: {integrity: sha512-wpqgbmPsfi/+8SYP0zI2kml09fGPRhzO5litR9DIbbSGvcbawMbRNcKLO81DaTbsJRnBJiQvbBBBJAwZKRqgBw==}
'@lexical/devtools-core@0.36.2':
resolution: {integrity: sha512-G+XW7gR/SCx3YgX4FK9wAIn6AIOkC+j8zRPWrS3GQNZ15CE0QkwQl3IyQ7XW9KzWmdRMs6yTmTVnENFa1JLzXg==}
'@lexical/devtools-core@0.38.2':
resolution: {integrity: sha512-hlN0q7taHNzG47xKynQLCAFEPOL8l6IP79C2M18/FE1+htqNP35q4rWhYhsptGlKo4me4PtiME7mskvr7T4yqA==}
peerDependencies:
react: '>=17.x'
react-dom: '>=17.x'
'@lexical/dragon@0.36.2':
resolution: {integrity: sha512-VWNjYaH74uQ8MFKkl80pTofojpEnTYSX2sgHyZmo1Lk1cKLHK25pMnWgAxPAMLQD5/RW/2PtZcK+j0Kfoe5lSQ==}
'@lexical/extension@0.36.2':
resolution: {integrity: sha512-NWxtqMFMzScq4Eemqp1ST2KREIfj57fUbn7qHv+mMnYgQZK4iIhrHKo5klonxi1oBURcxUZMIbdtH7MJ4BdisA==}
'@lexical/extension@0.37.0':
resolution: {integrity: sha512-Z58f2tIdz9bn8gltUu5cVg37qROGha38dUZv20gI2GeNugXAkoPzJYEcxlI1D/26tkevJ/7VaFUr9PTk+iKmaA==}
'@lexical/dragon@0.38.2':
resolution: {integrity: sha512-riOhgo+l4oN50RnLGhcqeUokVlMZRc+NDrxRNs2lyKSUdC4vAhAmAVUHDqYPyb4K4ZSw4ebZ3j8hI2zO4O3BbA==}
'@lexical/extension@0.38.2':
resolution: {integrity: sha512-qbUNxEVjAC0kxp7hEMTzktj0/51SyJoIJWK6Gm790b4yNBq82fEPkksfuLkRg9VQUteD0RT1Nkjy8pho8nNamw==}
'@lexical/hashtag@0.36.2':
resolution: {integrity: sha512-WdmKtzXFcahQT3ShFDeHF6LCR5C8yvFCj3ImI09rZwICrYeonbMrzsBUxS1joBz0HQ+ufF9Tx+RxLvGWx6WxzQ==}
'@lexical/hashtag@0.38.2':
resolution: {integrity: sha512-jNI4Pv+plth39bjOeeQegMypkjDmoMWBMZtV0lCynBpkkPFlfMnyL9uzW/IxkZnX8LXWSw5mbWk07nqOUNTCrA==}
'@lexical/history@0.36.2':
resolution: {integrity: sha512-pnS36gyMWz1yq/3Z2jv0gUxjJfas5j0GZOM4rFTzDAHjRVc5q3Ua4ElwekdcLaPPGpUlcg3jghIGWa2pSeoPvA==}
'@lexical/html@0.36.2':
resolution: {integrity: sha512-fgqALzgKnoy93G0yFyYD4C4qJTSMZyUt4JE5kj/POFwWNOnXThIqJhQGwBvH/ibImpIfOeds2TrSr8PbStlrNg==}
'@lexical/html@0.37.0':
resolution: {integrity: sha512-oTsBc45eL8/lmF7fqGR+UCjrJYP04gumzf5nk4TczrxWL2pM4GIMLLKG1mpQI2H1MDiRLzq3T/xdI7Gh74z7Zw==}
'@lexical/history@0.38.2':
resolution: {integrity: sha512-QWPwoVDMe/oJ0+TFhy78TDi7TWU/8bcDRFUNk1nWgbq7+2m+5MMoj90LmOFwakQHnCVovgba2qj+atZrab1dsQ==}
'@lexical/html@0.38.2':
resolution: {integrity: sha512-pC5AV+07bmHistRwgG3NJzBMlIzSdxYO6rJU4eBNzyR4becdiLsI4iuv+aY7PhfSv+SCs7QJ9oc4i5caq48Pkg==}
'@lexical/link@0.36.2':
resolution: {integrity: sha512-Zb+DeHA1po8VMiOAAXsBmAHhfWmQttsUkI5oiZUmOXJruRuQ2rVr01NoxHpoEpLwHOABVNzD3PMbwov+g3c7lg==}
'@lexical/list@0.36.2':
resolution: {integrity: sha512-JpaIaE0lgNUrAR7iaCaIoETcCKG9EvZjM3G71VxiexTs7PltmEMq36LUlO2goafWurP7knG2rUpVnTcuSbYYeA==}
'@lexical/list@0.37.0':
resolution: {integrity: sha512-AOC6yAA3mfNvJKbwo+kvAbPJI+13yF2ISA65vbA578CugvJ08zIVgM+pSzxquGhD0ioJY3cXVW7+gdkCP1qu5g==}
'@lexical/link@0.38.2':
resolution: {integrity: sha512-UOKTyYqrdCR9+7GmH6ZVqJTmqYefKGMUHMGljyGks+OjOGZAQs78S1QgcPEqltDy+SSdPSYK7wAo6gjxZfEq9g==}
'@lexical/list@0.38.2':
resolution: {integrity: sha512-OQm9TzatlMrDZGxMxbozZEHzMJhKxAbH1TOnOGyFfzpfjbnFK2y8oLeVsfQZfZRmiqQS4Qc/rpFnRP2Ax5dsbA==}
'@lexical/mark@0.36.2':
resolution: {integrity: sha512-n0MNXtGH+1i43hglgHjpQV0093HmIiFR7Budg2BJb8ZNzO1KZRqeXAHlA5ZzJ698FkAnS4R5bqG9tZ0JJHgAuA==}
'@lexical/mark@0.38.2':
resolution: {integrity: sha512-U+8KGwc3cP5DxSs15HfkP2YZJDs5wMbWQAwpGqep9bKphgxUgjPViKhdi+PxIt2QEzk7WcoZWUsK1d2ty/vSmg==}
'@lexical/markdown@0.36.2':
resolution: {integrity: sha512-jI4McaVKUo8ADOYNCB5LnYyxXDyOWBOofM05r42R9QIMyUxGryo43WNPMAYXzCgtHlkQv+FNles9OlQY0IlAag==}
'@lexical/markdown@0.38.2':
resolution: {integrity: sha512-ykQJ9KUpCs1+Ak6ZhQMP6Slai4/CxfLEGg/rSHNVGbcd7OaH/ICtZN5jOmIe9ExfXMWy1o8PyMu+oAM3+AWFgA==}
'@lexical/offset@0.36.2':
resolution: {integrity: sha512-+QQNwzFW/joes3DhNINpGdEX6O5scUTs4n8pYDyM/3pWb+8oCHRaRtEmpUU9HStbdy/pK2kQ9XdztkrNvP/ilA==}
'@lexical/offset@0.38.2':
resolution: {integrity: sha512-uDky2palcY+gE6WTv6q2umm2ioTUnVqcaWlEcchP6A310rI08n6rbpmkaLSIh3mT2GJQN2QcN2x0ct5BQmKIpA==}
'@lexical/overflow@0.36.2':
resolution: {integrity: sha512-bLaEe93iZIJH5wDh6e/DTZVNz7xO7lMS5akcJW8CIwopr4I/Qv2uCvc4G1bMMHx2xM1gVxstn5rFgIUP8/Gqlg==}
'@lexical/overflow@0.38.2':
resolution: {integrity: sha512-f6vkTf+YZF0EuKvUK3goh4jrnF+Z0koiNMO+7rhSMLooc5IlD/4XXix4ZLiIktUWq4BhO84b82qtrO+6oPUxtw==}
'@lexical/plain-text@0.36.2':
resolution: {integrity: sha512-c9F/+WHl2QuXVhu+1bBVo6BIrSjCcixLe5ePKxoUpy+B7W72s3VCoAQZp+pmtPIyodDLmZAx78hZBBlzoIOeeg==}
'@lexical/plain-text@0.38.2':
resolution: {integrity: sha512-xRYNHJJFCbaQgr0uErW8Im2Phv1nWHIT4VSoAlBYqLuVGZBD4p61dqheBwqXWlGGJFk+MY5C5URLiMicgpol7A==}
'@lexical/react@0.36.2':
resolution: {integrity: sha512-mPVm1BmeuMsMpVyUplgc0btOI8+Vm9bZj4AftgfMSkvzkr8i6NkLn8LV5IlEnoRvxXkjOExwlwBwdQte5ZGvNw==}
'@lexical/react@0.38.2':
resolution: {integrity: sha512-M3z3MkWyw3Msg4Hojr5TnO4TzL71NVPVNGoavESjdgJbTdv1ezcQqjE4feq+qs7H9jytZeuK8wsEOJfSPmNd8w==}
peerDependencies:
react: '>=17.x'
react-dom: '>=17.x'
'@lexical/rich-text@0.36.2':
resolution: {integrity: sha512-dZ7zAIv5NBrh1ApxIT9bayn96zfQHHdnT+oaqmR+q100Vo2uROeR/ZF5igeAuwYGM1Z3ZWDBvNxRKd1d6FWiZw==}
'@lexical/selection@0.36.2':
resolution: {integrity: sha512-n96joW3HCKBmPeESR172BxVE+m8V9SdidQm4kKb9jOZ1Ota+tnam2386TeI6795TWwgjDQJPK3HZNKcX6Gb+Bg==}
'@lexical/selection@0.37.0':
resolution: {integrity: sha512-Lix1s2r71jHfsTEs4q/YqK2s3uXKOnyA3fd1VDMWysO+bZzRwEO5+qyDvENZ0WrXSDCnlibNFV1HttWX9/zqyw==}
'@lexical/rich-text@0.38.2':
resolution: {integrity: sha512-eFjeOT7YnDZYpty7Zlwlct0UxUSaYu53uLYG+Prs3NoKzsfEK7e7nYsy/BbQFfk5HoM1pYuYxFR2iIX62+YHGw==}
'@lexical/selection@0.38.2':
resolution: {integrity: sha512-eMFiWlBH6bEX9U9sMJ6PXPxVXTrihQfFeiIlWLuTpEIDF2HRz7Uo1KFRC/yN6q0DQaj7d9NZYA6Mei5DoQuz5w==}
'@lexical/table@0.36.2':
resolution: {integrity: sha512-96rNNPiVbC65i+Jn1QzIsehCS7UVUc69ovrh9Bt4+pXDebZSdZai153Q7RUq8q3AQ5ocK4/SA2kLQfMu0grj3Q==}
'@lexical/table@0.37.0':
resolution: {integrity: sha512-g7S8ml8kIujEDLWlzYKETgPCQ2U9oeWqdytRuHjHGi/rjAAGHSej5IRqTPIMxNP3VVQHnBoQ+Y9hBtjiuddhgQ==}
'@lexical/table@0.38.2':
resolution: {integrity: sha512-uu0i7yz0nbClmHOO5ZFsinRJE6vQnFz2YPblYHAlNigiBedhqMwSv5bedrzDq8nTTHwych3mC63tcyKIrM+I1g==}
'@lexical/text@0.36.2':
resolution: {integrity: sha512-IbbqgRdMAD6Uk9b2+qSVoy+8RVcczrz6OgXvg39+EYD+XEC7Rbw7kDTWzuNSJJpP7vxSO8YDZSaIlP5gNH3qKA==}
'@lexical/text@0.38.2':
resolution: {integrity: sha512-+juZxUugtC4T37aE3P0l4I9tsWbogDUnTI/mgYk4Ht9g+gLJnhQkzSA8chIyfTxbj5i0A8yWrUUSw+/xA7lKUQ==}
'@lexical/utils@0.36.2':
resolution: {integrity: sha512-P9+t2Ob10YNGYT/PWEER+1EqH8SAjCNRn+7SBvKbr0IdleGF2JvzbJwAWaRwZs1c18P11XdQZ779dGvWlfwBIw==}
'@lexical/utils@0.37.0':
resolution: {integrity: sha512-CFp4diY/kR5RqhzQSl/7SwsMod1sgLpI1FBifcOuJ6L/S6YywGpEB4B7aV5zqW21A/jU2T+2NZtxSUn6S+9gMg==}
'@lexical/utils@0.38.2':
resolution: {integrity: sha512-y+3rw15r4oAWIEXicUdNjfk8018dbKl7dWHqGHVEtqzAYefnEYdfD2FJ5KOTXfeoYfxi8yOW7FvzS4NZDi8Bfw==}
'@lexical/yjs@0.36.2':
resolution: {integrity: sha512-gZ66Mw+uKXTO8KeX/hNKAinXbFg3gnNYraG76lBXCwb/Ka3q34upIY9FUeGOwGVaau3iIDQhE49I+6MugAX2FQ==}
'@lexical/yjs@0.38.2':
resolution: {integrity: sha512-fg6ZHNrVQmy1AAxaTs8HrFbeNTJCaCoEDPi6pqypHQU3QVfqr4nq0L0EcHU/TRlR1CeduEPvZZIjUUxWTZ0u8g==}
peerDependencies:
yjs: '>=13.5.22'
@ -2573,6 +2532,46 @@ packages:
cpu: [x64]
os: [win32]
'@oxlint/darwin-arm64@1.31.0':
resolution: {integrity: sha512-HqoYNH5WFZRdqGUROTFGOdBcA9y/YdHNoR/ujlyVO53it+q96dujbgKEvlff/WEuo4LbDKBrKLWKTKvOd/VYdg==}
cpu: [arm64]
os: [darwin]
'@oxlint/darwin-x64@1.31.0':
resolution: {integrity: sha512-gNq+JQXBCkYKQhmJEgSNjuPqmdL8yBEX3v0sueLH3g5ym4OIrNO7ml1M7xzCs0zhINQCR9MsjMJMyBNaF1ed+g==}
cpu: [x64]
os: [darwin]
'@oxlint/linux-arm64-gnu@1.31.0':
resolution: {integrity: sha512-cRmttpr3yHPwbrvtPNlv+0Zw2Oeh0cU902iMI4fFW9ylbW/vUAcz6DvzGMCYZbII8VDiwQ453SV5AA8xBgMbmw==}
cpu: [arm64]
os: [linux]
'@oxlint/linux-arm64-musl@1.31.0':
resolution: {integrity: sha512-0p7vn0hdMdNPIUzemw8f1zZ2rRZ/963EkK3o4P0KUXOPgleo+J9ZIPH7gcHSHtyrNaBifN03wET1rH4SuWQYnA==}
cpu: [arm64]
os: [linux]
'@oxlint/linux-x64-gnu@1.31.0':
resolution: {integrity: sha512-vNIbpSwQ4dwN0CUmojG7Y91O3CXOf0Kno7DSTshk/JJR4+u8HNVuYVjX2qBRk0OMc4wscJbEd7wJCl0VJOoCOw==}
cpu: [x64]
os: [linux]
'@oxlint/linux-x64-musl@1.31.0':
resolution: {integrity: sha512-4avnH09FJRTOT2cULdDPG0s14C+Ku4cnbNye6XO7rsiX6Bprz+aQblLA+1WLOr7UfC/0zF+jnZ9K5VyBBJy9Kw==}
cpu: [x64]
os: [linux]
'@oxlint/win32-arm64@1.31.0':
resolution: {integrity: sha512-mQaD5H93OUpxiGjC518t5wLQikf0Ur5mQEKO2VoTlkp01gqmrQ+hyCLOzABlsAIAeDJD58S9JwNOw4KFFnrqdw==}
cpu: [arm64]
os: [win32]
'@oxlint/win32-x64@1.31.0':
resolution: {integrity: sha512-AS/h58HfloccRlVs7P3zbyZfxNS62JuE8/3fYGjkiRlR1ZoDxdqmz5QgLEn+YxxFUTMmclGAPMFHg9z2Pk315A==}
cpu: [x64]
os: [win32]
'@parcel/watcher-android-arm64@2.5.1':
resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==}
engines: {node: '>= 10.0.0'}
@ -3653,6 +3652,45 @@ packages:
resolution: {integrity: sha512-BmxxndzEWhE4TIEEMBs8lP3MBWN3jFPs/p6gPm/wkv02o41hI6cq9AuSmGAaTTHPtA1FTi2jBre4A9rm5ZmX+Q==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@typescript/native-preview-darwin-arm64@7.0.0-dev.20251204.1':
resolution: {integrity: sha512-CgIzuO/LFRufdVjJmll6x7jnejYqqLo4kJwrsUxQipJ/dcGeP0q2XMcxNBzT7F9L4Sd5dphRPOZFXES4kS0lig==}
cpu: [arm64]
os: [darwin]
'@typescript/native-preview-darwin-x64@7.0.0-dev.20251204.1':
resolution: {integrity: sha512-X76oQeDMQHJiukkPPbk7STrfu97pfPe5ixwiN6nXzSGXLE+tzrXRecNkYhz4XWeAW2ASNmGwDJJ2RAU5l8MbgQ==}
cpu: [x64]
os: [darwin]
'@typescript/native-preview-linux-arm64@7.0.0-dev.20251204.1':
resolution: {integrity: sha512-+1as+h6ZNpc9TqlHwvDkBP7jg0FoCMUf6Rrc9/Mkllau6etznfVsWMADWT4t76gkGZKUIXOZqsl2Ya3uaBrCBQ==}
cpu: [arm64]
os: [linux]
'@typescript/native-preview-linux-arm@7.0.0-dev.20251204.1':
resolution: {integrity: sha512-3zl/Jj5rzkK9Oo5KVSIW+6bzRligoI+ZnA1xLpg0BBH2sk27a8Vasj7ZaGPlFvlSegvcaJdIjSt7Z8nBtiF9Ww==}
cpu: [arm]
os: [linux]
'@typescript/native-preview-linux-x64@7.0.0-dev.20251204.1':
resolution: {integrity: sha512-YD//l6yv7iPNlKn9OZDzBxrI+QGLN6d4RV3dSucsyq/YNZUulcywGztbZiaQxdUzKPwj70G+LVb9WCgf5ITOIQ==}
cpu: [x64]
os: [linux]
'@typescript/native-preview-win32-arm64@7.0.0-dev.20251204.1':
resolution: {integrity: sha512-eDXYR5qfPFA8EfQ0d9SbWGLn02VbAaeTM9jQ5VeLlPLcBP81nGRaGQ9Quta5zeEHev1S9iCdyRj5BqCRtl0ohw==}
cpu: [arm64]
os: [win32]
'@typescript/native-preview-win32-x64@7.0.0-dev.20251204.1':
resolution: {integrity: sha512-CRWI2OPdqXbzOU52R2abWMb3Ie2Wp6VPrCFzR3pzP53JabTAe8+XoBWlont9bw/NsqbPKp2aQbdfbLQX5RI44g==}
cpu: [x64]
os: [win32]
'@typescript/native-preview@7.0.0-dev.20251204.1':
resolution: {integrity: sha512-nyMp0ybgJVZFtDOWmcKDqaRqtj8dOg65+fDxbjIrnZuMWIqlOUGH+imFwofqlW+KndAA7KtAio2YSZMMZB25WA==}
hasBin: true
'@ungap/structured-clone@1.3.0':
resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==}
@ -6275,8 +6313,8 @@ packages:
resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
engines: {node: '>= 0.8.0'}
lexical@0.37.0:
resolution: {integrity: sha512-r5VJR2TioQPAsZATfktnJFrGIiy6gjQN8b/+0a2u1d7/QTH7lhbB7byhGSvcq1iaa1TV/xcf/pFV55a5V5hTDQ==}
lexical@0.38.2:
resolution: {integrity: sha512-JJmfsG3c4gwBHzUGffbV7ifMNkKAWMCnYE3xJl87gty7hjyV5f3xq7eqTjP5HFYvO4XpjJvvWO2/djHp5S10tw==}
lib0@0.2.114:
resolution: {integrity: sha512-gcxmNFzA4hv8UYi8j43uPlQ7CGcyMJ2KQb5kZASw6SnAKAf10hK12i2fjrS3Cl/ugZa5Ui6WwIu1/6MIXiHttQ==}
@ -6876,6 +6914,16 @@ packages:
oxc-resolver@11.14.2:
resolution: {integrity: sha512-M5fERQKcrCngMZNnk1gRaBbYcqpqXLgMcoqAo7Wpty+KH0I18i03oiy2peUsGJwFaKAEbmo+CtAyhXh08RZ1RA==}
oxlint@1.31.0:
resolution: {integrity: sha512-U+Z3VShi1zuLF2Hz/pm4vWJUBm5sDHjwSzj340tz4tS2yXg9H5PTipsZv+Yu/alg6Z7EM2cZPKGNBZAvmdfkQg==}
engines: {node: ^20.19.0 || >=22.12.0}
hasBin: true
peerDependencies:
oxlint-tsgolint: '>=0.8.1'
peerDependenciesMeta:
oxlint-tsgolint:
optional: true
p-cancelable@2.1.1:
resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==}
engines: {node: '>=8'}
@ -8322,8 +8370,8 @@ packages:
resolution: {integrity: sha512-5zknd7Dss75pMSED270A1RQS3KloqRJA9XbXLe0eCxyw7xXFb3rd+9B0UQ/0E+LQT6lnrLviEolYORlRWamn4w==}
engines: {node: '>=16'}
type-fest@5.3.0:
resolution: {integrity: sha512-d9CwU93nN0IA1QL+GSNDdwLAu1Ew5ZjTwupvedwg3WdfoH6pIDvYQ2hV0Uc2nKBLPq7NB5apCx57MLS5qlmO5g==}
type-fest@5.3.1:
resolution: {integrity: sha512-VCn+LMHbd4t6sF3wfU/+HKT63C9OoyrSIf4b+vtWHpt2U7/4InZG467YDNMFMR70DdHjAdpPWmw2lzRdg0Xqqg==}
engines: {node: '>=20'}
typescript@5.9.3:
@ -10744,259 +10792,165 @@ snapshots:
'@jridgewell/resolve-uri': 3.1.2
'@jridgewell/sourcemap-codec': 1.5.5
'@lexical/clipboard@0.36.2':
dependencies:
'@lexical/html': 0.36.2
'@lexical/list': 0.36.2
'@lexical/selection': 0.36.2
'@lexical/utils': 0.36.2
lexical: 0.37.0
'@lexical/clipboard@0.37.0':
dependencies:
'@lexical/html': 0.37.0
'@lexical/list': 0.37.0
'@lexical/selection': 0.37.0
'@lexical/utils': 0.37.0
lexical: 0.37.0
'@lexical/clipboard@0.38.2':
dependencies:
'@lexical/html': 0.38.2
'@lexical/list': 0.38.2
'@lexical/selection': 0.38.2
'@lexical/utils': 0.38.2
lexical: 0.37.0
lexical: 0.38.2
'@lexical/code@0.36.2':
'@lexical/code@0.38.2':
dependencies:
'@lexical/utils': 0.36.2
lexical: 0.37.0
'@lexical/utils': 0.38.2
lexical: 0.38.2
prismjs: 1.30.0
'@lexical/devtools-core@0.36.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1)':
'@lexical/devtools-core@0.38.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1)':
dependencies:
'@lexical/html': 0.36.2
'@lexical/link': 0.36.2
'@lexical/mark': 0.36.2
'@lexical/table': 0.36.2
'@lexical/utils': 0.36.2
lexical: 0.37.0
'@lexical/html': 0.38.2
'@lexical/link': 0.38.2
'@lexical/mark': 0.38.2
'@lexical/table': 0.38.2
'@lexical/utils': 0.38.2
lexical: 0.38.2
react: 19.2.1
react-dom: 19.2.1(react@19.2.1)
'@lexical/dragon@0.36.2':
'@lexical/dragon@0.38.2':
dependencies:
'@lexical/extension': 0.36.2
lexical: 0.37.0
'@lexical/extension@0.36.2':
dependencies:
'@lexical/utils': 0.36.2
'@preact/signals-core': 1.12.1
lexical: 0.37.0
'@lexical/extension@0.37.0':
dependencies:
'@lexical/utils': 0.37.0
'@preact/signals-core': 1.12.1
lexical: 0.37.0
'@lexical/extension': 0.38.2
lexical: 0.38.2
'@lexical/extension@0.38.2':
dependencies:
'@lexical/utils': 0.38.2
'@preact/signals-core': 1.12.1
lexical: 0.37.0
lexical: 0.38.2
'@lexical/hashtag@0.36.2':
'@lexical/hashtag@0.38.2':
dependencies:
'@lexical/text': 0.36.2
'@lexical/utils': 0.36.2
lexical: 0.37.0
'@lexical/text': 0.38.2
'@lexical/utils': 0.38.2
lexical: 0.38.2
'@lexical/history@0.36.2':
'@lexical/history@0.38.2':
dependencies:
'@lexical/extension': 0.36.2
'@lexical/utils': 0.36.2
lexical: 0.37.0
'@lexical/html@0.36.2':
dependencies:
'@lexical/selection': 0.36.2
'@lexical/utils': 0.36.2
lexical: 0.37.0
'@lexical/html@0.37.0':
dependencies:
'@lexical/selection': 0.37.0
'@lexical/utils': 0.37.0
lexical: 0.37.0
'@lexical/extension': 0.38.2
'@lexical/utils': 0.38.2
lexical: 0.38.2
'@lexical/html@0.38.2':
dependencies:
'@lexical/selection': 0.38.2
'@lexical/utils': 0.38.2
lexical: 0.37.0
lexical: 0.38.2
'@lexical/link@0.36.2':
'@lexical/link@0.38.2':
dependencies:
'@lexical/extension': 0.36.2
'@lexical/utils': 0.36.2
lexical: 0.37.0
'@lexical/list@0.36.2':
dependencies:
'@lexical/extension': 0.36.2
'@lexical/selection': 0.36.2
'@lexical/utils': 0.36.2
lexical: 0.37.0
'@lexical/list@0.37.0':
dependencies:
'@lexical/extension': 0.37.0
'@lexical/selection': 0.37.0
'@lexical/utils': 0.37.0
lexical: 0.37.0
'@lexical/extension': 0.38.2
'@lexical/utils': 0.38.2
lexical: 0.38.2
'@lexical/list@0.38.2':
dependencies:
'@lexical/extension': 0.38.2
'@lexical/selection': 0.38.2
'@lexical/utils': 0.38.2
lexical: 0.37.0
lexical: 0.38.2
'@lexical/mark@0.36.2':
'@lexical/mark@0.38.2':
dependencies:
'@lexical/utils': 0.36.2
lexical: 0.37.0
'@lexical/utils': 0.38.2
lexical: 0.38.2
'@lexical/markdown@0.36.2':
'@lexical/markdown@0.38.2':
dependencies:
'@lexical/code': 0.36.2
'@lexical/link': 0.36.2
'@lexical/list': 0.36.2
'@lexical/rich-text': 0.36.2
'@lexical/text': 0.36.2
'@lexical/utils': 0.36.2
lexical: 0.37.0
'@lexical/code': 0.38.2
'@lexical/link': 0.38.2
'@lexical/list': 0.38.2
'@lexical/rich-text': 0.38.2
'@lexical/text': 0.38.2
'@lexical/utils': 0.38.2
lexical: 0.38.2
'@lexical/offset@0.36.2':
'@lexical/offset@0.38.2':
dependencies:
lexical: 0.37.0
lexical: 0.38.2
'@lexical/overflow@0.36.2':
'@lexical/overflow@0.38.2':
dependencies:
lexical: 0.37.0
lexical: 0.38.2
'@lexical/plain-text@0.36.2':
'@lexical/plain-text@0.38.2':
dependencies:
'@lexical/clipboard': 0.36.2
'@lexical/dragon': 0.36.2
'@lexical/selection': 0.36.2
'@lexical/utils': 0.36.2
lexical: 0.37.0
'@lexical/clipboard': 0.38.2
'@lexical/dragon': 0.38.2
'@lexical/selection': 0.38.2
'@lexical/utils': 0.38.2
lexical: 0.38.2
'@lexical/react@0.36.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(yjs@13.6.27)':
'@lexical/react@0.38.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(yjs@13.6.27)':
dependencies:
'@floating-ui/react': 0.27.16(react-dom@19.2.1(react@19.2.1))(react@19.2.1)
'@lexical/devtools-core': 0.36.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1)
'@lexical/dragon': 0.36.2
'@lexical/extension': 0.36.2
'@lexical/hashtag': 0.36.2
'@lexical/history': 0.36.2
'@lexical/link': 0.36.2
'@lexical/list': 0.36.2
'@lexical/mark': 0.36.2
'@lexical/markdown': 0.36.2
'@lexical/overflow': 0.36.2
'@lexical/plain-text': 0.36.2
'@lexical/rich-text': 0.36.2
'@lexical/table': 0.36.2
'@lexical/text': 0.36.2
'@lexical/utils': 0.36.2
'@lexical/yjs': 0.36.2(yjs@13.6.27)
lexical: 0.37.0
'@lexical/devtools-core': 0.38.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1)
'@lexical/dragon': 0.38.2
'@lexical/extension': 0.38.2
'@lexical/hashtag': 0.38.2
'@lexical/history': 0.38.2
'@lexical/link': 0.38.2
'@lexical/list': 0.38.2
'@lexical/mark': 0.38.2
'@lexical/markdown': 0.38.2
'@lexical/overflow': 0.38.2
'@lexical/plain-text': 0.38.2
'@lexical/rich-text': 0.38.2
'@lexical/table': 0.38.2
'@lexical/text': 0.38.2
'@lexical/utils': 0.38.2
'@lexical/yjs': 0.38.2(yjs@13.6.27)
lexical: 0.38.2
react: 19.2.1
react-dom: 19.2.1(react@19.2.1)
react-error-boundary: 6.0.0(react@19.2.1)
transitivePeerDependencies:
- yjs
'@lexical/rich-text@0.36.2':
'@lexical/rich-text@0.38.2':
dependencies:
'@lexical/clipboard': 0.36.2
'@lexical/dragon': 0.36.2
'@lexical/selection': 0.36.2
'@lexical/utils': 0.36.2
lexical: 0.37.0
'@lexical/selection@0.36.2':
dependencies:
lexical: 0.37.0
'@lexical/selection@0.37.0':
dependencies:
lexical: 0.37.0
'@lexical/clipboard': 0.38.2
'@lexical/dragon': 0.38.2
'@lexical/selection': 0.38.2
'@lexical/utils': 0.38.2
lexical: 0.38.2
'@lexical/selection@0.38.2':
dependencies:
lexical: 0.37.0
'@lexical/table@0.36.2':
dependencies:
'@lexical/clipboard': 0.36.2
'@lexical/extension': 0.36.2
'@lexical/utils': 0.36.2
lexical: 0.37.0
'@lexical/table@0.37.0':
dependencies:
'@lexical/clipboard': 0.37.0
'@lexical/extension': 0.37.0
'@lexical/utils': 0.37.0
lexical: 0.37.0
lexical: 0.38.2
'@lexical/table@0.38.2':
dependencies:
'@lexical/clipboard': 0.38.2
'@lexical/extension': 0.38.2
'@lexical/utils': 0.38.2
lexical: 0.37.0
'@lexical/text@0.36.2':
dependencies:
lexical: 0.37.0
lexical: 0.38.2
'@lexical/text@0.38.2':
dependencies:
lexical: 0.37.0
'@lexical/utils@0.36.2':
dependencies:
'@lexical/list': 0.36.2
'@lexical/selection': 0.36.2
'@lexical/table': 0.36.2
lexical: 0.37.0
'@lexical/utils@0.37.0':
dependencies:
'@lexical/list': 0.37.0
'@lexical/selection': 0.37.0
'@lexical/table': 0.37.0
lexical: 0.37.0
lexical: 0.38.2
'@lexical/utils@0.38.2':
dependencies:
'@lexical/list': 0.38.2
'@lexical/selection': 0.38.2
'@lexical/table': 0.38.2
lexical: 0.37.0
lexical: 0.38.2
'@lexical/yjs@0.36.2(yjs@13.6.27)':
'@lexical/yjs@0.38.2(yjs@13.6.27)':
dependencies:
'@lexical/offset': 0.36.2
'@lexical/selection': 0.36.2
lexical: 0.37.0
'@lexical/offset': 0.38.2
'@lexical/selection': 0.38.2
lexical: 0.38.2
yjs: 13.6.27
'@mdx-js/loader@3.1.1(webpack@5.103.0(esbuild@0.25.0)(uglify-js@3.19.3))':
@ -11305,6 +11259,30 @@ snapshots:
'@oxc-resolver/binding-win32-x64-msvc@11.14.2':
optional: true
'@oxlint/darwin-arm64@1.31.0':
optional: true
'@oxlint/darwin-x64@1.31.0':
optional: true
'@oxlint/linux-arm64-gnu@1.31.0':
optional: true
'@oxlint/linux-arm64-musl@1.31.0':
optional: true
'@oxlint/linux-x64-gnu@1.31.0':
optional: true
'@oxlint/linux-x64-musl@1.31.0':
optional: true
'@oxlint/win32-arm64@1.31.0':
optional: true
'@oxlint/win32-x64@1.31.0':
optional: true
'@parcel/watcher-android-arm64@2.5.1':
optional: true
@ -12527,6 +12505,37 @@ snapshots:
'@typescript-eslint/types': 8.48.1
eslint-visitor-keys: 4.2.1
'@typescript/native-preview-darwin-arm64@7.0.0-dev.20251204.1':
optional: true
'@typescript/native-preview-darwin-x64@7.0.0-dev.20251204.1':
optional: true
'@typescript/native-preview-linux-arm64@7.0.0-dev.20251204.1':
optional: true
'@typescript/native-preview-linux-arm@7.0.0-dev.20251204.1':
optional: true
'@typescript/native-preview-linux-x64@7.0.0-dev.20251204.1':
optional: true
'@typescript/native-preview-win32-arm64@7.0.0-dev.20251204.1':
optional: true
'@typescript/native-preview-win32-x64@7.0.0-dev.20251204.1':
optional: true
'@typescript/native-preview@7.0.0-dev.20251204.1':
optionalDependencies:
'@typescript/native-preview-darwin-arm64': 7.0.0-dev.20251204.1
'@typescript/native-preview-darwin-x64': 7.0.0-dev.20251204.1
'@typescript/native-preview-linux-arm': 7.0.0-dev.20251204.1
'@typescript/native-preview-linux-arm64': 7.0.0-dev.20251204.1
'@typescript/native-preview-linux-x64': 7.0.0-dev.20251204.1
'@typescript/native-preview-win32-arm64': 7.0.0-dev.20251204.1
'@typescript/native-preview-win32-x64': 7.0.0-dev.20251204.1
'@ungap/structured-clone@1.3.0': {}
'@vitest/eslint-plugin@1.5.1(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3)':
@ -15656,7 +15665,7 @@ snapshots:
prelude-ls: 1.2.1
type-check: 0.4.0
lexical@0.37.0: {}
lexical@0.38.2: {}
lib0@0.2.114:
dependencies:
@ -16404,7 +16413,7 @@ snapshots:
statuses: 2.0.2
strict-event-emitter: 0.5.1
tough-cookie: 6.0.0
type-fest: 5.3.0
type-fest: 5.3.1
until-async: 3.0.2
yargs: 17.7.2
optionalDependencies:
@ -16626,6 +16635,17 @@ snapshots:
'@oxc-resolver/binding-win32-ia32-msvc': 11.14.2
'@oxc-resolver/binding-win32-x64-msvc': 11.14.2
oxlint@1.31.0:
optionalDependencies:
'@oxlint/darwin-arm64': 1.31.0
'@oxlint/darwin-x64': 1.31.0
'@oxlint/linux-arm64-gnu': 1.31.0
'@oxlint/linux-arm64-musl': 1.31.0
'@oxlint/linux-x64-gnu': 1.31.0
'@oxlint/linux-x64-musl': 1.31.0
'@oxlint/win32-arm64': 1.31.0
'@oxlint/win32-x64': 1.31.0
p-cancelable@2.1.1: {}
p-limit@2.3.0:
@ -18214,7 +18234,7 @@ snapshots:
type-fest@4.2.0: {}
type-fest@5.3.0:
type-fest@5.3.1:
dependencies:
tagged-tag: 1.0.0
optional: true

View File

@ -144,7 +144,7 @@ function requiredWebSSOLogin(message?: string, code?: number) {
params.append('message', message)
if (code)
params.append('code', String(code))
globalThis.location.href = `${globalThis.location.origin}${basePath}/${WBB_APP_LOGIN_PATH}?${params.toString()}`
globalThis.location.href = `${globalThis.location.origin}${basePath}${WBB_APP_LOGIN_PATH}?${params.toString()}`
}
export function format(text: string) {