Co-authored-by: GuanMu <ballmanjq@gmail.com> Co-authored-by: zhujiruo <zhujiruo@foxmail.com> Co-authored-by: Matri Qi <matrixdom@126.com> Co-authored-by: croatialu <wuli.croatia@foxmail.com> Co-authored-by: HyaCinth <88471803+HyaCiovo@users.noreply.github.com> Co-authored-by: lyzno1 <92089059+lyzno1@users.noreply.github.com>tags/1.7.2
| import { EventEmitterContextProvider } from '@/context/event-emitter' | import { EventEmitterContextProvider } from '@/context/event-emitter' | ||||
| import { ProviderContextProvider } from '@/context/provider-context' | import { ProviderContextProvider } from '@/context/provider-context' | ||||
| import { ModalContextProvider } from '@/context/modal-context' | import { ModalContextProvider } from '@/context/modal-context' | ||||
| import GotoAnything from '@/app/components/goto-anything' | |||||
| const Layout = ({ children }: { children: ReactNode }) => { | const Layout = ({ children }: { children: ReactNode }) => { | ||||
| return ( | return ( | ||||
| <Header /> | <Header /> | ||||
| </HeaderWrapper> | </HeaderWrapper> | ||||
| {children} | {children} | ||||
| <GotoAnything /> | |||||
| </ModalContextProvider> | </ModalContextProvider> | ||||
| </ProviderContextProvider> | </ProviderContextProvider> | ||||
| </EventEmitterContextProvider> | </EventEmitterContextProvider> |
| unit?: string | unit?: string | ||||
| } & Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'> & VariantProps<typeof inputVariants> | } & Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'> & VariantProps<typeof inputVariants> | ||||
| const Input = ({ | |||||
| const Input = React.forwardRef<HTMLInputElement, InputProps>(({ | |||||
| size, | size, | ||||
| disabled, | disabled, | ||||
| destructive, | destructive, | ||||
| onChange = noop, | onChange = noop, | ||||
| unit, | unit, | ||||
| ...props | ...props | ||||
| }: InputProps) => { | |||||
| }, ref) => { | |||||
| const { t } = useTranslation() | const { t } = useTranslation() | ||||
| return ( | return ( | ||||
| <div className={cn('relative w-full', wrapperClassName)}> | <div className={cn('relative w-full', wrapperClassName)}> | ||||
| {showLeftIcon && <RiSearchLine className={cn('absolute left-2 top-1/2 h-4 w-4 -translate-y-1/2 text-components-input-text-placeholder')} />} | {showLeftIcon && <RiSearchLine className={cn('absolute left-2 top-1/2 h-4 w-4 -translate-y-1/2 text-components-input-text-placeholder')} />} | ||||
| <input | <input | ||||
| ref={ref} | |||||
| style={styleCss} | style={styleCss} | ||||
| className={cn( | className={cn( | ||||
| 'w-full appearance-none border border-transparent bg-components-input-bg-normal py-[7px] text-components-input-text-filled caret-primary-600 outline-none placeholder:text-components-input-text-placeholder hover:border-components-input-border-hover hover:bg-components-input-bg-hover focus:border-components-input-border-active focus:bg-components-input-bg-active focus:shadow-xs', | 'w-full appearance-none border border-transparent bg-components-input-bg-normal py-[7px] text-components-input-text-filled caret-primary-600 outline-none placeholder:text-components-input-text-placeholder hover:border-components-input-border-hover hover:bg-components-input-bg-hover focus:border-components-input-border-active focus:bg-components-input-bg-active focus:shadow-xs', | ||||
| } | } | ||||
| </div> | </div> | ||||
| ) | ) | ||||
| } | |||||
| }) | |||||
| Input.displayName = 'Input' | |||||
| export default Input | export default Input |
| import type { ActionItem, AppSearchResult } from './types' | |||||
| import type { App } from '@/types/app' | |||||
| import { fetchAppList } from '@/service/apps' | |||||
| import AppIcon from '../../base/app-icon' | |||||
| import { AppTypeIcon } from '../../app/type-selector' | |||||
| import { getRedirectionPath } from '@/utils/app-redirection' | |||||
| const parser = (apps: App[]): AppSearchResult[] => { | |||||
| return apps.map(app => ({ | |||||
| id: app.id, | |||||
| title: app.name, | |||||
| description: app.description, | |||||
| type: 'app' as const, | |||||
| path: getRedirectionPath(true, { | |||||
| id: app.id, | |||||
| mode: app.mode, | |||||
| }), | |||||
| icon: ( | |||||
| <div className='relative shrink-0'> | |||||
| <AppIcon | |||||
| size='large' | |||||
| iconType={app.icon_type} | |||||
| icon={app.icon} | |||||
| background={app.icon_background} | |||||
| imageUrl={app.icon_url} | |||||
| /> | |||||
| <AppTypeIcon wrapperClassName='absolute -bottom-0.5 -right-0.5 w-4 h-4 rounded-[4px] border border-divider-regular outline outline-components-panel-on-panel-item-bg' | |||||
| className='h-3 w-3' type={app.mode} /> | |||||
| </div> | |||||
| ), | |||||
| data: app, | |||||
| })) | |||||
| } | |||||
| export const appAction: ActionItem = { | |||||
| key: '@app', | |||||
| shortcut: '@app', | |||||
| title: 'Search Applications', | |||||
| description: 'Search and navigate to your applications', | |||||
| // action, | |||||
| search: async (_, searchTerm = '', locale) => { | |||||
| const response = (await fetchAppList({ | |||||
| url: 'apps', | |||||
| params: { | |||||
| page: 1, | |||||
| name: searchTerm, | |||||
| }, | |||||
| })) | |||||
| const apps = response.data || [] | |||||
| return parser(apps) | |||||
| }, | |||||
| } |
| import { appAction } from './app' | |||||
| import { knowledgeAction } from './knowledge' | |||||
| import { pluginAction } from './plugin' | |||||
| import { workflowNodesAction } from './workflow-nodes' | |||||
| import type { ActionItem, SearchResult } from './types' | |||||
| export const Actions = { | |||||
| app: appAction, | |||||
| knowledge: knowledgeAction, | |||||
| plugin: pluginAction, | |||||
| node: workflowNodesAction, | |||||
| } | |||||
| export const searchAnything = async ( | |||||
| locale: string, | |||||
| query: string, | |||||
| actionItem?: ActionItem, | |||||
| ): Promise<SearchResult[]> => { | |||||
| if (actionItem) { | |||||
| const searchTerm = query.replace(actionItem.key, '').replace(actionItem.shortcut, '').trim() | |||||
| return await actionItem.search(query, searchTerm, locale) | |||||
| } | |||||
| if (query.startsWith('@')) | |||||
| return [] | |||||
| // Use Promise.allSettled to handle partial failures gracefully | |||||
| const searchPromises = Object.values(Actions).map(async (action) => { | |||||
| try { | |||||
| const results = await action.search(query, query, locale) | |||||
| return { success: true, data: results, actionType: action.key } | |||||
| } | |||||
| catch (error) { | |||||
| console.warn(`Search failed for ${action.key}:`, error) | |||||
| return { success: false, data: [], actionType: action.key, error } | |||||
| } | |||||
| }) | |||||
| const settledResults = await Promise.allSettled(searchPromises) | |||||
| const allResults: SearchResult[] = [] | |||||
| const failedActions: string[] = [] | |||||
| settledResults.forEach((result, index) => { | |||||
| if (result.status === 'fulfilled' && result.value.success) { | |||||
| allResults.push(...result.value.data) | |||||
| } | |||||
| else { | |||||
| const actionKey = Object.values(Actions)[index]?.key || 'unknown' | |||||
| failedActions.push(actionKey) | |||||
| } | |||||
| }) | |||||
| if (failedActions.length > 0) | |||||
| console.warn(`Some search actions failed: ${failedActions.join(', ')}`) | |||||
| return allResults | |||||
| } | |||||
| export const matchAction = (query: string, actions: Record<string, ActionItem>) => { | |||||
| return Object.values(actions).find((action) => { | |||||
| const reg = new RegExp(`^(${action.key}|${action.shortcut})(?:\\s|$)`) | |||||
| return reg.test(query) | |||||
| }) | |||||
| } | |||||
| export * from './types' | |||||
| export { appAction, knowledgeAction, pluginAction, workflowNodesAction } |
| import type { ActionItem, KnowledgeSearchResult } from './types' | |||||
| import type { DataSet } from '@/models/datasets' | |||||
| import { fetchDatasets } from '@/service/datasets' | |||||
| import { Folder } from '../../base/icons/src/vender/solid/files' | |||||
| import cn from '@/utils/classnames' | |||||
| const EXTERNAL_PROVIDER = 'external' as const | |||||
| const isExternalProvider = (provider: string): boolean => provider === EXTERNAL_PROVIDER | |||||
| const parser = (datasets: DataSet[]): KnowledgeSearchResult[] => { | |||||
| return datasets.map((dataset) => { | |||||
| const path = isExternalProvider(dataset.provider) ? `/datasets/${dataset.id}/hitTesting` : `/datasets/${dataset.id}/documents` | |||||
| return { | |||||
| id: dataset.id, | |||||
| title: dataset.name, | |||||
| description: dataset.description, | |||||
| type: 'knowledge' as const, | |||||
| path, | |||||
| icon: ( | |||||
| <div className={cn( | |||||
| 'flex shrink-0 items-center justify-center rounded-md border-[0.5px] border-[#E0EAFF] bg-[#F5F8FF] p-2.5', | |||||
| !dataset.embedding_available && 'opacity-50 hover:opacity-100', | |||||
| )}> | |||||
| <Folder className='h-5 w-5 text-[#444CE7]' /> | |||||
| </div> | |||||
| ), | |||||
| data: dataset, | |||||
| } | |||||
| }) | |||||
| } | |||||
| export const knowledgeAction: ActionItem = { | |||||
| key: '@knowledge', | |||||
| shortcut: '@kb', | |||||
| title: 'Search Knowledge Bases', | |||||
| description: 'Search and navigate to your knowledge bases', | |||||
| // action, | |||||
| search: async (_, searchTerm = '', locale) => { | |||||
| const response = await fetchDatasets({ | |||||
| url: '/datasets', | |||||
| params: { | |||||
| page: 1, | |||||
| limit: 10, | |||||
| keyword: searchTerm, | |||||
| }, | |||||
| }) | |||||
| return parser(response.data) | |||||
| }, | |||||
| } |
| import type { ActionItem, PluginSearchResult } from './types' | |||||
| import { renderI18nObject } from '@/i18n-config' | |||||
| import Icon from '../../plugins/card/base/card-icon' | |||||
| import { postMarketplace } from '@/service/base' | |||||
| import type { Plugin, PluginsFromMarketplaceResponse } from '../../plugins/types' | |||||
| import { getPluginIconInMarketplace } from '../../plugins/marketplace/utils' | |||||
| const parser = (plugins: Plugin[], locale: string): PluginSearchResult[] => { | |||||
| return plugins.map((plugin) => { | |||||
| return { | |||||
| id: plugin.name, | |||||
| title: renderI18nObject(plugin.label, locale) || plugin.name, | |||||
| description: renderI18nObject(plugin.brief, locale) || '', | |||||
| type: 'plugin' as const, | |||||
| icon: <Icon src={plugin.icon} />, | |||||
| data: plugin, | |||||
| } | |||||
| }) | |||||
| } | |||||
| export const pluginAction: ActionItem = { | |||||
| key: '@plugin', | |||||
| shortcut: '@plugin', | |||||
| title: 'Search Plugins', | |||||
| description: 'Search and navigate to your plugins', | |||||
| search: async (_, searchTerm = '', locale) => { | |||||
| const response = await postMarketplace<{ data: PluginsFromMarketplaceResponse }>('/plugins/search/advanced', { | |||||
| body: { | |||||
| page: 1, | |||||
| page_size: 10, | |||||
| query: searchTerm, | |||||
| type: 'plugin', | |||||
| }, | |||||
| }) | |||||
| const list = (response.data.plugins || []).map(plugin => ({ | |||||
| ...plugin, | |||||
| icon: getPluginIconInMarketplace(plugin), | |||||
| })) | |||||
| return parser(list, locale!) | |||||
| }, | |||||
| } |
| import type { ReactNode } from 'react' | |||||
| import type { TypeWithI18N } from '../../base/form/types' | |||||
| import type { App } from '@/types/app' | |||||
| import type { Plugin } from '../../plugins/types' | |||||
| import type { DataSet } from '@/models/datasets' | |||||
| import type { CommonNodeType } from '../../workflow/types' | |||||
| export type SearchResultType = 'app' | 'knowledge' | 'plugin' | 'workflow-node' | |||||
| export type BaseSearchResult<T = any> = { | |||||
| id: string | |||||
| title: string | |||||
| description?: string | |||||
| type: SearchResultType | |||||
| path?: string | |||||
| icon?: ReactNode | |||||
| data: T | |||||
| } | |||||
| export type AppSearchResult = { | |||||
| type: 'app' | |||||
| } & BaseSearchResult<App> | |||||
| export type PluginSearchResult = { | |||||
| type: 'plugin' | |||||
| } & BaseSearchResult<Plugin> | |||||
| export type KnowledgeSearchResult = { | |||||
| type: 'knowledge' | |||||
| } & BaseSearchResult<DataSet> | |||||
| export type WorkflowNodeSearchResult = { | |||||
| type: 'workflow-node' | |||||
| metadata?: { | |||||
| nodeId: string | |||||
| nodeData: CommonNodeType | |||||
| } | |||||
| } & BaseSearchResult<CommonNodeType> | |||||
| export type SearchResult = AppSearchResult | PluginSearchResult | KnowledgeSearchResult | WorkflowNodeSearchResult | |||||
| export type ActionItem = { | |||||
| key: '@app' | '@knowledge' | '@plugin' | '@node' | |||||
| shortcut: string | |||||
| title: string | TypeWithI18N | |||||
| description: string | |||||
| action?: (data: SearchResult) => void | |||||
| searchFn?: (searchTerm: string) => SearchResult[] | |||||
| search: ( | |||||
| query: string, | |||||
| searchTerm: string, | |||||
| locale?: string, | |||||
| ) => (Promise<SearchResult[]> | SearchResult[]) | |||||
| } |
| import type { ActionItem } from './types' | |||||
| import { BoltIcon } from '@heroicons/react/24/outline' | |||||
| import i18n from 'i18next' | |||||
| // Create the workflow nodes action | |||||
| export const workflowNodesAction: ActionItem = { | |||||
| key: '@node', | |||||
| shortcut: '@node', | |||||
| title: 'Search Workflow Nodes', | |||||
| description: 'Find and jump to nodes in the current workflow by name or type', | |||||
| searchFn: undefined, // Will be set by useWorkflowSearch hook | |||||
| search: async (_, searchTerm = '', locale) => { | |||||
| try { | |||||
| // Use the searchFn if available (set by useWorkflowSearch hook) | |||||
| if (workflowNodesAction.searchFn) { | |||||
| // searchFn already returns SearchResult[] type, no need to use parser | |||||
| return workflowNodesAction.searchFn(searchTerm) | |||||
| } | |||||
| // If not in workflow context or search function not registered | |||||
| if (!searchTerm.trim()) { | |||||
| return [{ | |||||
| id: 'help', | |||||
| title: i18n.t('app.gotoAnything.actions.searchWorkflowNodes', { lng: locale }), | |||||
| description: i18n.t('app.gotoAnything.actions.searchWorkflowNodesHelp', { lng: locale }), | |||||
| type: 'workflow-node', | |||||
| path: '#', | |||||
| data: {} as any, | |||||
| icon: ( | |||||
| <div className="flex h-8 w-8 shrink-0 items-center justify-center rounded-md bg-blue-50 text-blue-600"> | |||||
| <BoltIcon className="h-5 w-5" /> | |||||
| </div> | |||||
| ), | |||||
| }] | |||||
| } | |||||
| return [] | |||||
| } | |||||
| catch (error) { | |||||
| console.error('Error searching workflow nodes:', error) | |||||
| return [] | |||||
| } | |||||
| }, | |||||
| } |
| 'use client' | |||||
| import type { ReactNode } from 'react' | |||||
| import React, { createContext, useContext, useEffect, useState } from 'react' | |||||
| import { usePathname } from 'next/navigation' | |||||
| /** | |||||
| * Interface for the GotoAnything context | |||||
| */ | |||||
| type GotoAnythingContextType = { | |||||
| /** | |||||
| * Whether the current page is a workflow page | |||||
| */ | |||||
| isWorkflowPage: boolean | |||||
| } | |||||
| // Create context with default values | |||||
| const GotoAnythingContext = createContext<GotoAnythingContextType>({ | |||||
| isWorkflowPage: false, | |||||
| }) | |||||
| /** | |||||
| * Hook to use the GotoAnything context | |||||
| */ | |||||
| export const useGotoAnythingContext = () => useContext(GotoAnythingContext) | |||||
| type GotoAnythingProviderProps = { | |||||
| children: ReactNode | |||||
| } | |||||
| /** | |||||
| * Provider component for GotoAnything context | |||||
| */ | |||||
| export const GotoAnythingProvider: React.FC<GotoAnythingProviderProps> = ({ children }) => { | |||||
| const [isWorkflowPage, setIsWorkflowPage] = useState(false) | |||||
| const pathname = usePathname() | |||||
| // Update context based on current pathname | |||||
| useEffect(() => { | |||||
| // Check if current path contains workflow | |||||
| const isWorkflow = pathname?.includes('/workflow') || false | |||||
| setIsWorkflowPage(isWorkflow) | |||||
| }, [pathname]) | |||||
| return ( | |||||
| <GotoAnythingContext.Provider value={{ isWorkflowPage }}> | |||||
| {children} | |||||
| </GotoAnythingContext.Provider> | |||||
| ) | |||||
| } |
| 'use client' | |||||
| import type { FC } from 'react' | |||||
| import { useCallback, useEffect, useMemo, useRef, useState } from 'react' | |||||
| import { useRouter } from 'next/navigation' | |||||
| import Modal from '@/app/components/base/modal' | |||||
| import Input from '@/app/components/base/input' | |||||
| import { useDebounce, useKeyPress } from 'ahooks' | |||||
| import { getKeyboardKeyCodeBySystem, isEventTargetInputArea, isMac } from '@/app/components/workflow/utils/common' | |||||
| import { selectWorkflowNode } from '@/app/components/workflow/utils/node-navigation' | |||||
| import { RiSearchLine } from '@remixicon/react' | |||||
| import { Actions as AllActions, type SearchResult, matchAction, searchAnything } from './actions' | |||||
| import { GotoAnythingProvider, useGotoAnythingContext } from './context' | |||||
| import { useQuery } from '@tanstack/react-query' | |||||
| import { useGetLanguage } from '@/context/i18n' | |||||
| import { useTranslation } from 'react-i18next' | |||||
| import InstallFromMarketplace from '../plugins/install-plugin/install-from-marketplace' | |||||
| import type { Plugin } from '../plugins/types' | |||||
| import { Command } from 'cmdk' | |||||
| type Props = { | |||||
| onHide?: () => void | |||||
| } | |||||
| const GotoAnything: FC<Props> = ({ | |||||
| onHide, | |||||
| }) => { | |||||
| const router = useRouter() | |||||
| const defaultLocale = useGetLanguage() | |||||
| const { isWorkflowPage } = useGotoAnythingContext() | |||||
| const { t } = useTranslation() | |||||
| const [show, setShow] = useState<boolean>(false) | |||||
| const [searchQuery, setSearchQuery] = useState<string>('') | |||||
| const [cmdVal, setCmdVal] = useState<string>('') | |||||
| const inputRef = useRef<HTMLInputElement>(null) | |||||
| // Filter actions based on context | |||||
| const Actions = useMemo(() => { | |||||
| // Create a filtered copy of actions based on current page context | |||||
| if (isWorkflowPage) { | |||||
| // Include all actions on workflow pages | |||||
| return AllActions | |||||
| } | |||||
| else { | |||||
| // Exclude node action on non-workflow pages | |||||
| const { app, knowledge, plugin } = AllActions | |||||
| return { app, knowledge, plugin } | |||||
| } | |||||
| }, [isWorkflowPage]) | |||||
| const [activePlugin, setActivePlugin] = useState<Plugin>() | |||||
| // Handle keyboard shortcuts | |||||
| const handleToggleModal = useCallback((e: KeyboardEvent) => { | |||||
| // Allow closing when modal is open, even if focus is in the search input | |||||
| if (!show && isEventTargetInputArea(e.target as HTMLElement)) | |||||
| return | |||||
| e.preventDefault() | |||||
| setShow((prev) => { | |||||
| if (!prev) { | |||||
| // Opening modal - reset search state | |||||
| setSearchQuery('') | |||||
| } | |||||
| return !prev | |||||
| }) | |||||
| }, [show]) | |||||
| useKeyPress(`${getKeyboardKeyCodeBySystem('ctrl')}.k`, handleToggleModal, { | |||||
| exactMatch: true, | |||||
| useCapture: true, | |||||
| }) | |||||
| useKeyPress(['esc'], (e) => { | |||||
| if (show) { | |||||
| e.preventDefault() | |||||
| setShow(false) | |||||
| setSearchQuery('') | |||||
| } | |||||
| }) | |||||
| const searchQueryDebouncedValue = useDebounce(searchQuery.trim(), { | |||||
| wait: 300, | |||||
| }) | |||||
| const searchMode = useMemo(() => { | |||||
| const query = searchQueryDebouncedValue.toLowerCase() | |||||
| const action = matchAction(query, Actions) | |||||
| return action ? action.key : 'general' | |||||
| }, [searchQueryDebouncedValue, Actions]) | |||||
| const { data: searchResults = [], isLoading, isError, error } = useQuery( | |||||
| { | |||||
| queryKey: [ | |||||
| 'goto-anything', | |||||
| 'search-result', | |||||
| searchQueryDebouncedValue, | |||||
| searchMode, | |||||
| isWorkflowPage, | |||||
| defaultLocale, | |||||
| Object.keys(Actions).sort().join(','), | |||||
| ], | |||||
| queryFn: async () => { | |||||
| const query = searchQueryDebouncedValue.toLowerCase() | |||||
| const action = matchAction(query, Actions) | |||||
| return await searchAnything(defaultLocale, query, action) | |||||
| }, | |||||
| enabled: !!searchQueryDebouncedValue, | |||||
| staleTime: 30000, | |||||
| gcTime: 300000, | |||||
| }, | |||||
| ) | |||||
| // Handle navigation to selected result | |||||
| const handleNavigate = useCallback((result: SearchResult) => { | |||||
| setShow(false) | |||||
| setSearchQuery('') | |||||
| switch (result.type) { | |||||
| case 'plugin': | |||||
| setActivePlugin(result.data) | |||||
| break | |||||
| case 'workflow-node': | |||||
| // Handle workflow node selection and navigation | |||||
| if (result.metadata?.nodeId) | |||||
| selectWorkflowNode(result.metadata.nodeId, true) | |||||
| break | |||||
| default: | |||||
| if (result.path) | |||||
| router.push(result.path) | |||||
| } | |||||
| }, [router]) | |||||
| // Group results by type | |||||
| const groupedResults = useMemo(() => searchResults.reduce((acc, result) => { | |||||
| if (!acc[result.type]) | |||||
| acc[result.type] = [] | |||||
| acc[result.type].push(result) | |||||
| return acc | |||||
| }, {} as { [key: string]: SearchResult[] }), | |||||
| [searchResults]) | |||||
| const emptyResult = useMemo(() => { | |||||
| if (searchResults.length || !searchQueryDebouncedValue.trim() || isLoading) | |||||
| return null | |||||
| const isCommandSearch = searchMode !== 'general' | |||||
| const commandType = isCommandSearch ? searchMode.replace('@', '') : '' | |||||
| if (isError) { | |||||
| return ( | |||||
| <div className="flex items-center justify-center py-8 text-center text-text-tertiary"> | |||||
| <div> | |||||
| <div className='text-sm font-medium text-red-500'>{t('app.gotoAnything.searchTemporarilyUnavailable')}</div> | |||||
| <div className='mt-1 text-xs text-text-quaternary'> | |||||
| {t('app.gotoAnything.servicesUnavailableMessage')} | |||||
| </div> | |||||
| </div> | |||||
| </div> | |||||
| ) | |||||
| } | |||||
| return ( | |||||
| <div className="flex items-center justify-center py-8 text-center text-text-tertiary"> | |||||
| <div> | |||||
| <div className='text-sm font-medium'> | |||||
| {isCommandSearch | |||||
| ? (() => { | |||||
| const keyMap: Record<string, string> = { | |||||
| app: 'app.gotoAnything.emptyState.noAppsFound', | |||||
| plugin: 'app.gotoAnything.emptyState.noPluginsFound', | |||||
| knowledge: 'app.gotoAnything.emptyState.noKnowledgeBasesFound', | |||||
| node: 'app.gotoAnything.emptyState.noWorkflowNodesFound', | |||||
| } | |||||
| return t(keyMap[commandType] || 'app.gotoAnything.noResults') | |||||
| })() | |||||
| : t('app.gotoAnything.noResults') | |||||
| } | |||||
| </div> | |||||
| <div className='mt-1 text-xs text-text-quaternary'> | |||||
| {isCommandSearch | |||||
| ? t('app.gotoAnything.emptyState.tryDifferentTerm', { mode: searchMode }) | |||||
| : t('app.gotoAnything.emptyState.trySpecificSearch', { shortcuts: Object.values(Actions).map(action => action.shortcut).join(', ') }) | |||||
| } | |||||
| </div> | |||||
| </div> | |||||
| </div> | |||||
| ) | |||||
| }, [searchResults, searchQueryDebouncedValue, Actions, searchMode, isLoading, isError]) | |||||
| const defaultUI = useMemo(() => { | |||||
| if (searchQueryDebouncedValue.trim()) | |||||
| return null | |||||
| return (<div className="flex items-center justify-center py-8 text-center text-text-tertiary"> | |||||
| <div> | |||||
| <div className='text-sm font-medium'>{t('app.gotoAnything.searchTitle')}</div> | |||||
| <div className='mt-3 space-y-2 text-xs text-text-quaternary'> | |||||
| {Object.values(Actions).map(action => ( | |||||
| <div key={action.key} className='flex items-center gap-2'> | |||||
| <span className='inline-flex items-center rounded bg-gray-200 px-2 py-1 font-mono text-xs font-medium text-gray-600 dark:bg-gray-700 dark:text-gray-200'>{action.shortcut}</span> | |||||
| <span>{(() => { | |||||
| const keyMap: Record<string, string> = { | |||||
| '@app': 'app.gotoAnything.actions.searchApplicationsDesc', | |||||
| '@plugin': 'app.gotoAnything.actions.searchPluginsDesc', | |||||
| '@knowledge': 'app.gotoAnything.actions.searchKnowledgeBasesDesc', | |||||
| '@node': 'app.gotoAnything.actions.searchWorkflowNodesDesc', | |||||
| } | |||||
| return t(keyMap[action.key]) | |||||
| })()}</span> | |||||
| </div> | |||||
| ))} | |||||
| </div> | |||||
| </div> | |||||
| </div>) | |||||
| }, [searchQueryDebouncedValue, Actions]) | |||||
| useEffect(() => { | |||||
| if (show) { | |||||
| requestAnimationFrame(() => { | |||||
| inputRef.current?.focus() | |||||
| }) | |||||
| } | |||||
| return () => { | |||||
| setCmdVal('') | |||||
| } | |||||
| }, [show]) | |||||
| return ( | |||||
| <> | |||||
| <Modal | |||||
| isShow={show} | |||||
| onClose={() => { | |||||
| setShow(false) | |||||
| setSearchQuery('') | |||||
| onHide?.() | |||||
| }} | |||||
| closable={false} | |||||
| className='!w-[480px] !p-0' | |||||
| > | |||||
| <div className='flex flex-col rounded-2xl border border-components-panel-border bg-components-panel-bg shadow-xl'> | |||||
| <Command | |||||
| className='outline-none' | |||||
| value={cmdVal} | |||||
| onValueChange={setCmdVal} | |||||
| > | |||||
| <div className='flex items-center gap-3 border-b border-divider-subtle bg-components-panel-bg-blur px-4 py-3'> | |||||
| <RiSearchLine className='h-4 w-4 text-text-quaternary' /> | |||||
| <div className='flex flex-1 items-center gap-2'> | |||||
| <Input | |||||
| ref={inputRef} | |||||
| value={searchQuery} | |||||
| placeholder={t('app.gotoAnything.searchPlaceholder')} | |||||
| onChange={(e) => { | |||||
| setCmdVal('') | |||||
| setSearchQuery(e.target.value) | |||||
| }} | |||||
| className='flex-1 !border-0 !bg-transparent !shadow-none' | |||||
| wrapperClassName='flex-1 !border-0 !bg-transparent' | |||||
| autoFocus | |||||
| /> | |||||
| {searchMode !== 'general' && ( | |||||
| <div className='flex items-center gap-1 rounded bg-blue-50 px-2 py-[2px] text-xs font-medium text-blue-600 dark:bg-blue-900/40 dark:text-blue-300'> | |||||
| <span>{searchMode.replace('@', '').toUpperCase()}</span> | |||||
| </div> | |||||
| )} | |||||
| </div> | |||||
| <div className='text-xs text-text-quaternary'> | |||||
| <span className='system-kbd rounded bg-gray-200 px-1 py-[2px] font-mono text-gray-700 dark:bg-gray-800 dark:text-gray-100'> | |||||
| {isMac() ? '⌘' : 'Ctrl'} | |||||
| </span> | |||||
| <span className='system-kbd ml-1 rounded bg-gray-200 px-1 py-[2px] font-mono text-gray-700 dark:bg-gray-800 dark:text-gray-100'> | |||||
| K | |||||
| </span> | |||||
| </div> | |||||
| </div> | |||||
| <Command.List className='max-h-[275px] min-h-[240px] overflow-y-auto'> | |||||
| {isLoading && ( | |||||
| <div className="flex items-center justify-center py-8 text-center text-text-tertiary"> | |||||
| <div className="flex items-center gap-2"> | |||||
| <div className="h-4 w-4 animate-spin rounded-full border-2 border-gray-300 border-t-gray-600"></div> | |||||
| <span className="text-sm">{t('app.gotoAnything.searching')}</span> | |||||
| </div> | |||||
| </div> | |||||
| )} | |||||
| {isError && ( | |||||
| <div className="flex items-center justify-center py-8 text-center text-text-tertiary"> | |||||
| <div> | |||||
| <div className="text-sm font-medium text-red-500">{t('app.gotoAnything.searchFailed')}</div> | |||||
| <div className="mt-1 text-xs text-text-quaternary"> | |||||
| {error.message} | |||||
| </div> | |||||
| </div> | |||||
| </div> | |||||
| )} | |||||
| {!isLoading && !isError && ( | |||||
| <> | |||||
| {Object.entries(groupedResults).map(([type, results], groupIndex) => ( | |||||
| <Command.Group key={groupIndex} heading={(() => { | |||||
| const typeMap: Record<string, string> = { | |||||
| 'app': 'app.gotoAnything.groups.apps', | |||||
| 'plugin': 'app.gotoAnything.groups.plugins', | |||||
| 'knowledge': 'app.gotoAnything.groups.knowledgeBases', | |||||
| 'workflow-node': 'app.gotoAnything.groups.workflowNodes', | |||||
| } | |||||
| return t(typeMap[type] || `${type}s`) | |||||
| })()} className='p-2 capitalize text-text-secondary'> | |||||
| {results.map(result => ( | |||||
| <Command.Item | |||||
| key={`${result.type}-${result.id}`} | |||||
| value={result.title} | |||||
| className='flex cursor-pointer items-center gap-3 rounded-md p-3 will-change-[background-color] aria-[selected=true]:bg-state-base-hover data-[selected=true]:bg-state-base-hover' | |||||
| onSelect={() => handleNavigate(result)} | |||||
| > | |||||
| {result.icon} | |||||
| <div className='min-w-0 flex-1'> | |||||
| <div className='truncate font-medium text-text-secondary'> | |||||
| {result.title} | |||||
| </div> | |||||
| {result.description && ( | |||||
| <div className='mt-0.5 truncate text-xs text-text-quaternary'> | |||||
| {result.description} | |||||
| </div> | |||||
| )} | |||||
| </div> | |||||
| <div className='text-xs capitalize text-text-quaternary'> | |||||
| {result.type} | |||||
| </div> | |||||
| </Command.Item> | |||||
| ))} | |||||
| </Command.Group> | |||||
| ))} | |||||
| {emptyResult} | |||||
| {defaultUI} | |||||
| </> | |||||
| )} | |||||
| </Command.List> | |||||
| {(!!searchResults.length || isError) && ( | |||||
| <div className='border-t border-divider-subtle bg-components-panel-bg-blur px-4 py-2 text-xs text-text-tertiary'> | |||||
| <div className='flex items-center justify-between'> | |||||
| <span> | |||||
| {isError ? ( | |||||
| <span className='text-red-500'>{t('app.gotoAnything.someServicesUnavailable')}</span> | |||||
| ) : ( | |||||
| <> | |||||
| {t('app.gotoAnything.resultCount', { count: searchResults.length })} | |||||
| {searchMode !== 'general' && ( | |||||
| <span className='ml-2 opacity-60'> | |||||
| {t('app.gotoAnything.inScope', { scope: searchMode.replace('@', '') })} | |||||
| </span> | |||||
| )} | |||||
| </> | |||||
| )} | |||||
| </span> | |||||
| <span className='opacity-60'> | |||||
| {searchMode !== 'general' | |||||
| ? t('app.gotoAnything.clearToSearchAll') | |||||
| : t('app.gotoAnything.useAtForSpecific') | |||||
| } | |||||
| </span> | |||||
| </div> | |||||
| </div> | |||||
| )} | |||||
| </Command> | |||||
| </div> | |||||
| </Modal> | |||||
| { | |||||
| activePlugin && ( | |||||
| <InstallFromMarketplace | |||||
| manifest={activePlugin} | |||||
| uniqueIdentifier={activePlugin.latest_package_identifier} | |||||
| onClose={() => setActivePlugin(undefined)} | |||||
| onSuccess={() => setActivePlugin(undefined)} | |||||
| /> | |||||
| ) | |||||
| } | |||||
| </> | |||||
| ) | |||||
| } | |||||
| /** | |||||
| * GotoAnything component with context provider | |||||
| */ | |||||
| const GotoAnythingWithContext: FC<Props> = (props) => { | |||||
| return ( | |||||
| <GotoAnythingProvider> | |||||
| <GotoAnything {...props} /> | |||||
| </GotoAnythingProvider> | |||||
| ) | |||||
| } | |||||
| export default GotoAnythingWithContext |
| export * from './use-workflow-refresh-draft' | export * from './use-workflow-refresh-draft' | ||||
| export * from './use-inspect-vars-crud' | export * from './use-inspect-vars-crud' | ||||
| export * from './use-set-workflow-vars-with-value' | export * from './use-set-workflow-vars-with-value' | ||||
| export * from './use-workflow-search' |
| 'use client' | |||||
| import { useCallback, useEffect, useMemo } from 'react' | |||||
| import { useNodes } from 'reactflow' | |||||
| import { useNodesInteractions } from './use-nodes-interactions' | |||||
| import type { CommonNodeType } from '../types' | |||||
| import { workflowNodesAction } from '@/app/components/goto-anything/actions/workflow-nodes' | |||||
| import BlockIcon from '@/app/components/workflow/block-icon' | |||||
| import { setupNodeSelectionListener } from '../utils/node-navigation' | |||||
| /** | |||||
| * Hook to register workflow nodes search functionality | |||||
| */ | |||||
| export const useWorkflowSearch = () => { | |||||
| const nodes = useNodes() | |||||
| const { handleNodeSelect } = useNodesInteractions() | |||||
| // Filter and process nodes for search | |||||
| const searchableNodes = useMemo(() => { | |||||
| const filteredNodes = nodes.filter((node) => { | |||||
| if (!node.id || !node.data || node.type === 'sticky') return false | |||||
| const nodeData = node.data as CommonNodeType | |||||
| const nodeType = nodeData?.type | |||||
| const internalStartNodes = ['iteration-start', 'loop-start'] | |||||
| return !internalStartNodes.includes(nodeType) | |||||
| }) | |||||
| const result = filteredNodes | |||||
| .map((node) => { | |||||
| const nodeData = node.data as CommonNodeType | |||||
| return { | |||||
| id: node.id, | |||||
| title: nodeData?.title || nodeData?.type || 'Untitled', | |||||
| type: nodeData?.type || '', | |||||
| desc: nodeData?.desc || '', | |||||
| blockType: nodeData?.type, | |||||
| nodeData, | |||||
| } | |||||
| }) | |||||
| return result | |||||
| }, [nodes]) | |||||
| // Create search function for workflow nodes | |||||
| const searchWorkflowNodes = useCallback((query: string) => { | |||||
| if (!searchableNodes.length || !query.trim()) return [] | |||||
| const searchTerm = query.toLowerCase() | |||||
| const results = searchableNodes | |||||
| .map((node) => { | |||||
| const titleMatch = node.title.toLowerCase() | |||||
| const typeMatch = node.type.toLowerCase() | |||||
| const descMatch = node.desc?.toLowerCase() || '' | |||||
| let score = 0 | |||||
| if (titleMatch.startsWith(searchTerm)) score += 100 | |||||
| else if (titleMatch.includes(searchTerm)) score += 50 | |||||
| else if (typeMatch === searchTerm) score += 80 | |||||
| else if (typeMatch.includes(searchTerm)) score += 30 | |||||
| else if (descMatch.includes(searchTerm)) score += 20 | |||||
| return score > 0 | |||||
| ? { | |||||
| id: node.id, | |||||
| title: node.title, | |||||
| description: node.desc || node.type, | |||||
| type: 'workflow-node' as const, | |||||
| path: `#${node.id}`, | |||||
| icon: ( | |||||
| <BlockIcon | |||||
| type={node.blockType} | |||||
| className="shrink-0" | |||||
| size="sm" | |||||
| /> | |||||
| ), | |||||
| metadata: { | |||||
| nodeId: node.id, | |||||
| nodeData: node.nodeData, | |||||
| }, | |||||
| // Add required data property for SearchResult type | |||||
| data: node.nodeData, | |||||
| } | |||||
| : null | |||||
| }) | |||||
| .filter((node): node is NonNullable<typeof node> => node !== null) | |||||
| .sort((a, b) => { | |||||
| const aTitle = a.title.toLowerCase() | |||||
| const bTitle = b.title.toLowerCase() | |||||
| if (aTitle.startsWith(searchTerm) && !bTitle.startsWith(searchTerm)) return -1 | |||||
| if (!aTitle.startsWith(searchTerm) && bTitle.startsWith(searchTerm)) return 1 | |||||
| return 0 | |||||
| }) | |||||
| return results | |||||
| }, [searchableNodes]) | |||||
| // Directly set the search function on the action object | |||||
| useEffect(() => { | |||||
| if (searchableNodes.length > 0) { | |||||
| // Set the search function directly on the action | |||||
| workflowNodesAction.searchFn = searchWorkflowNodes | |||||
| } | |||||
| return () => { | |||||
| // Clean up when component unmounts | |||||
| workflowNodesAction.searchFn = undefined | |||||
| } | |||||
| }, [searchableNodes, searchWorkflowNodes]) | |||||
| // Set up node selection event listener using the utility function | |||||
| useEffect(() => { | |||||
| return setupNodeSelectionListener(handleNodeSelect) | |||||
| }, [handleNodeSelect]) | |||||
| return null | |||||
| } |
| import CustomSimpleNode from './simple-node' | import CustomSimpleNode from './simple-node' | ||||
| import { CUSTOM_SIMPLE_NODE } from './simple-node/constants' | import { CUSTOM_SIMPLE_NODE } from './simple-node/constants' | ||||
| import Operator from './operator' | import Operator from './operator' | ||||
| import { useWorkflowSearch } from './hooks/use-workflow-search' | |||||
| import Control from './operator/control' | import Control from './operator/control' | ||||
| import CustomEdge from './custom-edge' | import CustomEdge from './custom-edge' | ||||
| import CustomConnectionLine from './custom-connection-line' | import CustomConnectionLine from './custom-connection-line' | ||||
| import SelectionContextmenu from './selection-contextmenu' | import SelectionContextmenu from './selection-contextmenu' | ||||
| import SyncingDataModal from './syncing-data-modal' | import SyncingDataModal from './syncing-data-modal' | ||||
| import LimitTips from './limit-tips' | import LimitTips from './limit-tips' | ||||
| import { setupScrollToNodeListener } from './utils/node-navigation' | |||||
| import { | import { | ||||
| useStore, | useStore, | ||||
| useWorkflowStore, | useWorkflowStore, | ||||
| }) | }) | ||||
| useShortcuts() | useShortcuts() | ||||
| // Initialize workflow node search functionality | |||||
| useWorkflowSearch() | |||||
| // Set up scroll to node event listener using the utility function | |||||
| useEffect(() => { | |||||
| return setupScrollToNodeListener(nodes, reactflow) | |||||
| }, [nodes, reactflow]) | |||||
| const { fetchInspectVars } = useSetWorkflowVarsWithValue() | const { fetchInspectVars } = useSetWorkflowVarsWithValue() | ||||
| useEffect(() => { | useEffect(() => { | ||||
| fetchInspectVars() | fetchInspectVars() |
| } | } | ||||
| > | > | ||||
| <div className='flex justify-between px-1 pb-2'> | <div className='flex justify-between px-1 pb-2'> | ||||
| <UndoRedo handleUndo={handleUndo} handleRedo={handleRedo} /> | |||||
| <div className='flex items-center gap-2'> | |||||
| <UndoRedo handleUndo={handleUndo} handleRedo={handleRedo} /> | |||||
| </div> | |||||
| <VariableTrigger /> | <VariableTrigger /> | ||||
| <div className='relative'> | <div className='relative'> | ||||
| <MiniMap | <MiniMap |
| import { memo, useCallback } from 'react' | import { memo, useCallback } from 'react' | ||||
| import type { WorkflowDataUpdater } from '../types' | |||||
| import type { WorkflowRunDetailResponse } from '@/models/log' | |||||
| import Run from '../run' | import Run from '../run' | ||||
| import { useStore } from '../store' | import { useStore } from '../store' | ||||
| import { useWorkflowUpdate } from '../hooks' | import { useWorkflowUpdate } from '../hooks' | ||||
| const historyWorkflowData = useStore(s => s.historyWorkflowData) | const historyWorkflowData = useStore(s => s.historyWorkflowData) | ||||
| const { handleUpdateWorkflowCanvas } = useWorkflowUpdate() | const { handleUpdateWorkflowCanvas } = useWorkflowUpdate() | ||||
| const handleResultCallback = useCallback((res: any) => { | |||||
| const graph: WorkflowDataUpdater = res.graph | |||||
| const handleResultCallback = useCallback((res: WorkflowRunDetailResponse) => { | |||||
| const graph = res.graph | |||||
| handleUpdateWorkflowCanvas({ | handleUpdateWorkflowCanvas({ | ||||
| nodes: graph.nodes, | nodes: graph.nodes, | ||||
| edges: graph.edges, | edges: graph.edges, | ||||
| viewport: graph.viewport, | |||||
| viewport: graph.viewport || { x: 0, y: 0, zoom: 1 }, | |||||
| }) | }) | ||||
| }, [handleUpdateWorkflowCanvas]) | }, [handleUpdateWorkflowCanvas]) | ||||
| /** | |||||
| * Node navigation utilities for workflow | |||||
| * This module provides functions for node selection, focusing and scrolling in workflow | |||||
| */ | |||||
| /** | |||||
| * Interface for node selection event detail | |||||
| */ | |||||
| export type NodeSelectionDetail = { | |||||
| nodeId: string; | |||||
| focus?: boolean; | |||||
| } | |||||
| /** | |||||
| * Select a node in the workflow | |||||
| * @param nodeId - The ID of the node to select | |||||
| * @param focus - Whether to focus/scroll to the node | |||||
| */ | |||||
| export function selectWorkflowNode(nodeId: string, focus = false): void { | |||||
| // Create and dispatch a custom event for node selection | |||||
| const event = new CustomEvent('workflow:select-node', { | |||||
| detail: { | |||||
| nodeId, | |||||
| focus, | |||||
| }, | |||||
| }) | |||||
| document.dispatchEvent(event) | |||||
| } | |||||
| /** | |||||
| * Scroll to a specific node in the workflow | |||||
| * @param nodeId - The ID of the node to scroll to | |||||
| */ | |||||
| export function scrollToWorkflowNode(nodeId: string): void { | |||||
| // Create and dispatch a custom event for scrolling to node | |||||
| const event = new CustomEvent('workflow:scroll-to-node', { | |||||
| detail: { nodeId }, | |||||
| }) | |||||
| document.dispatchEvent(event) | |||||
| } | |||||
| /** | |||||
| * Setup node selection event listener | |||||
| * @param handleNodeSelect - Function to handle node selection | |||||
| * @returns Cleanup function | |||||
| */ | |||||
| export function setupNodeSelectionListener( | |||||
| handleNodeSelect: (nodeId: string) => void, | |||||
| ): () => void { | |||||
| // Event handler for node selection | |||||
| const handleNodeSelection = (event: CustomEvent<NodeSelectionDetail>) => { | |||||
| const { nodeId, focus } = event.detail | |||||
| if (nodeId) { | |||||
| // Select the node | |||||
| handleNodeSelect(nodeId) | |||||
| // If focus is requested, scroll to the node | |||||
| if (focus) { | |||||
| // Use a small timeout to ensure node selection happens first | |||||
| setTimeout(() => { | |||||
| scrollToWorkflowNode(nodeId) | |||||
| }, 100) | |||||
| } | |||||
| } | |||||
| } | |||||
| // Add event listener | |||||
| document.addEventListener( | |||||
| 'workflow:select-node', | |||||
| handleNodeSelection as EventListener, | |||||
| ) | |||||
| // Return cleanup function | |||||
| return () => { | |||||
| document.removeEventListener( | |||||
| 'workflow:select-node', | |||||
| handleNodeSelection as EventListener, | |||||
| ) | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Setup scroll to node event listener with ReactFlow | |||||
| * @param nodes - The workflow nodes | |||||
| * @param reactflow - The ReactFlow instance | |||||
| * @returns Cleanup function | |||||
| */ | |||||
| export function setupScrollToNodeListener( | |||||
| nodes: any[], | |||||
| reactflow: any, | |||||
| ): () => void { | |||||
| // Event handler for scrolling to node | |||||
| const handleScrollToNode = (event: CustomEvent<NodeSelectionDetail>) => { | |||||
| const { nodeId } = event.detail | |||||
| if (nodeId) { | |||||
| // Find the target node | |||||
| const node = nodes.find(n => n.id === nodeId) | |||||
| if (node) { | |||||
| // Use ReactFlow's fitView API to scroll to the node | |||||
| reactflow.fitView({ | |||||
| nodes: [node], | |||||
| padding: 0.2, | |||||
| duration: 800, | |||||
| minZoom: 0.5, | |||||
| maxZoom: 1, | |||||
| }) | |||||
| } | |||||
| } | |||||
| } | |||||
| // Add event listener | |||||
| document.addEventListener( | |||||
| 'workflow:scroll-to-node', | |||||
| handleScrollToNode as EventListener, | |||||
| ) | |||||
| // Return cleanup function | |||||
| return () => { | |||||
| document.removeEventListener( | |||||
| 'workflow:scroll-to-node', | |||||
| handleScrollToNode as EventListener, | |||||
| ) | |||||
| } | |||||
| } |
| maxActiveRequests: 'Maximale gleichzeitige Anfragen', | maxActiveRequests: 'Maximale gleichzeitige Anfragen', | ||||
| maxActiveRequestsPlaceholder: 'Geben Sie 0 für unbegrenzt ein', | maxActiveRequestsPlaceholder: 'Geben Sie 0 für unbegrenzt ein', | ||||
| maxActiveRequestsTip: 'Maximale Anzahl gleichzeitiger aktiver Anfragen pro App (0 für unbegrenzt)', | maxActiveRequestsTip: 'Maximale Anzahl gleichzeitiger aktiver Anfragen pro App (0 für unbegrenzt)', | ||||
| gotoAnything: { | |||||
| actions: { | |||||
| searchPlugins: 'Such-Plugins', | |||||
| searchKnowledgeBases: 'Wissensdatenbanken durchsuchen', | |||||
| searchWorkflowNodes: 'Workflow-Knoten durchsuchen', | |||||
| searchKnowledgeBasesDesc: 'Suchen und navigieren Sie zu Ihren Wissensdatenbanken', | |||||
| searchApplications: 'Anwendungen suchen', | |||||
| searchWorkflowNodesHelp: 'Diese Funktion funktioniert nur, wenn ein Workflow angezeigt wird. Navigieren Sie zuerst zu einem Workflow.', | |||||
| searchApplicationsDesc: 'Suchen und navigieren Sie zu Ihren Anwendungen', | |||||
| searchPluginsDesc: 'Suchen und navigieren Sie zu Ihren Plugins', | |||||
| searchWorkflowNodesDesc: 'Suchen und Springen zu Knoten im aktuellen Workflow nach Name oder Typ', | |||||
| }, | |||||
| emptyState: { | |||||
| noPluginsFound: 'Keine Plugins gefunden', | |||||
| noWorkflowNodesFound: 'Keine Workflow-Knoten gefunden', | |||||
| noKnowledgeBasesFound: 'Keine Wissensdatenbanken gefunden', | |||||
| noAppsFound: 'Keine Apps gefunden', | |||||
| }, | |||||
| groups: { | |||||
| knowledgeBases: 'Wissensdatenbanken', | |||||
| plugins: 'Plugins', | |||||
| apps: 'Apps', | |||||
| workflowNodes: 'Workflow-Knoten', | |||||
| }, | |||||
| clearToSearchAll: 'Löschen Sie @, um alle zu durchsuchen', | |||||
| searchTemporarilyUnavailable: 'Suche vorübergehend nicht verfügbar', | |||||
| searchFailed: 'Suche fehlgeschlagen', | |||||
| someServicesUnavailable: 'Einige Suchdienste sind nicht verfügbar', | |||||
| servicesUnavailableMessage: 'Bei einigen Suchdiensten können Probleme auftreten. Versuchen Sie es gleich noch einmal.', | |||||
| noResults: 'Keine Ergebnisse gefunden', | |||||
| searchPlaceholder: 'Suchen Sie nach Befehlen, oder geben Sie @ ein...', | |||||
| useAtForSpecific: 'Verwenden von @ für bestimmte Typen', | |||||
| searchTitle: 'Suchen Sie nach irgendetwas', | |||||
| searching: 'Suche...', | |||||
| }, | |||||
| } | } | ||||
| export default translation | export default translation |
| maxActiveRequests: 'Max concurrent requests', | maxActiveRequests: 'Max concurrent requests', | ||||
| maxActiveRequestsPlaceholder: 'Enter 0 for unlimited', | maxActiveRequestsPlaceholder: 'Enter 0 for unlimited', | ||||
| maxActiveRequestsTip: 'Maximum number of concurrent active requests per app (0 for unlimited)', | maxActiveRequestsTip: 'Maximum number of concurrent active requests per app (0 for unlimited)', | ||||
| gotoAnything: { | |||||
| searchPlaceholder: 'Search or type @ for commands...', | |||||
| searchTitle: 'Search for anything', | |||||
| searching: 'Searching...', | |||||
| noResults: 'No results found', | |||||
| searchFailed: 'Search failed', | |||||
| searchTemporarilyUnavailable: 'Search temporarily unavailable', | |||||
| servicesUnavailableMessage: 'Some search services may be experiencing issues. Try again in a moment.', | |||||
| someServicesUnavailable: 'Some search services unavailable', | |||||
| resultCount: '{{count}} result', | |||||
| resultCount_other: '{{count}} results', | |||||
| inScope: 'in {{scope}}s', | |||||
| clearToSearchAll: 'Clear @ to search all', | |||||
| useAtForSpecific: 'Use @ for specific types', | |||||
| actions: { | |||||
| searchApplications: 'Search Applications', | |||||
| searchApplicationsDesc: 'Search and navigate to your applications', | |||||
| searchPlugins: 'Search Plugins', | |||||
| searchPluginsDesc: 'Search and navigate to your plugins', | |||||
| searchKnowledgeBases: 'Search Knowledge Bases', | |||||
| searchKnowledgeBasesDesc: 'Search and navigate to your knowledge bases', | |||||
| searchWorkflowNodes: 'Search Workflow Nodes', | |||||
| searchWorkflowNodesDesc: 'Find and jump to nodes in the current workflow by name or type', | |||||
| searchWorkflowNodesHelp: 'This feature only works when viewing a workflow. Navigate to a workflow first.', | |||||
| }, | |||||
| emptyState: { | |||||
| noAppsFound: 'No apps found', | |||||
| noPluginsFound: 'No plugins found', | |||||
| noKnowledgeBasesFound: 'No knowledge bases found', | |||||
| noWorkflowNodesFound: 'No workflow nodes found', | |||||
| tryDifferentTerm: 'Try a different search term or remove the {{mode}} filter', | |||||
| trySpecificSearch: 'Try {{shortcuts}} for specific searches', | |||||
| }, | |||||
| groups: { | |||||
| apps: 'Apps', | |||||
| plugins: 'Plugins', | |||||
| knowledgeBases: 'Knowledge Bases', | |||||
| workflowNodes: 'Workflow Nodes', | |||||
| }, | |||||
| }, | |||||
| } | } | ||||
| export default translation | export default translation |
| settingsTab: 'Settings', | settingsTab: 'Settings', | ||||
| lastRunTab: 'Last Run', | lastRunTab: 'Last Run', | ||||
| relationsTab: 'Relations', | relationsTab: 'Relations', | ||||
| copyLastRun: 'Copy Last Run', | |||||
| noLastRunFound: 'No previous run found', | |||||
| noMatchingInputsFound: 'No matching inputs found from last run', | |||||
| lastRunInputsCopied: '{{count}} input(s) copied from last run', | |||||
| copyLastRunError: 'Failed to copy last run inputs', | |||||
| noData: { | noData: { | ||||
| description: 'The results of the last run will be displayed here', | description: 'The results of the last run will be displayed here', | ||||
| runThisNode: 'Run this node', | runThisNode: 'Run this node', |
| maxActiveRequestsPlaceholder: 'Introduce 0 para ilimitado', | maxActiveRequestsPlaceholder: 'Introduce 0 para ilimitado', | ||||
| maxActiveRequests: 'Máximas solicitudes concurrentes', | maxActiveRequests: 'Máximas solicitudes concurrentes', | ||||
| maxActiveRequestsTip: 'Número máximo de solicitudes activas concurrentes por aplicación (0 para ilimitado)', | maxActiveRequestsTip: 'Número máximo de solicitudes activas concurrentes por aplicación (0 para ilimitado)', | ||||
| gotoAnything: { | |||||
| actions: { | |||||
| searchApplications: 'Aplicaciones de búsqueda', | |||||
| searchKnowledgeBasesDesc: 'Busque y navegue por sus bases de conocimiento', | |||||
| searchWorkflowNodes: 'Buscar nodos de flujo de trabajo', | |||||
| searchPlugins: 'Complementos de búsqueda', | |||||
| searchWorkflowNodesDesc: 'Buscar y saltar a nodos en el flujo de trabajo actual por nombre o tipo', | |||||
| searchKnowledgeBases: 'Buscar en las bases de conocimiento', | |||||
| searchApplicationsDesc: 'Buscar y navegar a sus aplicaciones', | |||||
| searchPluginsDesc: 'Busca y navega a tus plugins', | |||||
| searchWorkflowNodesHelp: 'Esta función solo funciona cuando se visualiza un flujo de trabajo. Primero vaya a un flujo de trabajo.', | |||||
| }, | |||||
| emptyState: { | |||||
| noAppsFound: 'No se encontraron aplicaciones', | |||||
| noPluginsFound: 'No se encontraron complementos', | |||||
| noWorkflowNodesFound: 'No se encontraron nodos de flujo de trabajo', | |||||
| noKnowledgeBasesFound: 'No se han encontrado bases de conocimiento', | |||||
| }, | |||||
| groups: { | |||||
| apps: 'Aplicaciones', | |||||
| workflowNodes: 'Nodos de flujo de trabajo', | |||||
| knowledgeBases: 'Bases de conocimiento', | |||||
| plugins: 'Complementos', | |||||
| }, | |||||
| clearToSearchAll: 'Borrar @ para buscar todo', | |||||
| noResults: 'No se han encontrado resultados', | |||||
| searching: 'Minucioso...', | |||||
| searchTemporarilyUnavailable: 'La búsqueda no está disponible temporalmente', | |||||
| searchFailed: 'Error de búsqueda', | |||||
| useAtForSpecific: 'Use @ para tipos específicos', | |||||
| searchPlaceholder: 'Busque o escriba @ para los comandos...', | |||||
| searchTitle: 'Busca cualquier cosa', | |||||
| someServicesUnavailable: 'Algunos servicios de búsqueda no están disponibles', | |||||
| servicesUnavailableMessage: 'Algunos servicios de búsqueda pueden estar experimentando problemas. Inténtalo de nuevo en un momento.', | |||||
| }, | |||||
| } | } | ||||
| export default translation | export default translation |
| maxActiveRequests: 'بیشترین درخواستهای همزمان', | maxActiveRequests: 'بیشترین درخواستهای همزمان', | ||||
| maxActiveRequestsPlaceholder: 'برای نامحدود، 0 را وارد کنید', | maxActiveRequestsPlaceholder: 'برای نامحدود، 0 را وارد کنید', | ||||
| maxActiveRequestsTip: 'حداکثر تعداد درخواستهای فعال همزمان در هر برنامه (0 برای نامحدود)', | maxActiveRequestsTip: 'حداکثر تعداد درخواستهای فعال همزمان در هر برنامه (0 برای نامحدود)', | ||||
| gotoAnything: { | |||||
| actions: { | |||||
| searchPlugins: 'افزونه های جستجو', | |||||
| searchWorkflowNodes: 'گره های گردش کار جستجو', | |||||
| searchApplications: 'جستجوی برنامه ها', | |||||
| searchKnowledgeBases: 'جستجو در پایگاه های دانش', | |||||
| searchWorkflowNodesHelp: 'این ویژگی فقط هنگام مشاهده گردش کار کار می کند. ابتدا به گردش کار بروید.', | |||||
| searchApplicationsDesc: 'جستجو و پیمایش به برنامه های خود', | |||||
| searchKnowledgeBasesDesc: 'پایگاه های دانش خود را جستجو کرده و به آن ناوبری کنید', | |||||
| searchPluginsDesc: 'افزونه های خود را جستجو کرده و به آنها پیمایش کنید', | |||||
| searchWorkflowNodesDesc: 'گره ها را در گردش کار فعلی بر اساس نام یا نوع پیدا کنید و به آنها بروید', | |||||
| }, | |||||
| emptyState: { | |||||
| noKnowledgeBasesFound: 'هیچ پایگاه دانش یافت نشد', | |||||
| noAppsFound: 'هیچ برنامه ای یافت نشد', | |||||
| noPluginsFound: 'هیچ افزونه ای یافت نشد', | |||||
| noWorkflowNodesFound: 'هیچ گره گردش کاری یافت نشد', | |||||
| }, | |||||
| groups: { | |||||
| plugins: 'پلاگین', | |||||
| apps: 'واژهنامه', | |||||
| knowledgeBases: 'پایگاه های دانش', | |||||
| workflowNodes: 'گره های گردش کار', | |||||
| }, | |||||
| searching: 'جستجو...', | |||||
| searchFailed: 'جستجو انجام نشد', | |||||
| useAtForSpecific: 'از @ برای انواع خاص استفاده کنید', | |||||
| clearToSearchAll: 'پاک کردن @ برای جستجوی همه', | |||||
| noResults: 'هیچ نتیجه ای یافت نشد', | |||||
| searchTitle: 'هر چیزی را جستجو کنید', | |||||
| searchPlaceholder: 'جستجو یا تایپ @ برای دستورات...', | |||||
| searchTemporarilyUnavailable: 'جستجو به طور موقت در دسترس نیست', | |||||
| servicesUnavailableMessage: 'برخی از سرویس های جستجو ممکن است با مشکل مواجه شوند. یک لحظه دیگر دوباره امتحان کنید.', | |||||
| someServicesUnavailable: 'برخی از سرویس های جستجو دردسترس نیستند', | |||||
| }, | |||||
| } | } | ||||
| export default translation | export default translation |
| maxActiveRequestsPlaceholder: 'Entrez 0 pour illimité', | maxActiveRequestsPlaceholder: 'Entrez 0 pour illimité', | ||||
| maxActiveRequests: 'Nombre maximal de requêtes simultanées', | maxActiveRequests: 'Nombre maximal de requêtes simultanées', | ||||
| maxActiveRequestsTip: 'Nombre maximum de requêtes actives concurrentes par application (0 pour illimité)', | maxActiveRequestsTip: 'Nombre maximum de requêtes actives concurrentes par application (0 pour illimité)', | ||||
| gotoAnything: { | |||||
| actions: { | |||||
| searchPluginsDesc: 'Recherchez et naviguez vers vos plugins', | |||||
| searchKnowledgeBasesDesc: 'Recherchez et accédez à vos bases de connaissances', | |||||
| searchWorkflowNodesDesc: 'Recherchez et accédez aux nœuds du flux de travail actuel par nom ou type', | |||||
| searchApplicationsDesc: 'Recherchez et accédez à vos applications', | |||||
| searchPlugins: 'Plugins de recherche', | |||||
| searchWorkflowNodes: 'Rechercher des nœuds de workflow', | |||||
| searchKnowledgeBases: 'Rechercher dans les bases de connaissances', | |||||
| searchApplications: 'Rechercher des applications', | |||||
| searchWorkflowNodesHelp: 'Cette fonctionnalité ne fonctionne que lors de l’affichage d’un flux de travail. Accédez d’abord à un flux de travail.', | |||||
| }, | |||||
| emptyState: { | |||||
| noKnowledgeBasesFound: 'Aucune base de connaissances trouvée', | |||||
| noAppsFound: 'Aucune application trouvée', | |||||
| noPluginsFound: 'Aucun plugin trouvé', | |||||
| noWorkflowNodesFound: 'Aucun nœud de workflow trouvé', | |||||
| }, | |||||
| groups: { | |||||
| apps: 'Apps', | |||||
| workflowNodes: 'Nœuds de flux de travail', | |||||
| knowledgeBases: 'Bases de connaissances', | |||||
| plugins: 'Plug-ins', | |||||
| }, | |||||
| someServicesUnavailable: 'Certains services de recherche indisponibles', | |||||
| servicesUnavailableMessage: 'Certains services de recherche peuvent rencontrer des problèmes. Réessayez dans un instant.', | |||||
| useAtForSpecific: 'Utilisez @ pour des types spécifiques', | |||||
| searchTemporarilyUnavailable: 'Recherche temporairement indisponible', | |||||
| searchTitle: 'Recherchez n’importe quoi', | |||||
| clearToSearchAll: 'Effacer @ pour rechercher tout', | |||||
| searching: 'Recherche...', | |||||
| searchPlaceholder: 'Recherchez ou tapez @ pour les commandes...', | |||||
| searchFailed: 'Echec de la recherche', | |||||
| noResults: 'Aucun résultat trouvé', | |||||
| }, | |||||
| } | } | ||||
| export default translation | export default translation |
| maxActiveRequests: 'अधिकतम समवर्ती अनुरोध', | maxActiveRequests: 'अधिकतम समवर्ती अनुरोध', | ||||
| maxActiveRequestsPlaceholder: 'असीमित के लिए 0 दर्ज करें', | maxActiveRequestsPlaceholder: 'असीमित के लिए 0 दर्ज करें', | ||||
| maxActiveRequestsTip: 'प्रति ऐप सक्रिय अनुरोधों की अधिकतम संख्या (असीमित के लिए 0)', | maxActiveRequestsTip: 'प्रति ऐप सक्रिय अनुरोधों की अधिकतम संख्या (असीमित के लिए 0)', | ||||
| gotoAnything: { | |||||
| actions: { | |||||
| searchPlugins: 'खोज प्लगइन्स', | |||||
| searchWorkflowNodes: 'खोज कार्यप्रवाह नोड्स', | |||||
| searchKnowledgeBases: 'ज्ञान आधार खोजें', | |||||
| searchApplications: 'अनुसंधान एप्लिकेशन', | |||||
| searchPluginsDesc: 'अपने प्लगइन्स को खोजें और नेविगेट करें', | |||||
| searchWorkflowNodesDesc: 'वर्तमान कार्यप्रवाह में नाम या प्रकार द्वारा नोड्स को खोजें और उन पर कूदें', | |||||
| searchKnowledgeBasesDesc: 'अपने ज्ञान आधारों की खोज करें और उन्हें नेविगेट करें', | |||||
| searchApplicationsDesc: 'अपने अनुप्रयोगों की खोज करें और उन्हें नेविगेट करें', | |||||
| searchWorkflowNodesHelp: 'यह सुविधा केवल तब काम करती है जब आप एक कार्यप्रवाह देख रहे हों। पहले एक कार्यप्रवाह पर जाएं।', | |||||
| }, | |||||
| emptyState: { | |||||
| noPluginsFound: 'कोई प्लगइन नहीं मिले', | |||||
| noAppsFound: 'कोई ऐप्स नहीं मिले', | |||||
| noKnowledgeBasesFound: 'कोई ज्ञान आधार नहीं मिले', | |||||
| noWorkflowNodesFound: 'कोई कार्यप्रवाह नोड नहीं मिला', | |||||
| }, | |||||
| groups: { | |||||
| apps: 'ऐप्स', | |||||
| knowledgeBases: 'ज्ञान आधार', | |||||
| plugins: 'प्लगइन्स', | |||||
| workflowNodes: 'कार्यप्रवाह नोड्स', | |||||
| }, | |||||
| noResults: 'कोई परिणाम नहीं मिले', | |||||
| clearToSearchAll: 'साफ़ @ सभी खोजने के लिए', | |||||
| searchTitle: 'किसी भी चीज़ की खोज करें', | |||||
| useAtForSpecific: '@ का उपयोग विशिष्ट प्रकारों के लिए करें', | |||||
| someServicesUnavailable: 'कुछ खोज सेवाएँ उपलब्ध नहीं हैं', | |||||
| searching: 'खोजना...', | |||||
| searchFailed: 'खोज विफल रहा', | |||||
| searchPlaceholder: 'कमांड के लिए खोजें या टाइप करें @...', | |||||
| searchTemporarilyUnavailable: 'खोज अस्थायी रूप से उपलब्ध नहीं है', | |||||
| servicesUnavailableMessage: 'कुछ खोज सेवाएँ समस्याओं का सामना कर सकती हैं। थोड़ी देर बाद फिर से प्रयास करें।', | |||||
| }, | |||||
| } | } | ||||
| export default translation | export default translation |
| maxActiveRequestsPlaceholder: 'Inserisci 0 per illimitato', | maxActiveRequestsPlaceholder: 'Inserisci 0 per illimitato', | ||||
| maxActiveRequests: 'Massimo numero di richieste concorrenti', | maxActiveRequests: 'Massimo numero di richieste concorrenti', | ||||
| maxActiveRequestsTip: 'Numero massimo di richieste attive concorrenti per app (0 per illimitato)', | maxActiveRequestsTip: 'Numero massimo di richieste attive concorrenti per app (0 per illimitato)', | ||||
| gotoAnything: { | |||||
| actions: { | |||||
| searchWorkflowNodesHelp: 'Questa funzione funziona solo durante la visualizzazione di un flusso di lavoro. Passa prima a un flusso di lavoro.', | |||||
| searchApplicationsDesc: 'Cerca e naviga alle tue applicazioni', | |||||
| searchWorkflowNodes: 'Ricerca nei nodi del flusso di lavoro', | |||||
| searchApplications: 'Cerca applicazioni', | |||||
| searchPluginsDesc: 'Cerca e naviga verso i tuoi plugin', | |||||
| searchKnowledgeBasesDesc: 'Cerca e naviga nelle tue knowledge base', | |||||
| searchPlugins: 'Plugin di ricerca', | |||||
| searchWorkflowNodesDesc: 'Trovare e passare ai nodi nel flusso di lavoro corrente in base al nome o al tipo', | |||||
| searchKnowledgeBases: 'Cerca nelle Basi di Conoscenza', | |||||
| }, | |||||
| emptyState: { | |||||
| noKnowledgeBasesFound: 'Nessuna base di conoscenza trovata', | |||||
| noAppsFound: 'Nessuna app trovata', | |||||
| noWorkflowNodesFound: 'Nessun nodo del flusso di lavoro trovato', | |||||
| noPluginsFound: 'Nessun plugin trovato', | |||||
| }, | |||||
| groups: { | |||||
| knowledgeBases: 'Basi di conoscenza', | |||||
| workflowNodes: 'Nodi del flusso di lavoro', | |||||
| plugins: 'Plugin', | |||||
| apps: 'Applicazioni', | |||||
| }, | |||||
| searchTitle: 'Cerca qualsiasi cosa', | |||||
| searchPlaceholder: 'Cerca o digita @ per i comandi...', | |||||
| searching: 'Indagatore...', | |||||
| searchTemporarilyUnavailable: 'Ricerca temporaneamente non disponibile', | |||||
| searchFailed: 'Ricerca non riuscita', | |||||
| servicesUnavailableMessage: 'Alcuni servizi di ricerca potrebbero riscontrare problemi. Riprova tra un attimo.', | |||||
| someServicesUnavailable: 'Alcuni servizi di ricerca non sono disponibili', | |||||
| noResults: 'Nessun risultato trovato', | |||||
| useAtForSpecific: 'Utilizzare @ per tipi specifici', | |||||
| clearToSearchAll: 'Cancella @ per cercare tutto', | |||||
| }, | |||||
| } | } | ||||
| export default translation | export default translation |
| maxActiveRequestsPlaceholder: '無制限のために0を入力してください', | maxActiveRequestsPlaceholder: '無制限のために0を入力してください', | ||||
| maxActiveRequests: '最大同時リクエスト数', | maxActiveRequests: '最大同時リクエスト数', | ||||
| maxActiveRequestsTip: 'アプリごとの同時アクティブリクエストの最大数(無制限の場合は0)', | maxActiveRequestsTip: 'アプリごとの同時アクティブリクエストの最大数(無制限の場合は0)', | ||||
| gotoAnything: { | |||||
| searchPlaceholder: '検索するか、@ を入力してコマンドを使用...', | |||||
| searchTitle: '何でも検索', | |||||
| searching: '検索中...', | |||||
| noResults: '結果が見つかりません', | |||||
| searchFailed: '検索に失敗しました', | |||||
| searchTemporarilyUnavailable: '検索が一時的に利用できません', | |||||
| servicesUnavailableMessage: '一部の検索サービスで問題が発生している可能性があります。しばらくしてからもう一度お試しください。', | |||||
| someServicesUnavailable: '一部の検索サービスが利用できません', | |||||
| resultCount: '{{count}} 件の結果', | |||||
| resultCount_other: '{{count}} 件の結果', | |||||
| inScope: '{{scope}}s 内', | |||||
| clearToSearchAll: '@ をクリアしてすべてを検索', | |||||
| useAtForSpecific: '特定のタイプには @ を使用', | |||||
| actions: { | |||||
| searchApplications: 'アプリケーションを検索', | |||||
| searchApplicationsDesc: 'アプリケーションを検索してナビゲート', | |||||
| searchPlugins: 'プラグインを検索', | |||||
| searchPluginsDesc: 'プラグインを検索してナビゲート', | |||||
| searchKnowledgeBases: 'ナレッジベースを検索', | |||||
| searchKnowledgeBasesDesc: 'ナレッジベースを検索してナビゲート', | |||||
| searchWorkflowNodes: 'ワークフローノードを検索', | |||||
| searchWorkflowNodesDesc: '現在のワークフロー内のノードを名前またはタイプで検索してジャンプ', | |||||
| searchWorkflowNodesHelp: 'この機能はワークフロー表示時のみ利用できます。まずワークフローに移動してください。', | |||||
| }, | |||||
| emptyState: { | |||||
| noAppsFound: 'アプリが見つかりません', | |||||
| noPluginsFound: 'プラグインが見つかりません', | |||||
| noKnowledgeBasesFound: 'ナレッジベースが見つかりません', | |||||
| noWorkflowNodesFound: 'ワークフローノードが見つかりません', | |||||
| tryDifferentTerm: '別の検索語句を試すか、{{mode}} フィルターを削除してください', | |||||
| trySpecificSearch: '特定検索には {{shortcuts}} を試してください', | |||||
| }, | |||||
| groups: { | |||||
| apps: 'アプリケーション', | |||||
| plugins: 'プラグイン', | |||||
| knowledgeBases: 'ナレッジベース', | |||||
| workflowNodes: 'ワークフローノード', | |||||
| }, | |||||
| }, | |||||
| } | } | ||||
| export default translation | export default translation |
| maxActiveRequests: '동시 최대 요청 수', | maxActiveRequests: '동시 최대 요청 수', | ||||
| maxActiveRequestsPlaceholder: '무제한 사용을 원하시면 0을 입력하세요.', | maxActiveRequestsPlaceholder: '무제한 사용을 원하시면 0을 입력하세요.', | ||||
| maxActiveRequestsTip: '앱당 최대 동시 활성 요청 수(무제한은 0)', | maxActiveRequestsTip: '앱당 최대 동시 활성 요청 수(무제한은 0)', | ||||
| gotoAnything: { | |||||
| actions: { | |||||
| searchWorkflowNodes: '워크플로 노드 검색', | |||||
| searchApplicationsDesc: '애플리케이션 검색 및 탐색', | |||||
| searchPlugins: '플러그인 검색', | |||||
| searchApplications: '응용 프로그램 검색', | |||||
| searchPluginsDesc: '플러그인을 검색하고 탐색합니다.', | |||||
| searchWorkflowNodesDesc: '이름 또는 유형별로 현재 워크플로의 노드를 찾아 이동', | |||||
| searchKnowledgeBasesDesc: '기술 자료를 검색하고 탐색합니다.', | |||||
| searchWorkflowNodesHelp: '이 기능은 워크플로를 볼 때만 작동합니다. 먼저 워크플로로 이동합니다.', | |||||
| searchKnowledgeBases: '기술 자료 검색', | |||||
| }, | |||||
| emptyState: { | |||||
| noAppsFound: '앱을 찾을 수 없습니다.', | |||||
| noPluginsFound: '플러그인을 찾을 수 없습니다.', | |||||
| noKnowledgeBasesFound: '기술 자료를 찾을 수 없습니다.', | |||||
| noWorkflowNodesFound: '워크플로 노드를 찾을 수 없습니다.', | |||||
| }, | |||||
| groups: { | |||||
| apps: '앱', | |||||
| plugins: '플러그인', | |||||
| knowledgeBases: '기술 자료', | |||||
| workflowNodes: '워크플로 노드', | |||||
| }, | |||||
| searching: '검색...', | |||||
| searchTitle: '무엇이든 검색', | |||||
| useAtForSpecific: '특정 형식에 @ 사용', | |||||
| searchTemporarilyUnavailable: '일시적으로 검색할 수 없음', | |||||
| noResults: '결과를 찾을 수 없습니다.', | |||||
| someServicesUnavailable: '일부 검색 서비스를 사용할 수 없습니다.', | |||||
| servicesUnavailableMessage: '일부 검색 서비스에서 문제가 발생할 수 있습니다. 잠시 후에 다시 시도하십시오.', | |||||
| searchFailed: '검색 실패', | |||||
| searchPlaceholder: '명령을 검색하거나 @를 입력합니다...', | |||||
| clearToSearchAll: '@를 지우면 모두 검색됩니다.', | |||||
| }, | |||||
| } | } | ||||
| export default translation | export default translation |
| maxActiveRequests: 'Maksymalne równoczesne żądania', | maxActiveRequests: 'Maksymalne równoczesne żądania', | ||||
| maxActiveRequestsPlaceholder: 'Wprowadź 0, aby uzyskać nielimitowane', | maxActiveRequestsPlaceholder: 'Wprowadź 0, aby uzyskać nielimitowane', | ||||
| maxActiveRequestsTip: 'Maksymalna liczba jednoczesnych aktywnych żądań na aplikację (0 dla nieograniczonej)', | maxActiveRequestsTip: 'Maksymalna liczba jednoczesnych aktywnych żądań na aplikację (0 dla nieograniczonej)', | ||||
| gotoAnything: { | |||||
| actions: { | |||||
| searchPlugins: 'Szukaj wtyczek', | |||||
| searchWorkflowNodesHelp: 'Ta funkcja działa tylko podczas wyświetlania przepływu pracy. Najpierw przejdź do przepływu pracy.', | |||||
| searchApplicationsDesc: 'Wyszukiwanie aplikacji i przechodzenie do nich', | |||||
| searchPluginsDesc: 'Wyszukiwanie i przechodzenie do wtyczek', | |||||
| searchApplications: 'Szukaj aplikacji', | |||||
| searchKnowledgeBasesDesc: 'Wyszukiwanie i przechodzenie do baz wiedzy', | |||||
| searchWorkflowNodesDesc: 'Znajdowanie węzłów w bieżącym przepływie pracy i przechodzenie do nich według nazwy lub typu', | |||||
| searchKnowledgeBases: 'Szukaj w bazach wiedzy', | |||||
| searchWorkflowNodes: 'Wyszukiwanie węzłów przepływu pracy', | |||||
| }, | |||||
| emptyState: { | |||||
| noAppsFound: 'Nie znaleziono aplikacji', | |||||
| noKnowledgeBasesFound: 'Nie znaleziono baz wiedzy', | |||||
| noWorkflowNodesFound: 'Nie znaleziono węzłów przepływu pracy', | |||||
| noPluginsFound: 'Nie znaleziono wtyczek', | |||||
| }, | |||||
| groups: { | |||||
| apps: 'Aplikacje', | |||||
| workflowNodes: 'Węzły przepływu pracy', | |||||
| knowledgeBases: 'Bazy wiedzy', | |||||
| plugins: 'Wtyczki', | |||||
| }, | |||||
| useAtForSpecific: 'Użyj @ dla określonych typów', | |||||
| searchPlaceholder: 'Wyszukaj lub wpisz @ dla poleceń...', | |||||
| searching: 'Wyszukiwanie...', | |||||
| noResults: 'Nie znaleziono wyników', | |||||
| searchTitle: 'Szukaj czegokolwiek', | |||||
| someServicesUnavailable: 'Niektóre usługi wyszukiwania są niedostępne', | |||||
| clearToSearchAll: 'Wyczyść @, aby przeszukać wszystko', | |||||
| searchTemporarilyUnavailable: 'Wyszukiwanie chwilowo niedostępne', | |||||
| servicesUnavailableMessage: 'W przypadku niektórych usług wyszukiwania mogą występować problemy. Spróbuj ponownie za chwilę.', | |||||
| searchFailed: 'Wyszukiwanie nie powiodło się', | |||||
| }, | |||||
| } | } | ||||
| export default translation | export default translation |
| maxActiveRequestsPlaceholder: 'Digite 0 para ilimitado', | maxActiveRequestsPlaceholder: 'Digite 0 para ilimitado', | ||||
| maxActiveRequests: 'Máximo de solicitações simultâneas', | maxActiveRequests: 'Máximo de solicitações simultâneas', | ||||
| maxActiveRequestsTip: 'Número máximo de solicitações ativas simultâneas por aplicativo (0 para ilimitado)', | maxActiveRequestsTip: 'Número máximo de solicitações ativas simultâneas por aplicativo (0 para ilimitado)', | ||||
| gotoAnything: { | |||||
| actions: { | |||||
| searchPlugins: 'Pesquisar Plugins', | |||||
| searchApplicationsDesc: 'Pesquise e navegue até seus aplicativos', | |||||
| searchPluginsDesc: 'Pesquise e navegue até seus plug-ins', | |||||
| searchKnowledgeBases: 'Pesquisar bases de conhecimento', | |||||
| searchApplications: 'Aplicativos de pesquisa', | |||||
| searchWorkflowNodesDesc: 'Localizar e ir para nós no fluxo de trabalho atual por nome ou tipo', | |||||
| searchWorkflowNodesHelp: 'Esse recurso só funciona ao visualizar um fluxo de trabalho. Navegue até um fluxo de trabalho primeiro.', | |||||
| searchKnowledgeBasesDesc: 'Pesquise e navegue até suas bases de conhecimento', | |||||
| searchWorkflowNodes: 'Nós de fluxo de trabalho de pesquisa', | |||||
| }, | |||||
| emptyState: { | |||||
| noAppsFound: 'Nenhum aplicativo encontrado', | |||||
| noPluginsFound: 'Nenhum plugin encontrado', | |||||
| noWorkflowNodesFound: 'Nenhum nó de fluxo de trabalho encontrado', | |||||
| noKnowledgeBasesFound: 'Nenhuma base de conhecimento encontrada', | |||||
| }, | |||||
| groups: { | |||||
| apps: 'Apps', | |||||
| knowledgeBases: 'Bases de conhecimento', | |||||
| plugins: 'Plugins', | |||||
| workflowNodes: 'Nós de fluxo de trabalho', | |||||
| }, | |||||
| searching: 'Procurando...', | |||||
| searchTitle: 'Pesquisar qualquer coisa', | |||||
| someServicesUnavailable: 'Alguns serviços de pesquisa indisponíveis', | |||||
| searchTemporarilyUnavailable: 'Pesquisa temporariamente indisponível', | |||||
| servicesUnavailableMessage: 'Alguns serviços de pesquisa podem estar enfrentando problemas. Tente novamente em um momento.', | |||||
| searchPlaceholder: 'Pesquise ou digite @ para comandos...', | |||||
| noResults: 'Nenhum resultado encontrado', | |||||
| useAtForSpecific: 'Use @ para tipos específicos', | |||||
| clearToSearchAll: 'Desmarque @ para pesquisar tudo', | |||||
| searchFailed: 'Falha na pesquisa', | |||||
| }, | |||||
| } | } | ||||
| export default translation | export default translation |
| maxActiveRequestsPlaceholder: 'Introduceți 0 pentru nelimitat', | maxActiveRequestsPlaceholder: 'Introduceți 0 pentru nelimitat', | ||||
| maxActiveRequests: 'Maxime cereri simultane', | maxActiveRequests: 'Maxime cereri simultane', | ||||
| maxActiveRequestsTip: 'Numărul maxim de cereri active concurente pe aplicație (0 pentru nelimitat)', | maxActiveRequestsTip: 'Numărul maxim de cereri active concurente pe aplicație (0 pentru nelimitat)', | ||||
| gotoAnything: { | |||||
| actions: { | |||||
| searchKnowledgeBasesDesc: 'Căutați și navigați la bazele de cunoștințe', | |||||
| searchWorkflowNodes: 'Căutare în noduri de flux de lucru', | |||||
| searchKnowledgeBases: 'Căutare în baze de cunoștințe', | |||||
| searchApplicationsDesc: 'Căutați și navigați la aplicațiile dvs.', | |||||
| searchApplications: 'Căutare aplicații', | |||||
| searchPluginsDesc: 'Căutați și navigați la plugin-urile dvs.', | |||||
| searchWorkflowNodesDesc: 'Găsiți și treceți la nodurile din fluxul de lucru curent după nume sau tip', | |||||
| searchWorkflowNodesHelp: 'Această caracteristică funcționează numai atunci când vizualizați un flux de lucru. Navigați mai întâi la un flux de lucru.', | |||||
| searchPlugins: 'Căutare plugin-uri', | |||||
| }, | |||||
| emptyState: { | |||||
| noAppsFound: 'Nu s-au găsit aplicații', | |||||
| noPluginsFound: 'Nu au fost găsite plugin-uri', | |||||
| noWorkflowNodesFound: 'Nu au fost găsite noduri de flux de lucru', | |||||
| noKnowledgeBasesFound: 'Nu au fost găsite baze de cunoștințe', | |||||
| }, | |||||
| groups: { | |||||
| knowledgeBases: 'Baze de cunoștințe', | |||||
| workflowNodes: 'Noduri de flux de lucru', | |||||
| plugins: 'Pluginuri', | |||||
| apps: 'Aplicații', | |||||
| }, | |||||
| useAtForSpecific: 'Utilizați @ pentru anumite tipuri', | |||||
| searchTemporarilyUnavailable: 'Căutare temporar indisponibilă', | |||||
| searchPlaceholder: 'Căutați sau tastați @ pentru comenzi...', | |||||
| searchTitle: 'Căutați orice', | |||||
| searching: 'Căutarea...', | |||||
| noResults: 'Nu s-au găsit rezultate', | |||||
| searchFailed: 'Căutarea a eșuat', | |||||
| servicesUnavailableMessage: 'Este posibil ca unele servicii de căutare să întâmpine probleme. Încercați din nou într-o clipă.', | |||||
| someServicesUnavailable: 'Unele servicii de căutare nu sunt disponibile', | |||||
| clearToSearchAll: 'Ștergeți @ pentru a căuta toate', | |||||
| }, | |||||
| } | } | ||||
| export default translation | export default translation |
| maxActiveRequests: 'Максимальное количество параллельных запросов', | maxActiveRequests: 'Максимальное количество параллельных запросов', | ||||
| maxActiveRequestsPlaceholder: 'Введите 0 для неограниченного количества', | maxActiveRequestsPlaceholder: 'Введите 0 для неограниченного количества', | ||||
| maxActiveRequestsTip: 'Максимальное количество одновременно активных запросов на одно приложение (0 для неограниченного количества)', | maxActiveRequestsTip: 'Максимальное количество одновременно активных запросов на одно приложение (0 для неограниченного количества)', | ||||
| gotoAnything: { | |||||
| actions: { | |||||
| searchPlugins: 'Поисковые плагины', | |||||
| searchKnowledgeBases: 'Поиск в базах знаний', | |||||
| searchApplications: 'Поиск приложений', | |||||
| searchKnowledgeBasesDesc: 'Поиск и переход к базам знаний', | |||||
| searchPluginsDesc: 'Поиск и переход к вашим плагинам', | |||||
| searchWorkflowNodes: 'Поиск узлов рабочего процесса', | |||||
| searchApplicationsDesc: 'Поиск и переход к приложениям', | |||||
| searchWorkflowNodesHelp: 'Эта функция работает только при просмотре рабочего процесса. Сначала перейдите к рабочему процессу.', | |||||
| searchWorkflowNodesDesc: 'Поиск узлов в текущем рабочем процессе и переход к ним по имени или типу', | |||||
| }, | |||||
| emptyState: { | |||||
| noPluginsFound: 'Плагины не найдены', | |||||
| noKnowledgeBasesFound: 'Базы знаний не найдены', | |||||
| noAppsFound: 'Приложения не найдены', | |||||
| noWorkflowNodesFound: 'Узлы расчетной схемы не найдены', | |||||
| }, | |||||
| groups: { | |||||
| knowledgeBases: 'Базы знаний', | |||||
| plugins: 'Плагины', | |||||
| apps: 'Приложения', | |||||
| workflowNodes: 'Узлы рабочих процессов', | |||||
| }, | |||||
| searching: 'Поиск...', | |||||
| noResults: 'Ничего не найдено', | |||||
| searchFailed: 'Ошибка поиска', | |||||
| searchTitle: 'Ищите что угодно', | |||||
| useAtForSpecific: 'Используйте @ для определенных типов', | |||||
| clearToSearchAll: 'Очистите @ для поиска по всем', | |||||
| searchTemporarilyUnavailable: 'Поиск временно недоступен', | |||||
| searchPlaceholder: 'Найдите или введите @ для команд...', | |||||
| someServicesUnavailable: 'Некоторые поисковые сервисы недоступны', | |||||
| servicesUnavailableMessage: 'В некоторых поисковых службах могут возникать проблемы. Повторите попытку через мгновение.', | |||||
| }, | |||||
| } | } | ||||
| export default translation | export default translation |
| maxActiveRequestsPlaceholder: 'Vnesite 0 za neomejeno', | maxActiveRequestsPlaceholder: 'Vnesite 0 za neomejeno', | ||||
| maxActiveRequests: 'Maksimalno število hkratnih zahtevkov', | maxActiveRequests: 'Maksimalno število hkratnih zahtevkov', | ||||
| maxActiveRequestsTip: 'Največje število hkrati aktivnih zahtevkov na aplikacijo (0 za neomejeno)', | maxActiveRequestsTip: 'Največje število hkrati aktivnih zahtevkov na aplikacijo (0 za neomejeno)', | ||||
| gotoAnything: { | |||||
| actions: { | |||||
| searchWorkflowNodes: 'Iskanje vozlišč poteka dela', | |||||
| searchKnowledgeBasesDesc: 'Iskanje in krmarjenje do zbirk znanja', | |||||
| searchWorkflowNodesHelp: 'Ta funkcija deluje le pri ogledu poteka dela. Najprej se pomaknite do poteka dela.', | |||||
| searchApplicationsDesc: 'Iskanje in krmarjenje do aplikacij', | |||||
| searchPlugins: 'Iskalni vtičniki', | |||||
| searchApplications: 'Iskanje aplikacij', | |||||
| searchWorkflowNodesDesc: 'Iskanje vozlišč in skok nanje v trenutnem poteku dela po imenu ali vrsti', | |||||
| searchKnowledgeBases: 'Iskanje po zbirkah znanja', | |||||
| searchPluginsDesc: 'Iskanje in krmarjenje do vtičnikov', | |||||
| }, | |||||
| emptyState: { | |||||
| noPluginsFound: 'Vtičnikov ni mogoče najti', | |||||
| noWorkflowNodesFound: 'Vozlišča poteka dela niso bila najdena', | |||||
| noKnowledgeBasesFound: 'Zbirk znanja ni mogoče najti', | |||||
| noAppsFound: 'Ni bilo najdenih aplikacij', | |||||
| }, | |||||
| groups: { | |||||
| workflowNodes: 'Vozlišča poteka dela', | |||||
| apps: 'Apps', | |||||
| knowledgeBases: 'Baze znanja', | |||||
| plugins: 'Vtičniki', | |||||
| }, | |||||
| searching: 'Iskanje...', | |||||
| searchTitle: 'Poiščite karkoli', | |||||
| searchTemporarilyUnavailable: 'Iskanje začasno ni na voljo', | |||||
| someServicesUnavailable: 'Nekatere iskalne storitve niso na voljo', | |||||
| noResults: 'Ni najdenih rezultatov', | |||||
| clearToSearchAll: 'Počisti @ za iskanje vseh', | |||||
| searchPlaceholder: 'Poiščite ali vnesite @ za ukaze ...', | |||||
| searchFailed: 'Iskanje ni uspelo', | |||||
| useAtForSpecific: 'Uporaba znaka @ za določene vrste', | |||||
| servicesUnavailableMessage: 'Pri nekaterih iskalnih storitvah se morda pojavljajo težave. Poskusite znova čez trenutek.', | |||||
| }, | |||||
| } | } | ||||
| export default translation | export default translation |
| maxActiveRequestsPlaceholder: 'ใส่ 0 สำหรับไม่จำกัด', | maxActiveRequestsPlaceholder: 'ใส่ 0 สำหรับไม่จำกัด', | ||||
| maxActiveRequests: 'จำนวนคำขอพร้อมกันสูงสุด', | maxActiveRequests: 'จำนวนคำขอพร้อมกันสูงสุด', | ||||
| maxActiveRequestsTip: 'จำนวนการร้องขอที่ใช้งานพร้อมกันสูงสุดต่อแอป (0 หมายถึงไม่จำกัด)', | maxActiveRequestsTip: 'จำนวนการร้องขอที่ใช้งานพร้อมกันสูงสุดต่อแอป (0 หมายถึงไม่จำกัด)', | ||||
| gotoAnything: { | |||||
| actions: { | |||||
| searchKnowledgeBases: 'ค้นหาฐานความรู้', | |||||
| searchPlugins: 'ค้นหาปลั๊กอิน', | |||||
| searchWorkflowNodes: 'ค้นหาโหนดเวิร์กโฟลว์', | |||||
| searchApplications: 'ค้นหาแอปพลิเคชัน', | |||||
| searchKnowledgeBasesDesc: 'ค้นหาและนําทางไปยังฐานความรู้ของคุณ', | |||||
| searchPluginsDesc: 'ค้นหาและนําทางไปยังปลั๊กอินของคุณ', | |||||
| searchApplicationsDesc: 'ค้นหาและนําทางไปยังแอปพลิเคชันของคุณ', | |||||
| searchWorkflowNodesHelp: 'คุณลักษณะนี้ใช้ได้เฉพาะเมื่อดูเวิร์กโฟลว์เท่านั้น นําทางไปยังเวิร์กโฟลว์ก่อน', | |||||
| searchWorkflowNodesDesc: 'ค้นหาและข้ามไปยังโหนดในเวิร์กโฟลว์ปัจจุบันตามชื่อหรือประเภท', | |||||
| }, | |||||
| emptyState: { | |||||
| noPluginsFound: 'ไม่พบปลั๊กอิน', | |||||
| noAppsFound: 'ไม่พบแอป', | |||||
| noWorkflowNodesFound: 'ไม่พบโหนดเวิร์กโฟลว์', | |||||
| noKnowledgeBasesFound: 'ไม่พบฐานความรู้', | |||||
| }, | |||||
| groups: { | |||||
| apps: 'ปพลิ เค ชัน', | |||||
| knowledgeBases: 'ฐานความรู้', | |||||
| plugins: 'ปลั๊กอิน', | |||||
| workflowNodes: 'โหนดเวิร์กโฟลว์', | |||||
| }, | |||||
| searchTitle: 'ค้นหาอะไรก็ได้', | |||||
| searchFailed: 'การค้นหาล้มเหลว', | |||||
| useAtForSpecific: 'ใช้ @ สําหรับบางประเภท', | |||||
| noResults: 'ไม่พบผลลัพธ์', | |||||
| searchTemporarilyUnavailable: 'การค้นหาไม่พร้อมใช้งานชั่วคราว', | |||||
| someServicesUnavailable: 'บริการค้นหาบางบริการไม่พร้อมใช้งาน', | |||||
| clearToSearchAll: 'ล้าง @ เพื่อค้นหาทั้งหมด', | |||||
| searchPlaceholder: 'ค้นหาหรือพิมพ์ @ สําหรับคําสั่ง...', | |||||
| servicesUnavailableMessage: 'บริการค้นหาบางบริการอาจประสบปัญหา ลองอีกครั้งในอีกสักครู่', | |||||
| }, | |||||
| } | } | ||||
| export default translation | export default translation |
| maxActiveRequestsPlaceholder: 'Sınırsız için 0 girin', | maxActiveRequestsPlaceholder: 'Sınırsız için 0 girin', | ||||
| maxActiveRequests: 'Maksimum eş zamanlı istekler', | maxActiveRequests: 'Maksimum eş zamanlı istekler', | ||||
| maxActiveRequestsTip: 'Her uygulama için maksimum eşzamanlı aktif istek sayısı (sınırsız için 0)', | maxActiveRequestsTip: 'Her uygulama için maksimum eşzamanlı aktif istek sayısı (sınırsız için 0)', | ||||
| gotoAnything: { | |||||
| actions: { | |||||
| searchKnowledgeBasesDesc: 'Bilgi bankalarınızda arama yapın ve bu forumlara gidin', | |||||
| searchWorkflowNodesDesc: 'Geçerli iş akışındaki düğümleri ada veya türe göre bulun ve atlayın', | |||||
| searchApplications: 'Arama Uygulamaları', | |||||
| searchKnowledgeBases: 'Bilgi Bankalarında Ara', | |||||
| searchWorkflowNodes: 'Arama İş Akışı Düğümleri', | |||||
| searchPluginsDesc: 'Eklentilerinizi arayın ve eklentilerinize gidin', | |||||
| searchPlugins: 'Arama Eklentileri', | |||||
| searchWorkflowNodesHelp: 'Bu özellik yalnızca bir iş akışını görüntülerken çalışır. Önce bir iş akışına gidin.', | |||||
| searchApplicationsDesc: 'Uygulamalarınızı arayın ve uygulamalarınıza gidin', | |||||
| }, | |||||
| emptyState: { | |||||
| noAppsFound: 'Uygulama bulunamadı', | |||||
| noWorkflowNodesFound: 'İş akışı düğümü bulunamadı', | |||||
| noKnowledgeBasesFound: 'Bilgi bankası bulunamadı', | |||||
| noPluginsFound: 'Eklenti bulunamadı', | |||||
| }, | |||||
| groups: { | |||||
| apps: 'Apps', | |||||
| plugins: 'Eklentiler', | |||||
| knowledgeBases: 'Bilgi Tabanları', | |||||
| workflowNodes: 'İş Akışı Düğümleri', | |||||
| }, | |||||
| searchFailed: 'Arama başarısız oldu', | |||||
| clearToSearchAll: 'Tümünü aramak için @ işaretini kaldırın', | |||||
| someServicesUnavailable: 'Bazı arama hizmetleri kullanılamıyor', | |||||
| searchPlaceholder: 'Komutlar için @ arayın veya yazın...', | |||||
| useAtForSpecific: 'Belirli türler için @ kullanın', | |||||
| searchTemporarilyUnavailable: 'Arama geçici olarak kullanılamıyor', | |||||
| searchTitle: 'Her şeyi arayın', | |||||
| noResults: 'Sonuç bulunamadı', | |||||
| servicesUnavailableMessage: 'Bazı arama hizmetlerinde sorunlar yaşanıyor olabilir. Kısa bir süre sonra tekrar deneyin.', | |||||
| searching: 'Araştırıcı...', | |||||
| }, | |||||
| } | } | ||||
| export default translation | export default translation |
| maxActiveRequestsPlaceholder: 'Введіть 0 для необмеженого', | maxActiveRequestsPlaceholder: 'Введіть 0 для необмеженого', | ||||
| maxActiveRequests: 'Максимальна кількість одночасних запитів', | maxActiveRequests: 'Максимальна кількість одночасних запитів', | ||||
| maxActiveRequestsTip: 'Максимальна кількість одночасних активних запитів на додаток (0 для необмеженої кількості)', | maxActiveRequestsTip: 'Максимальна кількість одночасних активних запитів на додаток (0 для необмеженої кількості)', | ||||
| gotoAnything: { | |||||
| actions: { | |||||
| searchApplications: 'Пошук додатків', | |||||
| searchKnowledgeBases: 'Пошук по базах знань', | |||||
| searchWorkflowNodes: 'Вузли документообігу пошуку', | |||||
| searchApplicationsDesc: 'Шукайте та переходьте до своїх програм', | |||||
| searchPluginsDesc: 'Пошук і навігація до ваших плагінів', | |||||
| searchWorkflowNodesHelp: 'Ця функція працює лише під час перегляду робочого процесу. Спочатку перейдіть до робочого процесу.', | |||||
| searchPlugins: 'Пошукові плагіни', | |||||
| searchKnowledgeBasesDesc: 'Шукайте та переходьте до своїх баз знань', | |||||
| searchWorkflowNodesDesc: 'Знаходьте вузли в поточному робочому процесі та переходьте до них за іменем або типом', | |||||
| }, | |||||
| emptyState: { | |||||
| noPluginsFound: 'Плагінів не знайдено', | |||||
| noKnowledgeBasesFound: 'Баз знань не знайдено', | |||||
| noAppsFound: 'Не знайдено додатків', | |||||
| noWorkflowNodesFound: 'Вузли бізнес-процесу не знайдено', | |||||
| }, | |||||
| groups: { | |||||
| knowledgeBases: 'Бази знань', | |||||
| plugins: 'Плагіни', | |||||
| apps: 'Програми', | |||||
| workflowNodes: 'Вузли документообігу', | |||||
| }, | |||||
| searching: 'Пошук...', | |||||
| searchTitle: 'Шукайте що завгодно', | |||||
| searchFailed: 'Пошук не вдався', | |||||
| clearToSearchAll: 'Clear @ для пошуку всіх', | |||||
| noResults: 'Результатів не знайдено', | |||||
| searchPlaceholder: 'Виконайте пошук або введіть @ для команд...', | |||||
| searchTemporarilyUnavailable: 'Пошук тимчасово недоступний', | |||||
| useAtForSpecific: 'Використовуйте @ для конкретних типів', | |||||
| someServicesUnavailable: 'Деякі пошукові сервіси недоступні', | |||||
| servicesUnavailableMessage: 'У деяких пошукових службах можуть виникати проблеми. Повторіть спробу за мить.', | |||||
| }, | |||||
| } | } | ||||
| export default translation | export default translation |
| maxActiveRequestsPlaceholder: 'Nhập 0 để không giới hạn', | maxActiveRequestsPlaceholder: 'Nhập 0 để không giới hạn', | ||||
| maxActiveRequests: 'Số yêu cầu đồng thời tối đa', | maxActiveRequests: 'Số yêu cầu đồng thời tối đa', | ||||
| maxActiveRequestsTip: 'Số yêu cầu hoạt động đồng thời tối đa cho mỗi ứng dụng (0 để không giới hạn)', | maxActiveRequestsTip: 'Số yêu cầu hoạt động đồng thời tối đa cho mỗi ứng dụng (0 để không giới hạn)', | ||||
| gotoAnything: { | |||||
| actions: { | |||||
| searchPlugins: 'Tìm kiếm Plugin', | |||||
| searchPluginsDesc: 'Tìm kiếm và điều hướng đến plugin của bạn', | |||||
| searchKnowledgeBases: 'Tìm kiếm cơ sở kiến thức', | |||||
| searchApplicationsDesc: 'Tìm kiếm và điều hướng đến các ứng dụng của bạn', | |||||
| searchWorkflowNodesHelp: 'Tính năng này chỉ hoạt động khi xem quy trình làm việc. Điều hướng đến quy trình làm việc trước.', | |||||
| searchWorkflowNodes: 'Tìm kiếm các nút quy trình làm việc', | |||||
| searchApplications: 'Tìm kiếm ứng dụng', | |||||
| searchWorkflowNodesDesc: 'Tìm và chuyển đến các nút trong quy trình làm việc hiện tại theo tên hoặc loại', | |||||
| searchKnowledgeBasesDesc: 'Tìm kiếm và điều hướng đến cơ sở kiến thức của bạn', | |||||
| }, | |||||
| emptyState: { | |||||
| noWorkflowNodesFound: 'Không tìm thấy nút quy trình làm việc', | |||||
| noKnowledgeBasesFound: 'Không tìm thấy cơ sở kiến thức', | |||||
| noPluginsFound: 'Không tìm thấy plugin', | |||||
| noAppsFound: 'Không tìm thấy ứng dụng nào', | |||||
| }, | |||||
| groups: { | |||||
| plugins: 'Plugin', | |||||
| workflowNodes: 'Nút quy trình làm việc', | |||||
| knowledgeBases: 'Cơ sở kiến thức', | |||||
| apps: 'Ứng dụng', | |||||
| }, | |||||
| searchTemporarilyUnavailable: 'Tìm kiếm tạm thời không khả dụng', | |||||
| clearToSearchAll: 'Xóa @ để tìm kiếm tất cả', | |||||
| noResults: 'Không tìm thấy kết quả', | |||||
| searching: 'Tìm kiếm...', | |||||
| searchPlaceholder: 'Tìm kiếm hoặc nhập @ cho các lệnh...', | |||||
| searchTitle: 'Tìm kiếm bất cứ thứ gì', | |||||
| searchFailed: 'Tìm kiếm không thành công', | |||||
| useAtForSpecific: 'Sử dụng @ cho các loại cụ thể', | |||||
| someServicesUnavailable: 'Một số dịch vụ tìm kiếm không khả dụng', | |||||
| servicesUnavailableMessage: 'Một số dịch vụ tìm kiếm có thể gặp sự cố. Thử lại trong giây lát.', | |||||
| }, | |||||
| } | } | ||||
| export default translation | export default translation |
| maxActiveRequests: '最大活跃请求数', | maxActiveRequests: '最大活跃请求数', | ||||
| maxActiveRequestsPlaceholder: '0 表示不限制', | maxActiveRequestsPlaceholder: '0 表示不限制', | ||||
| maxActiveRequestsTip: '当前应用的最大活跃请求数(0 表示不限制)', | maxActiveRequestsTip: '当前应用的最大活跃请求数(0 表示不限制)', | ||||
| gotoAnything: { | |||||
| searchPlaceholder: '搜索或输入 @ 以使用命令...', | |||||
| searchTitle: '搜索任何内容', | |||||
| searching: '搜索中...', | |||||
| noResults: '未找到结果', | |||||
| searchFailed: '搜索失败', | |||||
| searchTemporarilyUnavailable: '搜索暂时不可用', | |||||
| servicesUnavailableMessage: '某些搜索服务可能遇到问题,请稍后再试。', | |||||
| someServicesUnavailable: '某些搜索服务不可用', | |||||
| resultCount: '{{count}} 个结果', | |||||
| resultCount_other: '{{count}} 个结果', | |||||
| inScope: '在 {{scope}}s 中', | |||||
| clearToSearchAll: '清除 @ 以搜索全部', | |||||
| useAtForSpecific: '使用 @ 进行特定类型搜索', | |||||
| actions: { | |||||
| searchApplications: '搜索应用程序', | |||||
| searchApplicationsDesc: '搜索并导航到您的应用程序', | |||||
| searchPlugins: '搜索插件', | |||||
| searchPluginsDesc: '搜索并导航到您的插件', | |||||
| searchKnowledgeBases: '搜索知识库', | |||||
| searchKnowledgeBasesDesc: '搜索并导航到您的知识库', | |||||
| searchWorkflowNodes: '搜索工作流节点', | |||||
| searchWorkflowNodesDesc: '按名称或类型查找并跳转到当前工作流中的节点', | |||||
| searchWorkflowNodesHelp: '此功能仅在查看工作流时有效。首先导航到工作流。', | |||||
| }, | |||||
| emptyState: { | |||||
| noAppsFound: '未找到应用', | |||||
| noPluginsFound: '未找到插件', | |||||
| noKnowledgeBasesFound: '未找到知识库', | |||||
| noWorkflowNodesFound: '未找到工作流节点', | |||||
| tryDifferentTerm: '尝试不同的搜索词或移除 {{mode}} 过滤器', | |||||
| trySpecificSearch: '尝试使用 {{shortcuts}} 进行特定搜索', | |||||
| }, | |||||
| groups: { | |||||
| apps: '应用程序', | |||||
| plugins: '插件', | |||||
| knowledgeBases: '知识库', | |||||
| workflowNodes: '工作流节点', | |||||
| }, | |||||
| }, | |||||
| } | } | ||||
| export default translation | export default translation |
| settingsTab: '设置', | settingsTab: '设置', | ||||
| lastRunTab: '上次运行', | lastRunTab: '上次运行', | ||||
| relationsTab: '关系', | relationsTab: '关系', | ||||
| copyLastRun: '复制上次运行值', | |||||
| noLastRunFound: '未找到上次运行记录', | |||||
| noMatchingInputsFound: '上次运行中未找到匹配的输入', | |||||
| lastRunInputsCopied: '已复制{{count}}个输入值', | |||||
| copyLastRunError: '复制上次运行输入失败', | |||||
| noData: { | noData: { | ||||
| description: '上次运行的结果将显示在这里', | description: '上次运行的结果将显示在这里', | ||||
| runThisNode: '运行此节点', | runThisNode: '运行此节点', |
| maxActiveRequestsPlaceholder: '輸入 0 以表示無限', | maxActiveRequestsPlaceholder: '輸入 0 以表示無限', | ||||
| maxActiveRequests: '同時最大請求數', | maxActiveRequests: '同時最大請求數', | ||||
| maxActiveRequestsTip: '每個應用程式可同時活躍請求的最大數量(0為無限制)', | maxActiveRequestsTip: '每個應用程式可同時活躍請求的最大數量(0為無限制)', | ||||
| gotoAnything: { | |||||
| actions: { | |||||
| searchWorkflowNodes: '搜索工作流節點', | |||||
| searchPluginsDesc: '搜索並導航到您的外掛程式', | |||||
| searchApplications: '搜索應用程式', | |||||
| searchKnowledgeBases: '搜索知識庫', | |||||
| searchKnowledgeBasesDesc: '搜索並導航到您的知識庫', | |||||
| searchWorkflowNodesHelp: '此功能僅在查看工作流時有效。首先導航到工作流。', | |||||
| searchApplicationsDesc: '搜索並導航到您的應用程式', | |||||
| searchPlugins: '搜索外掛程式', | |||||
| searchWorkflowNodesDesc: '按名稱或類型查找並跳轉到當前工作流中的節點', | |||||
| }, | |||||
| emptyState: { | |||||
| noAppsFound: '未找到應用', | |||||
| noWorkflowNodesFound: '未找到工作流節點', | |||||
| noKnowledgeBasesFound: '未找到知識庫', | |||||
| noPluginsFound: '未找到外掛程式', | |||||
| }, | |||||
| groups: { | |||||
| apps: '應用程式', | |||||
| knowledgeBases: '知識庫', | |||||
| plugins: '外掛程式', | |||||
| workflowNodes: '工作流節點', | |||||
| }, | |||||
| searchPlaceholder: '搜尋或鍵入 @ 以取得命令...', | |||||
| searching: '搜索。。。', | |||||
| searchTitle: '搜索任何內容', | |||||
| noResults: '未找到結果', | |||||
| clearToSearchAll: '清除 @ 以搜尋全部', | |||||
| searchFailed: '搜索失敗', | |||||
| servicesUnavailableMessage: '某些搜索服務可能遇到問題。稍後再試一次。', | |||||
| someServicesUnavailable: '某些搜索服務不可用', | |||||
| useAtForSpecific: '對特定類型使用 @', | |||||
| searchTemporarilyUnavailable: '搜索暫時不可用', | |||||
| }, | |||||
| } | } | ||||
| export default translation | export default translation |
| "class-variance-authority": "^0.7.0", | "class-variance-authority": "^0.7.0", | ||||
| "classnames": "^2.5.1", | "classnames": "^2.5.1", | ||||
| "clsx": "^2.1.1", | "clsx": "^2.1.1", | ||||
| "cmdk": "^1.1.1", | |||||
| "copy-to-clipboard": "^3.3.3", | "copy-to-clipboard": "^3.3.3", | ||||
| "crypto-js": "^4.2.0", | "crypto-js": "^4.2.0", | ||||
| "dayjs": "^1.11.13", | "dayjs": "^1.11.13", |
| clsx: | clsx: | ||||
| specifier: ^2.1.1 | specifier: ^2.1.1 | ||||
| version: 2.1.1 | version: 2.1.1 | ||||
| cmdk: | |||||
| specifier: ^1.1.1 | |||||
| version: 1.1.1(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) | |||||
| copy-to-clipboard: | copy-to-clipboard: | ||||
| specifier: ^3.3.3 | specifier: ^3.3.3 | ||||
| version: 3.3.3 | version: 3.3.3 | ||||
| '@polka/url@1.0.0-next.29': | '@polka/url@1.0.0-next.29': | ||||
| resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} | resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} | ||||
| '@radix-ui/primitive@1.1.2': | |||||
| resolution: {integrity: sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA==} | |||||
| '@radix-ui/react-compose-refs@1.1.2': | |||||
| resolution: {integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==} | |||||
| peerDependencies: | |||||
| '@types/react': ~19.1.8 | |||||
| react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc | |||||
| peerDependenciesMeta: | |||||
| '@types/react': | |||||
| optional: true | |||||
| '@radix-ui/react-context@1.1.2': | |||||
| resolution: {integrity: sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==} | |||||
| peerDependencies: | |||||
| '@types/react': ~19.1.8 | |||||
| react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc | |||||
| peerDependenciesMeta: | |||||
| '@types/react': | |||||
| optional: true | |||||
| '@radix-ui/react-dialog@1.1.14': | |||||
| resolution: {integrity: sha512-+CpweKjqpzTmwRwcYECQcNYbI8V9VSQt0SNFKeEBLgfucbsLssU6Ppq7wUdNXEGb573bMjFhVjKVll8rmV6zMw==} | |||||
| peerDependencies: | |||||
| '@types/react': ~19.1.8 | |||||
| '@types/react-dom': ~19.1.6 | |||||
| react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc | |||||
| react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc | |||||
| peerDependenciesMeta: | |||||
| '@types/react': | |||||
| optional: true | |||||
| '@types/react-dom': | |||||
| optional: true | |||||
| '@radix-ui/react-dismissable-layer@1.1.10': | |||||
| resolution: {integrity: sha512-IM1zzRV4W3HtVgftdQiiOmA0AdJlCtMLe00FXaHwgt3rAnNsIyDqshvkIW3hj/iu5hu8ERP7KIYki6NkqDxAwQ==} | |||||
| peerDependencies: | |||||
| '@types/react': ~19.1.8 | |||||
| '@types/react-dom': ~19.1.6 | |||||
| react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc | |||||
| react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc | |||||
| peerDependenciesMeta: | |||||
| '@types/react': | |||||
| optional: true | |||||
| '@types/react-dom': | |||||
| optional: true | |||||
| '@radix-ui/react-focus-guards@1.1.2': | |||||
| resolution: {integrity: sha512-fyjAACV62oPV925xFCrH8DR5xWhg9KYtJT4s3u54jxp+L/hbpTY2kIeEFFbFe+a/HCE94zGQMZLIpVTPVZDhaA==} | |||||
| peerDependencies: | |||||
| '@types/react': ~19.1.8 | |||||
| react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc | |||||
| peerDependenciesMeta: | |||||
| '@types/react': | |||||
| optional: true | |||||
| '@radix-ui/react-focus-scope@1.1.7': | |||||
| resolution: {integrity: sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==} | |||||
| peerDependencies: | |||||
| '@types/react': ~19.1.8 | |||||
| '@types/react-dom': ~19.1.6 | |||||
| react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc | |||||
| react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc | |||||
| peerDependenciesMeta: | |||||
| '@types/react': | |||||
| optional: true | |||||
| '@types/react-dom': | |||||
| optional: true | |||||
| '@radix-ui/react-id@1.1.1': | |||||
| resolution: {integrity: sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==} | |||||
| peerDependencies: | |||||
| '@types/react': ~19.1.8 | |||||
| react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc | |||||
| peerDependenciesMeta: | |||||
| '@types/react': | |||||
| optional: true | |||||
| '@radix-ui/react-portal@1.1.9': | |||||
| resolution: {integrity: sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==} | |||||
| peerDependencies: | |||||
| '@types/react': ~19.1.8 | |||||
| '@types/react-dom': ~19.1.6 | |||||
| react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc | |||||
| react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc | |||||
| peerDependenciesMeta: | |||||
| '@types/react': | |||||
| optional: true | |||||
| '@types/react-dom': | |||||
| optional: true | |||||
| '@radix-ui/react-presence@1.1.4': | |||||
| resolution: {integrity: sha512-ueDqRbdc4/bkaQT3GIpLQssRlFgWaL/U2z/S31qRwwLWoxHLgry3SIfCwhxeQNbirEUXFa+lq3RL3oBYXtcmIA==} | |||||
| peerDependencies: | |||||
| '@types/react': ~19.1.8 | |||||
| '@types/react-dom': ~19.1.6 | |||||
| react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc | |||||
| react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc | |||||
| peerDependenciesMeta: | |||||
| '@types/react': | |||||
| optional: true | |||||
| '@types/react-dom': | |||||
| optional: true | |||||
| '@radix-ui/react-primitive@2.1.3': | |||||
| resolution: {integrity: sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==} | |||||
| peerDependencies: | |||||
| '@types/react': ~19.1.8 | |||||
| '@types/react-dom': ~19.1.6 | |||||
| react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc | |||||
| react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc | |||||
| peerDependenciesMeta: | |||||
| '@types/react': | |||||
| optional: true | |||||
| '@types/react-dom': | |||||
| optional: true | |||||
| '@radix-ui/react-slot@1.2.3': | |||||
| resolution: {integrity: sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==} | |||||
| peerDependencies: | |||||
| '@types/react': ~19.1.8 | |||||
| react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc | |||||
| peerDependenciesMeta: | |||||
| '@types/react': | |||||
| optional: true | |||||
| '@radix-ui/react-use-callback-ref@1.1.1': | |||||
| resolution: {integrity: sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==} | |||||
| peerDependencies: | |||||
| '@types/react': ~19.1.8 | |||||
| react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc | |||||
| peerDependenciesMeta: | |||||
| '@types/react': | |||||
| optional: true | |||||
| '@radix-ui/react-use-controllable-state@1.2.2': | |||||
| resolution: {integrity: sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==} | |||||
| peerDependencies: | |||||
| '@types/react': ~19.1.8 | |||||
| react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc | |||||
| peerDependenciesMeta: | |||||
| '@types/react': | |||||
| optional: true | |||||
| '@radix-ui/react-use-effect-event@0.0.2': | |||||
| resolution: {integrity: sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==} | |||||
| peerDependencies: | |||||
| '@types/react': ~19.1.8 | |||||
| react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc | |||||
| peerDependenciesMeta: | |||||
| '@types/react': | |||||
| optional: true | |||||
| '@radix-ui/react-use-escape-keydown@1.1.1': | |||||
| resolution: {integrity: sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==} | |||||
| peerDependencies: | |||||
| '@types/react': ~19.1.8 | |||||
| react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc | |||||
| peerDependenciesMeta: | |||||
| '@types/react': | |||||
| optional: true | |||||
| '@radix-ui/react-use-layout-effect@1.1.1': | |||||
| resolution: {integrity: sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==} | |||||
| peerDependencies: | |||||
| '@types/react': ~19.1.8 | |||||
| react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc | |||||
| peerDependenciesMeta: | |||||
| '@types/react': | |||||
| optional: true | |||||
| '@react-aria/focus@3.20.5': | '@react-aria/focus@3.20.5': | ||||
| resolution: {integrity: sha512-JpFtXmWQ0Oca7FcvkqgjSyo6xEP7v3oQOLUId6o0xTvm4AD5W0mU2r3lYrbhsJ+XxdUUX4AVR5473sZZ85kU4A==} | resolution: {integrity: sha512-JpFtXmWQ0Oca7FcvkqgjSyo6xEP7v3oQOLUId6o0xTvm4AD5W0mU2r3lYrbhsJ+XxdUUX4AVR5473sZZ85kU4A==} | ||||
| peerDependencies: | peerDependencies: | ||||
| argparse@2.0.1: | argparse@2.0.1: | ||||
| resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} | ||||
| aria-hidden@1.2.6: | |||||
| resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==} | |||||
| engines: {node: '>=10'} | |||||
| aria-query@5.3.0: | aria-query@5.3.0: | ||||
| resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} | resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} | ||||
| resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} | resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} | ||||
| engines: {node: '>=6'} | engines: {node: '>=6'} | ||||
| cmdk@1.1.1: | |||||
| resolution: {integrity: sha512-Vsv7kFaXm+ptHDMZ7izaRsP70GgrW9NBNGswt9OZaVBLlE0SNpDq8eu/VGXyF9r7M0azK3Wy7OlYXsuyYLFzHg==} | |||||
| peerDependencies: | |||||
| react: ^18 || ^19 || ^19.0.0-rc | |||||
| react-dom: ^18 || ^19 || ^19.0.0-rc | |||||
| co@4.6.0: | co@4.6.0: | ||||
| resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} | resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} | ||||
| engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} | engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} | ||||
| resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} | resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} | ||||
| engines: {node: '>=8'} | engines: {node: '>=8'} | ||||
| detect-node-es@1.1.0: | |||||
| resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} | |||||
| devalue@5.1.1: | devalue@5.1.1: | ||||
| resolution: {integrity: sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw==} | resolution: {integrity: sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw==} | ||||
| resolution: {integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==} | resolution: {integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==} | ||||
| engines: {node: '>=18'} | engines: {node: '>=18'} | ||||
| get-nonce@1.0.1: | |||||
| resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} | |||||
| engines: {node: '>=6'} | |||||
| get-package-type@0.1.0: | get-package-type@0.1.0: | ||||
| resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} | resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} | ||||
| engines: {node: '>=8.0.0'} | engines: {node: '>=8.0.0'} | ||||
| resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} | resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} | ||||
| engines: {node: '>=0.10.0'} | engines: {node: '>=0.10.0'} | ||||
| react-remove-scroll-bar@2.3.8: | |||||
| resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} | |||||
| engines: {node: '>=10'} | |||||
| peerDependencies: | |||||
| '@types/react': ~19.1.8 | |||||
| react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 | |||||
| peerDependenciesMeta: | |||||
| '@types/react': | |||||
| optional: true | |||||
| react-remove-scroll@2.7.1: | |||||
| resolution: {integrity: sha512-HpMh8+oahmIdOuS5aFKKY6Pyog+FNaZV/XyJOq7b4YFwsFHe5yYfdbIalI4k3vU2nSDql7YskmUseHsRrJqIPA==} | |||||
| engines: {node: '>=10'} | |||||
| peerDependencies: | |||||
| '@types/react': ~19.1.8 | |||||
| react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc | |||||
| peerDependenciesMeta: | |||||
| '@types/react': | |||||
| optional: true | |||||
| react-rnd@10.5.2: | react-rnd@10.5.2: | ||||
| resolution: {integrity: sha512-0Tm4x7k7pfHf2snewJA8x7Nwgt3LV+58MVEWOVsFjk51eYruFEa6Wy7BNdxt4/lH0wIRsu7Gm3KjSXY2w7YaNw==} | resolution: {integrity: sha512-0Tm4x7k7pfHf2snewJA8x7Nwgt3LV+58MVEWOVsFjk51eYruFEa6Wy7BNdxt4/lH0wIRsu7Gm3KjSXY2w7YaNw==} | ||||
| peerDependencies: | peerDependencies: | ||||
| react-dom: '>=16.9.0' | react-dom: '>=16.9.0' | ||||
| sortablejs: '1' | sortablejs: '1' | ||||
| react-style-singleton@2.2.3: | |||||
| resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==} | |||||
| engines: {node: '>=10'} | |||||
| peerDependencies: | |||||
| '@types/react': ~19.1.8 | |||||
| react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc | |||||
| peerDependenciesMeta: | |||||
| '@types/react': | |||||
| optional: true | |||||
| react-syntax-highlighter@15.6.1: | react-syntax-highlighter@15.6.1: | ||||
| resolution: {integrity: sha512-OqJ2/vL7lEeV5zTJyG7kmARppUjiB9h9udl4qHQjjgEos66z00Ia0OckwYfRxCSFrW8RJIBnsBwQsHZbVPspqg==} | resolution: {integrity: sha512-OqJ2/vL7lEeV5zTJyG7kmARppUjiB9h9udl4qHQjjgEos66z00Ia0OckwYfRxCSFrW8RJIBnsBwQsHZbVPspqg==} | ||||
| peerDependencies: | peerDependencies: | ||||
| resolution: {integrity: sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==} | resolution: {integrity: sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==} | ||||
| engines: {node: '>= 0.4'} | engines: {node: '>= 0.4'} | ||||
| use-callback-ref@1.3.3: | |||||
| resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} | |||||
| engines: {node: '>=10'} | |||||
| peerDependencies: | |||||
| '@types/react': ~19.1.8 | |||||
| react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc | |||||
| peerDependenciesMeta: | |||||
| '@types/react': | |||||
| optional: true | |||||
| use-composed-ref@1.4.0: | use-composed-ref@1.4.0: | ||||
| resolution: {integrity: sha512-djviaxuOOh7wkj0paeO1Q/4wMZ8Zrnag5H6yBvzN7AKKe8beOaED9SF5/ByLqsku8NP4zQqsvM2u3ew/tJK8/w==} | resolution: {integrity: sha512-djviaxuOOh7wkj0paeO1Q/4wMZ8Zrnag5H6yBvzN7AKKe8beOaED9SF5/ByLqsku8NP4zQqsvM2u3ew/tJK8/w==} | ||||
| peerDependencies: | peerDependencies: | ||||
| '@types/react': | '@types/react': | ||||
| optional: true | optional: true | ||||
| use-sidecar@1.1.3: | |||||
| resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} | |||||
| engines: {node: '>=10'} | |||||
| peerDependencies: | |||||
| '@types/react': ~19.1.8 | |||||
| react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc | |||||
| peerDependenciesMeta: | |||||
| '@types/react': | |||||
| optional: true | |||||
| use-strict@1.0.1: | use-strict@1.0.1: | ||||
| resolution: {integrity: sha512-IeiWvvEXfW5ltKVMkxq6FvNf2LojMKvB2OCeja6+ct24S1XOmQw2dGr2JyndwACWAGJva9B7yPHwAmeA9QCqAQ==} | resolution: {integrity: sha512-IeiWvvEXfW5ltKVMkxq6FvNf2LojMKvB2OCeja6+ct24S1XOmQw2dGr2JyndwACWAGJva9B7yPHwAmeA9QCqAQ==} | ||||
| '@polka/url@1.0.0-next.29': {} | '@polka/url@1.0.0-next.29': {} | ||||
| '@radix-ui/primitive@1.1.2': {} | |||||
| '@radix-ui/react-compose-refs@1.1.2(@types/react@19.1.8)(react@19.1.0)': | |||||
| dependencies: | |||||
| react: 19.1.0 | |||||
| optionalDependencies: | |||||
| '@types/react': 19.1.8 | |||||
| '@radix-ui/react-context@1.1.2(@types/react@19.1.8)(react@19.1.0)': | |||||
| dependencies: | |||||
| react: 19.1.0 | |||||
| optionalDependencies: | |||||
| '@types/react': 19.1.8 | |||||
| '@radix-ui/react-dialog@1.1.14(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': | |||||
| dependencies: | |||||
| '@radix-ui/primitive': 1.1.2 | |||||
| '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.8)(react@19.1.0) | |||||
| '@radix-ui/react-context': 1.1.2(@types/react@19.1.8)(react@19.1.0) | |||||
| '@radix-ui/react-dismissable-layer': 1.1.10(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) | |||||
| '@radix-ui/react-focus-guards': 1.1.2(@types/react@19.1.8)(react@19.1.0) | |||||
| '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) | |||||
| '@radix-ui/react-id': 1.1.1(@types/react@19.1.8)(react@19.1.0) | |||||
| '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) | |||||
| '@radix-ui/react-presence': 1.1.4(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) | |||||
| '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) | |||||
| '@radix-ui/react-slot': 1.2.3(@types/react@19.1.8)(react@19.1.0) | |||||
| '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.8)(react@19.1.0) | |||||
| aria-hidden: 1.2.6 | |||||
| react: 19.1.0 | |||||
| react-dom: 19.1.0(react@19.1.0) | |||||
| react-remove-scroll: 2.7.1(@types/react@19.1.8)(react@19.1.0) | |||||
| optionalDependencies: | |||||
| '@types/react': 19.1.8 | |||||
| '@types/react-dom': 19.1.6(@types/react@19.1.8) | |||||
| '@radix-ui/react-dismissable-layer@1.1.10(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': | |||||
| dependencies: | |||||
| '@radix-ui/primitive': 1.1.2 | |||||
| '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.8)(react@19.1.0) | |||||
| '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) | |||||
| '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.8)(react@19.1.0) | |||||
| '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.1.8)(react@19.1.0) | |||||
| react: 19.1.0 | |||||
| react-dom: 19.1.0(react@19.1.0) | |||||
| optionalDependencies: | |||||
| '@types/react': 19.1.8 | |||||
| '@types/react-dom': 19.1.6(@types/react@19.1.8) | |||||
| '@radix-ui/react-focus-guards@1.1.2(@types/react@19.1.8)(react@19.1.0)': | |||||
| dependencies: | |||||
| react: 19.1.0 | |||||
| optionalDependencies: | |||||
| '@types/react': 19.1.8 | |||||
| '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': | |||||
| dependencies: | |||||
| '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.8)(react@19.1.0) | |||||
| '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) | |||||
| '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.8)(react@19.1.0) | |||||
| react: 19.1.0 | |||||
| react-dom: 19.1.0(react@19.1.0) | |||||
| optionalDependencies: | |||||
| '@types/react': 19.1.8 | |||||
| '@types/react-dom': 19.1.6(@types/react@19.1.8) | |||||
| '@radix-ui/react-id@1.1.1(@types/react@19.1.8)(react@19.1.0)': | |||||
| dependencies: | |||||
| '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.8)(react@19.1.0) | |||||
| react: 19.1.0 | |||||
| optionalDependencies: | |||||
| '@types/react': 19.1.8 | |||||
| '@radix-ui/react-portal@1.1.9(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': | |||||
| dependencies: | |||||
| '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) | |||||
| '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.8)(react@19.1.0) | |||||
| react: 19.1.0 | |||||
| react-dom: 19.1.0(react@19.1.0) | |||||
| optionalDependencies: | |||||
| '@types/react': 19.1.8 | |||||
| '@types/react-dom': 19.1.6(@types/react@19.1.8) | |||||
| '@radix-ui/react-presence@1.1.4(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': | |||||
| dependencies: | |||||
| '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.8)(react@19.1.0) | |||||
| '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.8)(react@19.1.0) | |||||
| react: 19.1.0 | |||||
| react-dom: 19.1.0(react@19.1.0) | |||||
| optionalDependencies: | |||||
| '@types/react': 19.1.8 | |||||
| '@types/react-dom': 19.1.6(@types/react@19.1.8) | |||||
| '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': | |||||
| dependencies: | |||||
| '@radix-ui/react-slot': 1.2.3(@types/react@19.1.8)(react@19.1.0) | |||||
| react: 19.1.0 | |||||
| react-dom: 19.1.0(react@19.1.0) | |||||
| optionalDependencies: | |||||
| '@types/react': 19.1.8 | |||||
| '@types/react-dom': 19.1.6(@types/react@19.1.8) | |||||
| '@radix-ui/react-slot@1.2.3(@types/react@19.1.8)(react@19.1.0)': | |||||
| dependencies: | |||||
| '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.8)(react@19.1.0) | |||||
| react: 19.1.0 | |||||
| optionalDependencies: | |||||
| '@types/react': 19.1.8 | |||||
| '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.1.8)(react@19.1.0)': | |||||
| dependencies: | |||||
| react: 19.1.0 | |||||
| optionalDependencies: | |||||
| '@types/react': 19.1.8 | |||||
| '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.1.8)(react@19.1.0)': | |||||
| dependencies: | |||||
| '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.1.8)(react@19.1.0) | |||||
| '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.8)(react@19.1.0) | |||||
| react: 19.1.0 | |||||
| optionalDependencies: | |||||
| '@types/react': 19.1.8 | |||||
| '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.1.8)(react@19.1.0)': | |||||
| dependencies: | |||||
| '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.8)(react@19.1.0) | |||||
| react: 19.1.0 | |||||
| optionalDependencies: | |||||
| '@types/react': 19.1.8 | |||||
| '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.1.8)(react@19.1.0)': | |||||
| dependencies: | |||||
| '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.8)(react@19.1.0) | |||||
| react: 19.1.0 | |||||
| optionalDependencies: | |||||
| '@types/react': 19.1.8 | |||||
| '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.1.8)(react@19.1.0)': | |||||
| dependencies: | |||||
| react: 19.1.0 | |||||
| optionalDependencies: | |||||
| '@types/react': 19.1.8 | |||||
| '@react-aria/focus@3.20.5(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': | '@react-aria/focus@3.20.5(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': | ||||
| dependencies: | dependencies: | ||||
| '@react-aria/interactions': 3.25.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0) | '@react-aria/interactions': 3.25.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0) | ||||
| argparse@2.0.1: {} | argparse@2.0.1: {} | ||||
| aria-hidden@1.2.6: | |||||
| dependencies: | |||||
| tslib: 2.8.1 | |||||
| aria-query@5.3.0: | aria-query@5.3.0: | ||||
| dependencies: | dependencies: | ||||
| dequal: 2.0.3 | dequal: 2.0.3 | ||||
| clsx@2.1.1: {} | clsx@2.1.1: {} | ||||
| cmdk@1.1.1(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0): | |||||
| dependencies: | |||||
| '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.8)(react@19.1.0) | |||||
| '@radix-ui/react-dialog': 1.1.14(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) | |||||
| '@radix-ui/react-id': 1.1.1(@types/react@19.1.8)(react@19.1.0) | |||||
| '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) | |||||
| react: 19.1.0 | |||||
| react-dom: 19.1.0(react@19.1.0) | |||||
| transitivePeerDependencies: | |||||
| - '@types/react' | |||||
| - '@types/react-dom' | |||||
| co@4.6.0: {} | co@4.6.0: {} | ||||
| code-inspector-core@0.18.3: | code-inspector-core@0.18.3: | ||||
| detect-newline@3.1.0: {} | detect-newline@3.1.0: {} | ||||
| detect-node-es@1.1.0: {} | |||||
| devalue@5.1.1: {} | devalue@5.1.1: {} | ||||
| devlop@1.1.0: | devlop@1.1.0: | ||||
| get-east-asian-width@1.3.0: {} | get-east-asian-width@1.3.0: {} | ||||
| get-nonce@1.0.1: {} | |||||
| get-package-type@0.1.0: {} | get-package-type@0.1.0: {} | ||||
| get-stream@5.2.0: | get-stream@5.2.0: | ||||
| react-refresh@0.14.2: {} | react-refresh@0.14.2: {} | ||||
| react-remove-scroll-bar@2.3.8(@types/react@19.1.8)(react@19.1.0): | |||||
| dependencies: | |||||
| react: 19.1.0 | |||||
| react-style-singleton: 2.2.3(@types/react@19.1.8)(react@19.1.0) | |||||
| tslib: 2.8.1 | |||||
| optionalDependencies: | |||||
| '@types/react': 19.1.8 | |||||
| react-remove-scroll@2.7.1(@types/react@19.1.8)(react@19.1.0): | |||||
| dependencies: | |||||
| react: 19.1.0 | |||||
| react-remove-scroll-bar: 2.3.8(@types/react@19.1.8)(react@19.1.0) | |||||
| react-style-singleton: 2.2.3(@types/react@19.1.8)(react@19.1.0) | |||||
| tslib: 2.8.1 | |||||
| use-callback-ref: 1.3.3(@types/react@19.1.8)(react@19.1.0) | |||||
| use-sidecar: 1.1.3(@types/react@19.1.8)(react@19.1.0) | |||||
| optionalDependencies: | |||||
| '@types/react': 19.1.8 | |||||
| react-rnd@10.5.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0): | react-rnd@10.5.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0): | ||||
| dependencies: | dependencies: | ||||
| re-resizable: 6.11.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) | re-resizable: 6.11.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) | ||||
| sortablejs: 1.15.6 | sortablejs: 1.15.6 | ||||
| tiny-invariant: 1.2.0 | tiny-invariant: 1.2.0 | ||||
| react-style-singleton@2.2.3(@types/react@19.1.8)(react@19.1.0): | |||||
| dependencies: | |||||
| get-nonce: 1.0.1 | |||||
| react: 19.1.0 | |||||
| tslib: 2.8.1 | |||||
| optionalDependencies: | |||||
| '@types/react': 19.1.8 | |||||
| react-syntax-highlighter@15.6.1(react@19.1.0): | react-syntax-highlighter@15.6.1(react@19.1.0): | ||||
| dependencies: | dependencies: | ||||
| '@babel/runtime': 7.27.6 | '@babel/runtime': 7.27.6 | ||||
| punycode: 1.4.1 | punycode: 1.4.1 | ||||
| qs: 6.14.0 | qs: 6.14.0 | ||||
| use-callback-ref@1.3.3(@types/react@19.1.8)(react@19.1.0): | |||||
| dependencies: | |||||
| react: 19.1.0 | |||||
| tslib: 2.8.1 | |||||
| optionalDependencies: | |||||
| '@types/react': 19.1.8 | |||||
| use-composed-ref@1.4.0(@types/react@19.1.8)(react@19.1.0): | use-composed-ref@1.4.0(@types/react@19.1.8)(react@19.1.0): | ||||
| dependencies: | dependencies: | ||||
| react: 19.1.0 | react: 19.1.0 | ||||
| optionalDependencies: | optionalDependencies: | ||||
| '@types/react': 19.1.8 | '@types/react': 19.1.8 | ||||
| use-sidecar@1.1.3(@types/react@19.1.8)(react@19.1.0): | |||||
| dependencies: | |||||
| detect-node-es: 1.1.0 | |||||
| react: 19.1.0 | |||||
| tslib: 2.8.1 | |||||
| optionalDependencies: | |||||
| '@types/react': 19.1.8 | |||||
| use-strict@1.0.1: {} | use-strict@1.0.1: {} | ||||
| use-sync-external-store@1.5.0(react@19.1.0): | use-sync-external-store@1.5.0(react@19.1.0): |
| import type { AppMode } from '@/types/app' | import type { AppMode } from '@/types/app' | ||||
| export const getRedirection = ( | |||||
| export const getRedirectionPath = ( | |||||
| isCurrentWorkspaceEditor: boolean, | isCurrentWorkspaceEditor: boolean, | ||||
| app: { id: string, mode: AppMode }, | app: { id: string, mode: AppMode }, | ||||
| redirectionFunc: (href: string) => void, | |||||
| ) => { | ) => { | ||||
| if (!isCurrentWorkspaceEditor) { | if (!isCurrentWorkspaceEditor) { | ||||
| redirectionFunc(`/app/${app.id}/overview`) | |||||
| return `/app/${app.id}/overview` | |||||
| } | } | ||||
| else { | else { | ||||
| if (app.mode === 'workflow' || app.mode === 'advanced-chat') | if (app.mode === 'workflow' || app.mode === 'advanced-chat') | ||||
| redirectionFunc(`/app/${app.id}/workflow`) | |||||
| return `/app/${app.id}/workflow` | |||||
| else | else | ||||
| redirectionFunc(`/app/${app.id}/configuration`) | |||||
| return `/app/${app.id}/configuration` | |||||
| } | } | ||||
| } | } | ||||
| export const getRedirection = ( | |||||
| isCurrentWorkspaceEditor: boolean, | |||||
| app: { id: string, mode: AppMode }, | |||||
| redirectionFunc: (href: string) => void, | |||||
| ) => { | |||||
| const redirectionPath = getRedirectionPath(isCurrentWorkspaceEditor, app) | |||||
| redirectionFunc(redirectionPath) | |||||
| } |