From f46d45e7866956e6c0e919002ad66b0cdc6b8fc6 Mon Sep 17 00:00:00 2001 From: Faisal Amir Date: Thu, 26 Jun 2025 15:01:44 +0700 Subject: [PATCH 01/48] =?UTF-8?q?=F0=9F=90=9Bfix:=20disabled=20backdrop=20?= =?UTF-8?q?onboarding=20on=20linux=20(#5533)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web-app/src/routes/hub.tsx | 1 + web-app/src/routes/settings/providers/$providerName.tsx | 1 + 2 files changed, 2 insertions(+) diff --git a/web-app/src/routes/hub.tsx b/web-app/src/routes/hub.tsx index c0e12130a..20f057073 100644 --- a/web-app/src/routes/hub.tsx +++ b/web-app/src/routes/hub.tsx @@ -372,6 +372,7 @@ function Hub() { showSkipButton={!isLastStep} hideCloseButton={true} spotlightClicks={true} + disableOverlay={IS_LINUX} disableOverlayClose={true} callback={handleJoyrideCallback} locale={{ diff --git a/web-app/src/routes/settings/providers/$providerName.tsx b/web-app/src/routes/settings/providers/$providerName.tsx index ac92967d7..a1cbd9149 100644 --- a/web-app/src/routes/settings/providers/$providerName.tsx +++ b/web-app/src/routes/settings/providers/$providerName.tsx @@ -213,6 +213,7 @@ function ProviderDetail() { showSkipButton={true} hideCloseButton={true} spotlightClicks={true} + disableOverlay={IS_LINUX} disableOverlayClose={true} callback={handleJoyrideCallback} locale={{ From 9bbf9a590c235c7554feca3c1123279124078dc1 Mon Sep 17 00:00:00 2001 From: Faisal Amir Date: Thu, 26 Jun 2025 15:01:50 +0700 Subject: [PATCH 02/48] =?UTF-8?q?=E2=9C=A8enhancement:=20support=20base=20?= =?UTF-8?q?layout=20responsive=20UI=20(#5472)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * ✨enhancement: support base layout responsive UI * Update web-app/src/containers/LeftPanel.tsx Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> * Update web-app/src/containers/ThreadList.tsx Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> * ✨enhancement: responsive assistant screen (#5502) * ✨enhancement: support base layout responsive UI * Update web-app/src/containers/LeftPanel.tsx Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> * Update web-app/src/containers/ThreadList.tsx Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> * ✨enhancement: responsive assistant screen * Update web-app/src/containers/dialogs/AddEditAssistant.tsx Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> * ✨enhancement: sort assistant * Update web-app/src/routes/assistant.tsx Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> --------- Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> * ✨enhancement: responsive hub screen (#5507) * ✨enhancement: support base layout responsive UI * Update web-app/src/containers/LeftPanel.tsx Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> * Update web-app/src/containers/ThreadList.tsx Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> * ✨enhancement: responsive assistant screen * Update web-app/src/containers/dialogs/AddEditAssistant.tsx Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> * ✨enhancement: sort assistant * Update web-app/src/routes/assistant.tsx Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> * ✨enhancement: responsive hub screen * 🧹cleanup: multiple key and useless for hub translation --------- Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> --------- Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> --- src-tauri/tauri.conf.json | 2 + web-app/src/components/ui/dialog.tsx | 2 +- web-app/src/containers/LeftPanel.tsx | 510 +++++++++++------- web-app/src/containers/ThreadList.tsx | 24 +- .../containers/dialogs/AddEditAssistant.tsx | 186 +++---- web-app/src/hooks/useClickOutside.ts | 42 ++ web-app/src/hooks/useMediaQuery.ts | 90 ++++ web-app/src/locales/en/hub.json | 3 +- web-app/src/locales/id/hub.json | 3 +- web-app/src/locales/vn/hub.json | 3 +- web-app/src/locales/zh-CN/hub.json | 3 +- web-app/src/locales/zh-TW/hub.json | 3 +- web-app/src/routes/__root.tsx | 4 +- web-app/src/routes/assistant.tsx | 97 ++-- web-app/src/routes/hub.tsx | 97 ++-- web-app/src/routes/index.tsx | 4 +- web-app/src/routes/threads/$threadId.tsx | 10 +- 17 files changed, 690 insertions(+), 393 deletions(-) create mode 100644 web-app/src/hooks/useClickOutside.ts create mode 100644 web-app/src/hooks/useMediaQuery.ts diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 04191e842..210322297 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -17,6 +17,8 @@ "label": "main", "title": "Jan", "width": 1024, + "minWidth": 375, + "minHeight": 667, "height": 800, "resizable": true, "fullscreen": false, diff --git a/web-app/src/components/ui/dialog.tsx b/web-app/src/components/ui/dialog.tsx index 98f4da71c..ed95f00b4 100644 --- a/web-app/src/components/ui/dialog.tsx +++ b/web-app/src/components/ui/dialog.tsx @@ -67,7 +67,7 @@ function DialogContent({ data-slot="dialog-content" aria-describedby={ariaDescribedBy} className={cn( - 'bg-main-view max-h-[calc(100%-48px)] overflow-auto border-main-view-fg/10 text-main-view-fg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 sm:max-w-lg', + 'bg-main-view max-h-[calc(100%-80px)] overflow-auto border-main-view-fg/10 text-main-view-fg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 sm:max-w-lg', className )} {...props} diff --git a/web-app/src/containers/LeftPanel.tsx b/web-app/src/containers/LeftPanel.tsx index 5d0b1542e..19dc30972 100644 --- a/web-app/src/containers/LeftPanel.tsx +++ b/web-app/src/containers/LeftPanel.tsx @@ -26,7 +26,7 @@ import { import { useThreads } from '@/hooks/useThreads' import { useTranslation } from '@/i18n/react-i18next-compat' -import { useMemo, useState } from 'react' +import { useMemo, useState, useEffect, useRef } from 'react' import { Dialog, DialogClose, @@ -40,6 +40,8 @@ import { import { Button } from '@/components/ui/button' import { toast } from 'sonner' import { DownloadManagement } from '@/containers/DownloadManegement' +import { useSmallScreen } from '@/hooks/useMediaQuery' +import { useClickOutside } from '@/hooks/useClickOutside' const mainMenus = [ { @@ -70,6 +72,68 @@ const LeftPanel = () => { const navigate = useNavigate() const [searchTerm, setSearchTerm] = useState('') + const isSmallScreen = useSmallScreen() + const prevScreenSizeRef = useRef(null) + const isInitialMountRef = useRef(true) + const panelRef = useRef(null) + const searchContainerRef = useRef(null) + const searchContainerMacRef = useRef(null) + + // Use click outside hook for panel with debugging + useClickOutside( + () => { + if (isSmallScreen && open) { + setLeftPanel(false) + } + }, + null, + [ + panelRef.current, + searchContainerRef.current, + searchContainerMacRef.current, + ] + ) + + // Auto-collapse panel only when window is resized + useEffect(() => { + const handleResize = () => { + const currentIsSmallScreen = window.innerWidth <= 768 + + // Skip on initial mount + if (isInitialMountRef.current) { + isInitialMountRef.current = false + prevScreenSizeRef.current = currentIsSmallScreen + return + } + + // Only trigger if the screen size actually changed + if ( + prevScreenSizeRef.current !== null && + prevScreenSizeRef.current !== currentIsSmallScreen + ) { + if (currentIsSmallScreen) { + setLeftPanel(false) + } else { + setLeftPanel(true) + } + prevScreenSizeRef.current = currentIsSmallScreen + } + } + + // Add resize listener + window.addEventListener('resize', handleResize) + + // Initialize the previous screen size on mount + if (isInitialMountRef.current) { + prevScreenSizeRef.current = window.innerWidth <= 768 + isInitialMountRef.current = false + } + + return () => { + window.removeEventListener('resize', handleResize) + } + }, [setLeftPanel]) + const currentPath = useRouterState({ select: (state) => state.location.pathname, }) @@ -91,50 +155,63 @@ const LeftPanel = () => { return filteredThreads.filter((t) => !t.isFavorite) }, [filteredThreads]) - return ( - + ) } diff --git a/web-app/src/containers/ThreadList.tsx b/web-app/src/containers/ThreadList.tsx index e4ed8aa93..bd3825eee 100644 --- a/web-app/src/containers/ThreadList.tsx +++ b/web-app/src/containers/ThreadList.tsx @@ -20,8 +20,10 @@ import { IconStar, } from '@tabler/icons-react' import { useThreads } from '@/hooks/useThreads' +import { useLeftPanel } from '@/hooks/useLeftPanel' import { cn } from '@/lib/utils' import { route } from '@/constants/routes' +import { useSmallScreen } from '@/hooks/useMediaQuery' import { DropdownMenu, @@ -55,6 +57,9 @@ const SortableItem = memo(({ thread }: { thread: Thread }) => { isDragging, } = useSortable({ id: thread.id, disabled: true }) + const isSmallScreen = useSmallScreen() + const { setLeftPanel } = useLeftPanel() + const style = { transform: CSS.Transform.toString(transform), transition, @@ -75,7 +80,11 @@ const SortableItem = memo(({ thread }: { thread: Thread }) => { const handleClick = () => { if (!isDragging) { - navigate({ to: route.threadsDetail, params: { threadId: thread.id } }) + // Only close panel and navigate if the thread is not already active + if (!isActive) { + if (isSmallScreen) setLeftPanel(false) + navigate({ to: route.threadsDetail, params: { threadId: thread.id } }) + } } } @@ -85,7 +94,9 @@ const SortableItem = memo(({ thread }: { thread: Thread }) => { return (thread.title || '').replace(/]*>|<\/span>/g, '') }, [thread.title]) - const [title, setTitle] = useState(plainTitleForRename || t('common:newThread')) + const [title, setTitle] = useState( + plainTitleForRename || t('common:newThread') + ) return (
{ setOpenDropdown(false) toast.success(t('common:toast.renameThread.title'), { id: 'rename-thread', - description: t('common:toast.renameThread.description', { title }), + description: t( + 'common:toast.renameThread.description', + { title } + ), }) }} > @@ -231,7 +245,9 @@ const SortableItem = memo(({ thread }: { thread: Thread }) => { setOpenDropdown(false) toast.success(t('common:toast.deleteThread.title'), { id: 'delete-thread', - description: t('common:toast.deleteThread.description'), + description: t( + 'common:toast.deleteThread.description' + ), }) setTimeout(() => { navigate({ to: route.home }) diff --git a/web-app/src/containers/dialogs/AddEditAssistant.tsx b/web-app/src/containers/dialogs/AddEditAssistant.tsx index 7a1242027..f4e327e35 100644 --- a/web-app/src/containers/dialogs/AddEditAssistant.tsx +++ b/web-app/src/containers/dialogs/AddEditAssistant.tsx @@ -378,73 +378,27 @@ export default function AddEditAssistant({
{paramsKeys.map((key, index) => ( -
- - handleParameterChange(index, e.target.value, 'key') - } - placeholder={t('assistants:key')} - className="w-24" - /> +
+
+ + handleParameterChange(index, e.target.value, 'key') + } + placeholder={t('assistants:key')} + className="w-full sm:w-24" + /> - - -
- - -
-
- - - handleParameterChange(index, 'string', 'type') - } - > - {t('assistants:stringValue')} - - - handleParameterChange(index, 'number', 'type') - } - > - {t('assistants:numberValue')} - - - handleParameterChange(index, 'boolean', 'type') - } - > - {t('assistants:booleanValue')} - - - handleParameterChange(index, 'json', 'type') - } - > - {t('assistants:jsonValue')} - - -
- - {paramsTypes[index] === 'boolean' ? ( -
+
@@ -454,48 +408,98 @@ export default function AddEditAssistant({ />
- + - handleParameterChange(index, true, 'value') + handleParameterChange(index, 'string', 'type') } > - {t('assistants:trueValue')} + {t('assistants:stringValue')} - handleParameterChange(index, false, 'value') + handleParameterChange(index, 'number', 'type') } > - {t('assistants:falseValue')} + {t('assistants:numberValue')} + + + handleParameterChange(index, 'boolean', 'type') + } + > + {t('assistants:booleanValue')} + + + handleParameterChange(index, 'json', 'type') + } + > + {t('assistants:jsonValue')} - ) : paramsTypes[index] === 'json' ? ( - - handleParameterChange(index, e.target.value, 'value') - } - placeholder={t('assistants:jsonValuePlaceholder')} - className="flex-1" - /> - ) : ( - - handleParameterChange(index, e.target.value, 'value') - } - type={paramsTypes[index] === 'number' ? 'number' : 'text'} - placeholder={t('assistants:value')} - className="flex-1" - /> - )} + {paramsTypes[index] === 'boolean' ? ( + + +
+ + +
+
+ + + handleParameterChange(index, true, 'value') + } + > + {t('assistants:trueValue')} + + + handleParameterChange(index, false, 'value') + } + > + {t('assistants:falseValue')} + + +
+ ) : paramsTypes[index] === 'json' ? ( + + handleParameterChange(index, e.target.value, 'value') + } + placeholder={t('assistants:jsonValuePlaceholder')} + className="sm:flex-1 h-[36px] w-full" + /> + ) : ( + + handleParameterChange(index, e.target.value, 'value') + } + type={paramsTypes[index] === 'number' ? 'number' : 'text'} + placeholder={t('assistants:value')} + className="sm:flex-1 h-[36px] w-full" + /> + )} +
handleRemoveParameter(index)} diff --git a/web-app/src/hooks/useClickOutside.ts b/web-app/src/hooks/useClickOutside.ts new file mode 100644 index 000000000..237b9dff1 --- /dev/null +++ b/web-app/src/hooks/useClickOutside.ts @@ -0,0 +1,42 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +import { useEffect, useRef } from 'react' + +const DEFAULT_EVENTS = ['mousedown', 'touchstart'] + +export function useClickOutside( + handler: () => void, + events?: string[] | null, + nodes?: (HTMLElement | null)[] +) { + const ref = useRef(null) + + useEffect(() => { + const listener = (event: any) => { + const { target } = event ?? {} + if (Array.isArray(nodes)) { + const shouldIgnore = + target?.hasAttribute('data-ignore-outside-clicks') || + (!document.body.contains(target) && target.tagName !== 'HTML') + const shouldTrigger = nodes.every( + (node) => !!node && !event.composedPath().includes(node) + ) + // eslint-disable-next-line @typescript-eslint/no-unused-expressions + shouldTrigger && !shouldIgnore && handler() + } else if (ref.current && !ref.current.contains(target)) { + handler() + } + } + + ;(events || DEFAULT_EVENTS).forEach((fn) => + document.addEventListener(fn, listener) + ) + + return () => { + ;(events || DEFAULT_EVENTS).forEach((fn) => + document.removeEventListener(fn, listener) + ) + } + }, [ref, handler, nodes, events]) + + return ref +} diff --git a/web-app/src/hooks/useMediaQuery.ts b/web-app/src/hooks/useMediaQuery.ts new file mode 100644 index 000000000..9e479eec4 --- /dev/null +++ b/web-app/src/hooks/useMediaQuery.ts @@ -0,0 +1,90 @@ +import { useEffect, useRef, useState } from 'react' +import { create } from 'zustand' + +export interface UseMediaQueryOptions { + getInitialValueInEffect: boolean +} + +type MediaQueryCallback = (event: { matches: boolean; media: string }) => void + +// Zustand store for small screen state +type SmallScreenState = { + isSmallScreen: boolean + setIsSmallScreen: (isSmall: boolean) => void +} + +export const useSmallScreenStore = create((set) => ({ + isSmallScreen: false, + setIsSmallScreen: (isSmall) => set({ isSmallScreen: isSmall }), +})) + +/** + * Older versions of Safari (shipped withCatalina and before) do not support addEventListener on matchMedia + * https://stackoverflow.com/questions/56466261/matchmedia-addlistener-marked-as-deprecated-addeventlistener-equivalent + * */ +function attachMediaListener( + query: MediaQueryList, + callback: MediaQueryCallback +) { + try { + query.addEventListener('change', callback) + return () => query.removeEventListener('change', callback) + } catch (e) { + console.warn(e) + // eslint-disable @typescript-eslint/no-deprecated + query.addListener(callback) + return () => query.removeListener(callback) + // eslint-enable @typescript-eslint/no-deprecated + } +} + +function getInitialValue(query: string, initialValue?: boolean) { + if (typeof initialValue === 'boolean') { + return initialValue + } + + if (typeof window !== 'undefined' && 'matchMedia' in window) { + return window.matchMedia(query).matches + } + + return false +} + +export function useMediaQuery( + query: string, + initialValue?: boolean, + { getInitialValueInEffect }: UseMediaQueryOptions = { + getInitialValueInEffect: true, + } +): boolean { + const [matches, setMatches] = useState( + getInitialValueInEffect ? initialValue : getInitialValue(query) + ) + const queryRef = useRef(null) + + useEffect(() => { + if ('matchMedia' in window) { + queryRef.current = window.matchMedia(query) + setMatches(queryRef.current.matches) + return attachMediaListener(queryRef.current, (event) => + setMatches(event.matches) + ) + } + + return undefined + }, [query]) + + return matches || false +} + +// Specific hook for small screen detection with state management +export const useSmallScreen = (): boolean => { + const { isSmallScreen, setIsSmallScreen } = useSmallScreenStore() + const mediaQuery = useMediaQuery('(max-width: 768px)') + + useEffect(() => { + setIsSmallScreen(mediaQuery) + }, [mediaQuery, setIsSmallScreen]) + + return isSmallScreen +} diff --git a/web-app/src/locales/en/hub.json b/web-app/src/locales/en/hub.json index bdc83bd50..e082c05b5 100644 --- a/web-app/src/locales/en/hub.json +++ b/web-app/src/locales/en/hub.json @@ -13,7 +13,6 @@ "useModel": "Use this model", "downloadModel": "Download model", "searchPlaceholder": "Search for models on Hugging Face...", - "editTheme": "Edit Theme", "joyride": { "recommendedModelTitle": "Recommended Model", "recommendedModelContent": "Browse and download powerful AI models from various providers, all in one place. We suggest starting with Jan-Nano - a model optimized for function calling, tool integration, and research capabilities. It's ideal for building interactive AI agents.", @@ -28,4 +27,4 @@ "next": "Next", "skip": "Skip" } -} \ No newline at end of file +} diff --git a/web-app/src/locales/id/hub.json b/web-app/src/locales/id/hub.json index 7d9fe733f..5aa1e7d1c 100644 --- a/web-app/src/locales/id/hub.json +++ b/web-app/src/locales/id/hub.json @@ -13,7 +13,6 @@ "useModel": "Gunakan model ini", "downloadModel": "Unduh model", "searchPlaceholder": "Cari model di Hugging Face...", - "editTheme": "Edit Tema", "joyride": { "recommendedModelTitle": "Model yang Direkomendasikan", "recommendedModelContent": "Jelajahi dan unduh model AI yang kuat dari berbagai penyedia, semuanya di satu tempat. Kami sarankan memulai dengan Jan-Nano - model yang dioptimalkan untuk pemanggilan fungsi, integrasi alat, dan kemampuan penelitian. Ini ideal untuk membangun agen AI interaktif.", @@ -28,4 +27,4 @@ "next": "Berikutnya", "skip": "Lewati" } -} \ No newline at end of file +} diff --git a/web-app/src/locales/vn/hub.json b/web-app/src/locales/vn/hub.json index 34f6b485b..8b38d84cc 100644 --- a/web-app/src/locales/vn/hub.json +++ b/web-app/src/locales/vn/hub.json @@ -13,7 +13,6 @@ "useModel": "Sử dụng mô hình này", "downloadModel": "Tải xuống mô hình", "searchPlaceholder": "Tìm kiếm các mô hình trên Hugging Face...", - "editTheme": "Chỉnh sửa chủ đề", "joyride": { "recommendedModelTitle": "Mô hình được đề xuất", "recommendedModelContent": "Duyệt và tải xuống các mô hình AI mạnh mẽ từ nhiều nhà cung cấp khác nhau, tất cả ở cùng một nơi. Chúng tôi khuyên bạn nên bắt đầu với Jan-Nano - một mô hình được tối ưu hóa cho các khả năng gọi hàm, tích hợp công cụ và nghiên cứu. Nó lý tưởng để xây dựng các tác nhân AI tương tác.", @@ -28,4 +27,4 @@ "next": "Tiếp theo", "skip": "Bỏ qua" } -} \ No newline at end of file +} diff --git a/web-app/src/locales/zh-CN/hub.json b/web-app/src/locales/zh-CN/hub.json index 39231c2fb..dc005611a 100644 --- a/web-app/src/locales/zh-CN/hub.json +++ b/web-app/src/locales/zh-CN/hub.json @@ -13,7 +13,6 @@ "useModel": "使用此模型", "downloadModel": "下载模型", "searchPlaceholder": "在 Hugging Face 上搜索模型...", - "editTheme": "编辑主题", "joyride": { "recommendedModelTitle": "推荐模型", "recommendedModelContent": "在一个地方浏览和下载来自不同提供商的强大 AI 模型。我们建议从 Jan-Nano 开始 - 这是一个针对函数调用、工具集成和研究功能进行优化的模型。它非常适合构建交互式 AI 代理。", @@ -28,4 +27,4 @@ "next": "下一步", "skip": "跳过" } -} \ No newline at end of file +} diff --git a/web-app/src/locales/zh-TW/hub.json b/web-app/src/locales/zh-TW/hub.json index e4a4df0d5..f35a4485a 100644 --- a/web-app/src/locales/zh-TW/hub.json +++ b/web-app/src/locales/zh-TW/hub.json @@ -13,7 +13,6 @@ "useModel": "使用此模型", "downloadModel": "下載模型", "searchPlaceholder": "在 Hugging Face 上搜尋模型...", - "editTheme": "編輯主題", "joyride": { "recommendedModelTitle": "推薦模型", "recommendedModelContent": "在一個地方瀏覽和下載來自不同提供商的強大 AI 模型。我們建議從 Jan-Nano 開始 - 這是一個針對函數調用、工具整合和研究功能進行優化的模型。它非常適合構建互動式 AI 代理。", @@ -28,4 +27,4 @@ "next": "下一步", "skip": "略過" } -} \ No newline at end of file +} diff --git a/web-app/src/routes/__root.tsx b/web-app/src/routes/__root.tsx index 1014c2aa1..8c09addf5 100644 --- a/web-app/src/routes/__root.tsx +++ b/web-app/src/routes/__root.tsx @@ -43,8 +43,8 @@ const AppLayout = () => { {/* Main content panel */}
diff --git a/web-app/src/routes/assistant.tsx b/web-app/src/routes/assistant.tsx index 031003766..fe0cf6fe7 100644 --- a/web-app/src/routes/assistant.tsx +++ b/web-app/src/routes/assistant.tsx @@ -62,57 +62,60 @@ function Assistant() { {t('assistants:title')}
-
- {assistants.map((assistant) => ( -
-
-

-
- {assistant?.avatar && ( - - - - )} - {assistant.name} -
-

-
-
{ - setEditingKey(assistant.id) - setOpen(true) - }} - > - -
-
handleDelete(assistant.id)} - > - +
+ {assistants + .slice().sort((a, b) => a.created_at - b.created_at) + .map((assistant) => ( +
+
+

+
+ {assistant?.avatar && ( + + + + )} + {assistant.name} +
+

+
+
{ + setEditingKey(assistant.id) + setOpen(true) + }} + > + +
+
handleDelete(assistant.id)} + > + +
+

+ {assistant.description} +

-

- {assistant.description} -

-
- ))} + ))} +
{ setEditingKey(null) diff --git a/web-app/src/routes/hub.tsx b/web-app/src/routes/hub.tsx index 20f057073..5ac51b1af 100644 --- a/web-app/src/routes/hub.tsx +++ b/web-app/src/routes/hub.tsx @@ -358,6 +358,46 @@ function Hub() { // Check if we're on the last step const isLastStep = currentStepIndex === steps.length - 1 + const renderFilter = () => { + return ( + <> + + + + { + sortOptions.find((option) => option.value === sortSelected) + ?.name + } + + + + {sortOptions.map((option) => ( + setSortSelected(option.value)} + > + {option.name} + + ))} + + +
+ + + {t('hub:downloaded')} + +
+ + ) + } + return ( <>
{isSearching ? ( - + ) : ( - + )}
-
- - - - { - sortOptions.find( - (option) => option.value === sortSelected - )?.name - } - - - - {sortOptions.map((option) => ( - setSortSelected(option.value)} - > - {option.name} - - ))} - - -
- - - {t('hub:downloaded')} - -
+
+ {renderFilter()}
-
+
{loading ? (
@@ -459,6 +466,9 @@ function Hub() {
) : (
+
+ {renderFilter()} +
{filteredModels.map((model) => (

{extractModelName(model.metadata?.id) || ''}

diff --git a/web-app/src/routes/index.tsx b/web-app/src/routes/index.tsx index cc072fb75..89a9172c3 100644 --- a/web-app/src/routes/index.tsx +++ b/web-app/src/routes/index.tsx @@ -53,8 +53,8 @@ function Index() { -
-
+
+

{t('chat:welcome')} diff --git a/web-app/src/routes/threads/$threadId.tsx b/web-app/src/routes/threads/$threadId.tsx index 3984ace00..d2c4a3e3e 100644 --- a/web-app/src/routes/threads/$threadId.tsx +++ b/web-app/src/routes/threads/$threadId.tsx @@ -20,6 +20,7 @@ import { useAssistant } from '@/hooks/useAssistant' import { useAppearance } from '@/hooks/useAppearance' import { useOutOfContextPromiseModal } from '@/containers/dialogs/OutOfContextDialog' import { useTranslation } from '@/i18n/react-i18next-compat' +import { useSmallScreen } from '@/hooks/useMediaQuery' // as route.threadsDetail export const Route = createFileRoute('/threads/$threadId')({ @@ -38,6 +39,7 @@ function ThreadDetail() { const { setMessages } = useMessages() const { streamingContent } = useAppState() const { appMainViewBgColor, chatWidth } = useAppearance() + const isSmallScreen = useSmallScreen() const { messages } = useMessages( useShallow((state) => ({ @@ -218,7 +220,8 @@ function ThreadDetail() {
{messages && @@ -256,8 +259,9 @@ function ThreadDetail() {
Date: Thu, 26 Jun 2025 23:59:53 +0700 Subject: [PATCH 03/48] =?UTF-8?q?=F0=9F=90=9Bfix:=20translation=20fallback?= =?UTF-8?q?=20(#5554)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 🐛fix: translation fallback * 🧹cleanup: remove duplicate key translation --- .../containers/dialogs/CortexFailureDialog.tsx | 17 +++++++---------- web-app/src/locales/id/common.json | 7 ------- web-app/src/locales/vn/common.json | 7 ------- web-app/src/locales/zh-CN/common.json | 7 ------- web-app/src/locales/zh-TW/common.json | 7 ------- 5 files changed, 7 insertions(+), 38 deletions(-) diff --git a/web-app/src/containers/dialogs/CortexFailureDialog.tsx b/web-app/src/containers/dialogs/CortexFailureDialog.tsx index b28281f54..48d08569d 100644 --- a/web-app/src/containers/dialogs/CortexFailureDialog.tsx +++ b/web-app/src/containers/dialogs/CortexFailureDialog.tsx @@ -1,7 +1,7 @@ import { useEffect, useState } from 'react' import { listen } from '@tauri-apps/api/event' import { invoke } from '@tauri-apps/api/core' -import { t } from 'i18next' + import { Dialog, DialogContent, @@ -11,8 +11,10 @@ import { DialogTitle, } from '@/components/ui/dialog' import { Button } from '@/components/ui/button' +import { useTranslation } from '@/i18n' export function CortexFailureDialog() { + const { t } = useTranslation() const [showDialog, setShowDialog] = useState(false) useEffect(() => { @@ -52,15 +54,10 @@ export function CortexFailureDialog() { - - {t('cortexFailureDialog.title', 'Local AI Engine Issue')} - + {t('cortexFailureDialog.title')} - {t( - 'cortexFailureDialog.description', - 'The local AI engine (Cortex) failed to start after multiple attempts. This might prevent some features from working correctly.' - )} + {t('cortexFailureDialog.description')} diff --git a/web-app/src/locales/id/common.json b/web-app/src/locales/id/common.json index 8aa327253..5ba59011b 100644 --- a/web-app/src/locales/id/common.json +++ b/web-app/src/locales/id/common.json @@ -256,12 +256,5 @@ "description": "Cortex gagal dimulai. Silakan periksa log untuk detail lebih lanjut.", "contactSupport": "Hubungi Dukungan", "restartJan": "Restart Jan" - }, - "outOfContextError": { - "title": "Kesalahan di luar konteks", - "description": "Obrolan ini mencapai batas memori AI, seperti papan tulis yang penuh. Kami dapat memperluas jendela memori (disebut ukuran konteks) sehingga mengingat lebih banyak, tetapi mungkin menggunakan lebih banyak memori komputer Anda. Kami juga dapat memotong input, yang berarti akan melupakan sebagian riwayat obrolan untuk memberi ruang bagi pesan baru.", - "increaseContextSizeDescription": "Apakah Anda ingin meningkatkan ukuran konteks?", - "truncateInput": "Potong Input", - "increaseContextSize": "Tingkatkan Ukuran Konteks" } } diff --git a/web-app/src/locales/vn/common.json b/web-app/src/locales/vn/common.json index f970b9b4d..654b2814c 100644 --- a/web-app/src/locales/vn/common.json +++ b/web-app/src/locales/vn/common.json @@ -256,12 +256,5 @@ "description": "Cortex không khởi động được. Vui lòng kiểm tra log để biết thêm chi tiết.", "contactSupport": "Liên hệ Hỗ trợ", "restartJan": "Khởi động lại Jan" - }, - "outOfContextError": { - "title": "Lỗi ngoài ngữ cảnh", - "description": "Cuộc trò chuyện này đang đạt đến giới hạn bộ nhớ của AI, giống như một bảng trắng đang đầy. Chúng ta có thể mở rộng cửa sổ bộ nhớ (gọi là kích thước ngữ cảnh) để nó nhớ nhiều hơn, nhưng có thể sử dụng nhiều bộ nhớ máy tính của bạn hơn. Chúng ta cũng có thể cắt bớt đầu vào, có nghĩa là nó sẽ quên một phần lịch sử trò chuyện để nhường chỗ cho tin nhắn mới.", - "increaseContextSizeDescription": "Bạn có muốn tăng kích thước ngữ cảnh không?", - "truncateInput": "Cắt bớt Đầu vào", - "increaseContextSize": "Tăng Kích thước Ngữ cảnh" } } diff --git a/web-app/src/locales/zh-CN/common.json b/web-app/src/locales/zh-CN/common.json index 67a3f002a..40e392c97 100644 --- a/web-app/src/locales/zh-CN/common.json +++ b/web-app/src/locales/zh-CN/common.json @@ -256,12 +256,5 @@ "description": "Cortex 启动失败。请检查日志以获取更多详细信息。", "contactSupport": "联系支持", "restartJan": "重启 Jan" - }, - "outOfContextError": { - "title": "超出上下文错误", - "description": "此聊天正在达到AI的内存限制,就像白板填满了一样。我们可以扩展内存窗口(称为上下文大小),使其记住更多内容,但可能会使用更多计算机内存。我们也可以截断输入,这意味着它会忘记一些聊天历史记录,为新消息腾出空间。", - "increaseContextSizeDescription": "您想要增加上下文大小吗?", - "truncateInput": "截断输入", - "increaseContextSize": "增加上下文大小" } } diff --git a/web-app/src/locales/zh-TW/common.json b/web-app/src/locales/zh-TW/common.json index 04ae212da..92b4a3c0d 100644 --- a/web-app/src/locales/zh-TW/common.json +++ b/web-app/src/locales/zh-TW/common.json @@ -256,12 +256,5 @@ "description": "Cortex 啟動失敗。請檢查日誌以獲取更多詳細信息。", "contactSupport": "聯繫支援", "restartJan": "重啟 Jan" - }, - "outOfContextError": { - "title": "超出上下文錯誤", - "description": "此聊天正在達到AI的記憶體限制,就像白板填滿了一樣。我們可以擴展記憶體視窗(稱為上下文大小),使其記住更多內容,但可能會使用更多電腦記憶體。我們也可以截斷輸入,這意味著它會忘記一些聊天歷史記錄,為新訊息騰出空間。", - "increaseContextSizeDescription": "您想要增加上下文大小嗎?", - "truncateInput": "截斷輸入", - "increaseContextSize": "增加上下文大小" } } From ba4a36dfb3a805424ca330da7df66091f3730041 Mon Sep 17 00:00:00 2001 From: Louis Date: Fri, 27 Jun 2025 10:34:43 +0700 Subject: [PATCH 04/48] fix: min-p-validation-on-model-load --- core/src/browser/models/utils.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/core/src/browser/models/utils.ts b/core/src/browser/models/utils.ts index 192b838da..f2db40241 100644 --- a/core/src/browser/models/utils.ts +++ b/core/src/browser/models/utils.ts @@ -17,6 +17,7 @@ export const validationRules: { [key: string]: (value: any) => boolean } = { presence_penalty: (value: any) => typeof value === 'number' && value >= 0 && value <= 1, repeat_last_n: (value: any) => typeof value === 'number', repeat_penalty: (value: any) => typeof value === 'number', + min_p: (value: any) => typeof value === 'number', ctx_len: (value: any) => Number.isInteger(value) && value >= 0, ngl: (value: any) => Number.isInteger(value), From b49619b389d4008e9b72354d17a3d2e52bc6328b Mon Sep 17 00:00:00 2001 From: Louis Date: Fri, 27 Jun 2025 10:41:34 +0700 Subject: [PATCH 05/48] test: cover new changes --- core/src/browser/models/manager.test.ts | 133 +++++++++++++++++++++ core/src/browser/models/utils.test.ts | 152 ++++++++++++++++++++++-- core/src/browser/models/utils.ts | 2 +- 3 files changed, 277 insertions(+), 10 deletions(-) create mode 100644 core/src/browser/models/manager.test.ts diff --git a/core/src/browser/models/manager.test.ts b/core/src/browser/models/manager.test.ts new file mode 100644 index 000000000..189ca1209 --- /dev/null +++ b/core/src/browser/models/manager.test.ts @@ -0,0 +1,133 @@ +import { ModelManager } from './manager' +import { Model, ModelEvent } from '../../types' +import { events } from '../events' + +jest.mock('../events', () => ({ + events: { + emit: jest.fn(), + }, +})) + +Object.defineProperty(global, 'window', { + value: { + core: {}, + }, + writable: true, +}) + +describe('ModelManager', () => { + let modelManager: ModelManager + let mockModel: Model + + beforeEach(() => { + jest.clearAllMocks() + ;(global.window as any).core = {} + modelManager = new ModelManager() + mockModel = { + id: 'test-model-1', + name: 'Test Model', + version: '1.0.0', + } as Model + }) + + describe('constructor', () => { + it('should set itself on window.core.modelManager when window exists', () => { + expect((global.window as any).core.modelManager).toBe(modelManager) + }) + }) + + describe('register', () => { + it('should register a new model', () => { + modelManager.register(mockModel) + + expect(modelManager.models.has('test-model-1')).toBe(true) + expect(modelManager.models.get('test-model-1')).toEqual(mockModel) + expect(events.emit).toHaveBeenCalledWith(ModelEvent.OnModelsUpdate, {}) + }) + + it('should merge existing model with new model data', () => { + const existingModel: Model = { + id: 'test-model-1', + name: 'Existing Model', + description: 'Existing description', + } as Model + + const updatedModel: Model = { + id: 'test-model-1', + name: 'Updated Model', + version: '2.0.0', + } as Model + + modelManager.register(existingModel) + modelManager.register(updatedModel) + + const registeredModel = modelManager.models.get('test-model-1') + expect(registeredModel).toEqual({ + id: 'test-model-1', + name: 'Existing Model', + description: 'Existing description', + version: '2.0.0', + }) + expect(events.emit).toHaveBeenCalledTimes(2) + }) + }) + + describe('get', () => { + it('should retrieve a registered model by id', () => { + modelManager.register(mockModel) + + const retrievedModel = modelManager.get('test-model-1') + expect(retrievedModel).toEqual(mockModel) + }) + + it('should return undefined for non-existent model', () => { + const retrievedModel = modelManager.get('non-existent-model') + expect(retrievedModel).toBeUndefined() + }) + + it('should return correctly typed model', () => { + modelManager.register(mockModel) + + const retrievedModel = modelManager.get('test-model-1') + expect(retrievedModel?.id).toBe('test-model-1') + expect(retrievedModel?.name).toBe('Test Model') + }) + }) + + describe('instance', () => { + it('should create a new instance when none exists on window.core', () => { + ;(global.window as any).core = {} + + const instance = ModelManager.instance() + expect(instance).toBeInstanceOf(ModelManager) + expect((global.window as any).core.modelManager).toBe(instance) + }) + + it('should return existing instance when it exists on window.core', () => { + const existingManager = new ModelManager() + ;(global.window as any).core.modelManager = existingManager + + const instance = ModelManager.instance() + expect(instance).toBe(existingManager) + }) + }) + + describe('models property', () => { + it('should initialize with empty Map', () => { + expect(modelManager.models).toBeInstanceOf(Map) + expect(modelManager.models.size).toBe(0) + }) + + it('should maintain multiple models', () => { + const model1: Model = { id: 'model-1', name: 'Model 1' } as Model + const model2: Model = { id: 'model-2', name: 'Model 2' } as Model + + modelManager.register(model1) + modelManager.register(model2) + + expect(modelManager.models.size).toBe(2) + expect(modelManager.models.get('model-1')).toEqual(model1) + expect(modelManager.models.get('model-2')).toEqual(model2) + }) + }) +}) \ No newline at end of file diff --git a/core/src/browser/models/utils.test.ts b/core/src/browser/models/utils.test.ts index ac876c3dc..313ad0969 100644 --- a/core/src/browser/models/utils.test.ts +++ b/core/src/browser/models/utils.test.ts @@ -152,6 +152,33 @@ describe('validationRules', () => { expect(validationRules.text_model('true')).toBe(false) expect(validationRules.text_model(1)).toBe(false) }) + + it('should validate repeat_last_n correctly', () => { + expect(validationRules.repeat_last_n(5)).toBe(true) + expect(validationRules.repeat_last_n(-5)).toBe(true) + expect(validationRules.repeat_last_n(0)).toBe(true) + expect(validationRules.repeat_last_n(1.5)).toBe(true) + expect(validationRules.repeat_last_n('5')).toBe(false) + expect(validationRules.repeat_last_n(null)).toBe(false) + }) + + it('should validate repeat_penalty correctly', () => { + expect(validationRules.repeat_penalty(1.1)).toBe(true) + expect(validationRules.repeat_penalty(0.9)).toBe(true) + expect(validationRules.repeat_penalty(0)).toBe(true) + expect(validationRules.repeat_penalty(-1)).toBe(true) + expect(validationRules.repeat_penalty('1.1')).toBe(false) + expect(validationRules.repeat_penalty(null)).toBe(false) + }) + + it('should validate min_p correctly', () => { + expect(validationRules.min_p(0.1)).toBe(true) + expect(validationRules.min_p(0)).toBe(true) + expect(validationRules.min_p(-0.1)).toBe(true) + expect(validationRules.min_p(1.5)).toBe(true) + expect(validationRules.min_p('0.1')).toBe(false) + expect(validationRules.min_p(null)).toBe(false) + }) }) it('should normalize invalid values for keys not listed in validationRules', () => { @@ -192,18 +219,125 @@ describe('normalizeValue', () => { expect(normalizeValue('cpu_threads', '4')).toBe(4) expect(normalizeValue('cpu_threads', 0)).toBe(0) }) + + it('should handle edge cases for normalization', () => { + expect(normalizeValue('ctx_len', -5.7)).toBe(-6) + expect(normalizeValue('token_limit', 'abc')).toBeNaN() + expect(normalizeValue('max_tokens', null)).toBe(0) + expect(normalizeValue('ngl', undefined)).toBeNaN() + expect(normalizeValue('n_parallel', Infinity)).toBe(Infinity) + expect(normalizeValue('cpu_threads', -Infinity)).toBe(-Infinity) + }) + + it('should not normalize non-integer parameters', () => { + expect(normalizeValue('temperature', 1.5)).toBe(1.5) + expect(normalizeValue('top_p', 0.9)).toBe(0.9) + expect(normalizeValue('stream', true)).toBe(true) + expect(normalizeValue('prompt_template', 'template')).toBe('template') + }) }) -it('should handle invalid values correctly by falling back to originParams', () => { - const modelParams = { temperature: 'invalid', token_limit: -1 } - const originParams = { temperature: 0.5, token_limit: 100 } - expect(extractInferenceParams(modelParams as any, originParams)).toEqual(originParams) +describe('extractInferenceParams', () => { + it('should handle invalid values correctly by falling back to originParams', () => { + const modelParams = { temperature: 'invalid', token_limit: -1 } + const originParams = { temperature: 0.5, token_limit: 100 } + expect(extractInferenceParams(modelParams as any, originParams)).toEqual(originParams) + }) + + it('should return an empty object when no modelParams are provided', () => { + expect(extractInferenceParams()).toEqual({}) + }) + + it('should extract and normalize valid inference parameters', () => { + const modelParams = { + temperature: 1.5, + token_limit: 100.7, + top_p: 0.9, + stream: true, + max_tokens: 50.3, + invalid_param: 'should_be_ignored' + } + + const result = extractInferenceParams(modelParams as any) + expect(result).toEqual({ + temperature: 1.5, + token_limit: 100, + top_p: 0.9, + stream: true, + max_tokens: 50 + }) + }) + + it('should handle parameters without validation rules', () => { + const modelParams = { engine: 'llama' } + const result = extractInferenceParams(modelParams as any) + expect(result).toEqual({ engine: 'llama' }) + }) + + it('should skip invalid values when no origin params provided', () => { + const modelParams = { temperature: 'invalid', top_p: 0.8 } + const result = extractInferenceParams(modelParams as any) + expect(result).toEqual({ top_p: 0.8 }) + }) }) -it('should return an empty object when no modelParams are provided', () => { - expect(extractModelLoadParams()).toEqual({}) -}) +describe('extractModelLoadParams', () => { + it('should return an empty object when no modelParams are provided', () => { + expect(extractModelLoadParams()).toEqual({}) + }) -it('should return an empty object when no modelParams are provided', () => { - expect(extractInferenceParams()).toEqual({}) + it('should extract and normalize valid model load parameters', () => { + const modelParams = { + ctx_len: 2048.5, + ngl: 12.7, + embedding: true, + n_parallel: 4.2, + cpu_threads: 8.9, + prompt_template: 'template', + llama_model_path: '/path/to/model', + vision_model: false, + invalid_param: 'should_be_ignored' + } + + const result = extractModelLoadParams(modelParams as any) + expect(result).toEqual({ + ctx_len: 2048, + ngl: 12, + embedding: true, + n_parallel: 4, + cpu_threads: 8, + prompt_template: 'template', + llama_model_path: '/path/to/model', + vision_model: false + }) + }) + + it('should handle parameters without validation rules', () => { + const modelParams = { + engine: 'llama', + pre_prompt: 'System:', + system_prompt: 'You are helpful', + model_path: '/path' + } + const result = extractModelLoadParams(modelParams as any) + expect(result).toEqual({ + engine: 'llama', + pre_prompt: 'System:', + system_prompt: 'You are helpful', + model_path: '/path' + }) + }) + + it('should fall back to origin params for invalid values', () => { + const modelParams = { ctx_len: -1, ngl: 'invalid' } + const originParams = { ctx_len: 2048, ngl: 12 } + const result = extractModelLoadParams(modelParams as any, originParams) + expect(result).toEqual({}) + }) + + it('should skip invalid values when no origin params provided', () => { + const modelParams = { ctx_len: -1, embedding: true } + const result = extractModelLoadParams(modelParams as any) + expect(result).toEqual({ embedding: true }) + }) }) diff --git a/core/src/browser/models/utils.ts b/core/src/browser/models/utils.ts index f2db40241..d3fe0cb01 100644 --- a/core/src/browser/models/utils.ts +++ b/core/src/browser/models/utils.ts @@ -20,7 +20,7 @@ export const validationRules: { [key: string]: (value: any) => boolean } = { min_p: (value: any) => typeof value === 'number', ctx_len: (value: any) => Number.isInteger(value) && value >= 0, - ngl: (value: any) => Number.isInteger(value), + ngl: (value: any) => Number.isInteger(value) && value >= 0, embedding: (value: any) => typeof value === 'boolean', n_parallel: (value: any) => Number.isInteger(value) && value >= 0, cpu_threads: (value: any) => Number.isInteger(value) && value >= 0, From 2de4990543a170ab7c439c936b22fee37320afc3 Mon Sep 17 00:00:00 2001 From: Daniel Ching Date: Fri, 27 Jun 2025 16:05:36 +0800 Subject: [PATCH 06/48] Cleaned up outdated references in explanation section in jan docs --- .../docs/_assets/llama.cpp-01-updated.png | Bin 0 -> 524093 bytes docs/src/pages/docs/data-folder.mdx | 80 +++++++++++------- docs/src/pages/docs/llama-cpp.mdx | 3 +- 3 files changed, 50 insertions(+), 33 deletions(-) create mode 100644 docs/src/pages/docs/_assets/llama.cpp-01-updated.png diff --git a/docs/src/pages/docs/_assets/llama.cpp-01-updated.png b/docs/src/pages/docs/_assets/llama.cpp-01-updated.png new file mode 100644 index 0000000000000000000000000000000000000000..177c26145eded761eb3ec0a5cb6233f8ec65ea88 GIT binary patch literal 524093 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

jlTJ6z63Ov$}cAg3Nf^yqp+s+nn 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ʶf01~_^@K~i`T{B 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¨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 z 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 Root directory: `~/jan` + ```sh -/assistants - /jan +#updated +/assistants/ + /jan/ assistant.json -/extensions +/engines/ + /llama.cpp/ +/extensions/ extensions.json - /@janhq - /extension_A - package.json -/logs - /app.txt -/models - /model_A - model.yaml - model_A.yaml -/settings - settings.json - /@janhq - /extension_A_Settings - settings.json -/themes - /dark-dimmed - /joi-dark - /joi-light - /night-blue -/threads - /jan_thread_A - messages.jsonl - thread.json - messages.jsonl +/@janhq/ + /assistant-extension/ + /conversational-extension/ + /download-extension/ + /engine-management-extension/ + /hardware-management-extension/ + /inference-cortex-extension/ + /model-extension/ +/files/ +/logs/ + app.log +/models/ + /huggingface.co/ + /Model_Provider_A/ + /Model_A + model_A.gguf + model_A.yaml +/threads/ + /thread_A/ + messages.jsonl + thread.json + ``` ### `assistants/` @@ -93,14 +95,28 @@ Where AI personalities live. The default one (`/assistants/jan/`): ```json { - "avatar": "", + "avatar": "👋", "id": "jan", "object": "assistant", - "created_at": 1715132389207, + "created_at": 1750945742.536, "name": "Jan", - "description": "A default assistant that can use all downloaded models", + "description": "Jan is a helpful desktop assistant that can reason through complex tasks and use tools to complete them on the user’s behalf.", "model": "*", - "instructions": "" + "instructions": "You have access to a set of tools to help you answer the user’s question. You can use only one tool per message, and you’ll receive the result of that tool in the user’s next response. To complete a task, use tools step by step—each step should be guided by the outcome of the previous one.\nTool Usage Rules:\n1. Always provide the correct values as arguments when using tools. Do not pass variable names—use actual values instead.\n2. You may perform multiple tool steps to complete a task.\n3. Avoid repeating a tool call with exactly the same parameters to prevent infinite loops.", + "tools": [ + { + "type": "retrieval", + "enabled": false, + "useTimeWeightedRetriever": false, + "settings": { + "top_k": 2, + "chunk_size": 1024, + "chunk_overlap": 64, + "retrieval_template": "Use the following pieces of context to answer the question at the end.\n----------------\nCONTEXT: {CONTEXT}\n----------------\nQUESTION: {QUESTION}\n----------------\nHelpful Answer:" + } + } + ], + "file_ids": [] } ``` @@ -140,7 +156,7 @@ Debugging headquarters (`/logs/app.txt`): The silicon brain collection. Each model has its own `model.json`. -Full parameters: [here](/docs/models/model-parameters) +Full parameters: [here](/docs/model-parameters) ### `settings/` diff --git a/docs/src/pages/docs/llama-cpp.mdx b/docs/src/pages/docs/llama-cpp.mdx index 2b4d76738..b76c42ea3 100644 --- a/docs/src/pages/docs/llama-cpp.mdx +++ b/docs/src/pages/docs/llama-cpp.mdx @@ -33,7 +33,7 @@ import { Settings, EllipsisVertical, Plus, FolderOpen, Pencil } from 'lucide-rea Jan uses **llama.cpp** for running local AI models. You can find its settings in **Settings** () > **Local Engine** > **llama.cpp**:
-![llama.cpp](./_assets/llama.cpp-01.png) +![llama.cpp](./_assets/llama.cpp-01-updated.png)
These settings are for advanced users, you would want to check these settings when: @@ -151,6 +151,7 @@ For detailed hardware compatibility, please visit our guide for [Mac](/docs/desk | **Caching** | - Enable to store recent prompts and responses

- Improves response time for repeated prompts | Enabled | | **KV Cache Type** | - KV cache implementation type; controls memory usage and precision trade-off

- Options:

• f16 (most stable)

• q8_0 (balanced)

• q4_0 (lowest memory) | f16 | | **mmap** | - Enables memory-mapped model loading

- Reduces memory usage

- Recommended for large models | Enabled | +| **Context Shift** | - Automatically shifts the context window when the model is unable to process the entire prompt
- Ensures that the most relevant information is always included
- Recommended for long conversations and multiple tool calls | Disabled | ## Best Practices From 5fa9b9b66d5beb0eefcaf25b14cd5210c79a8680 Mon Sep 17 00:00:00 2001 From: Daniel Ching Date: Fri, 27 Jun 2025 16:43:21 +0800 Subject: [PATCH 07/48] update jan data-folder --- docs/src/pages/docs/data-folder.mdx | 76 ++++++++++++++++------------- 1 file changed, 42 insertions(+), 34 deletions(-) diff --git a/docs/src/pages/docs/data-folder.mdx b/docs/src/pages/docs/data-folder.mdx index 2a3873b43..d72e16d76 100644 --- a/docs/src/pages/docs/data-folder.mdx +++ b/docs/src/pages/docs/data-folder.mdx @@ -58,7 +58,6 @@ Root directory: `~/jan` ```sh -#updated /assistants/ /jan/ assistant.json @@ -190,54 +189,63 @@ GPU settings (`settings.json`): | is_initial | First run flag | | vulkan | Vulkan support | -### `themes/` -Visual wardrobe. Each theme's `theme.json`: - -| Parameter | Description | -|------------------|-------------------------------------------| -| id | Theme identifier | -| displayName | UI name | -| reduceTransparent| Transparency control | -| nativeTheme | OS theme sync | -| variables | Component settings | ### `threads/` Chat archive. Each thread (`/threads/jan_unixstamp/`) contains: - `messages.jsonl`: ```json - { - "id":"01J6Y6FH8PFTHQB5PNJTHEN27C", - "thread_id":"jan_1725437954", - "type":"Thread", - "role":"assistant", - "content": - [ - { - "type": "text", - "text": { - "value": "Hello! Is there something I can help you with or would you like to chat?", - "annotations": [] - } - } - ], - "status": "ready", - "created": 1725442802966, - "updated": 1725442802966, - "object": "thread.message" - } + { + "completed_at": 0, + "content": [ + { + "text": { + "annotations": [], + "value": "Hello! I can help you with various tasks. I can search for information on the internet, including news, videos, images, shopping, and more. I can also scrape webpages to extract specific information. Let me know what you need!" + }, + "type": "text" + } + ], + "created_at": 1751012639307, + "id": "01JYR7S0JB5ZBGMJV52KWMW5VW", + "metadata": { + "assistant": { + "avatar": "👋", + "id": "jan", + "instructions": "You have access to a set of tools to help you answer the user's question. You can use only one tool per message, and you'll receive the result of that tool in the user's next response. To complete a task, use tools step by step—each step should be guided by the outcome of the previous one.\nTool Usage Rules:\n1. Always provide the correct values as arguments when using tools. Do not pass variable names—use actual values instead.\n2. You may perform multiple tool steps to complete a task.\n3. Avoid repeating a tool call with exactly the same parameters to prevent infinite loops.", + "name": "Jan", + "parameters": "" + }, + "tokenSpeed": { + "lastTimestamp": 1751012637097, + "message": "01JYR7S0GW5M9PSHMRE7T8VQJM", + "tokenCount": 49, + "tokenSpeed": 22.653721682847895 + } + }, + "object": "thread.message", + "role": "assistant", + "status": "ready", + "thread_id": "8f2c9922-db49-4d1e-8620-279c05baf2d0", + "type": "text" + } ``` - `thread.json`: | Parameter | Description | |------------|------------------------------------------------| +| assistants | Assistant configuration clone | +| created | Creation timestamp | | id | Thread identifier | +| metadata | Additional thread data | +| model | Active model settings | | object | OpenAI compatibility marker | | title | Thread name | -| assistants | Assistant configuration clone | -| model | Active model settings | -| metadata | Additional thread data | +| updated | Updated timestamp | + + + ## Delete Jan Data Uninstall guides: [Mac](/docs/desktop/mac#step-2-clean-up-data-optional), From 50f3563a96cb2b571bcce150ebda75b7b3a4c48c Mon Sep 17 00:00:00 2001 From: DistractionRectangle <48034372+DistractionRectangle@users.noreply.github.com> Date: Fri, 27 Jun 2025 09:16:25 -0700 Subject: [PATCH 08/48] =?UTF-8?q?=F0=9F=90=9Bfix:=20Tauri=20AppImage=20fai?= =?UTF-8?q?ling=20to=20render=20on=20wayland=20+=20mesa=20(#5463)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/template-tauri-build-linux-x64.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/template-tauri-build-linux-x64.yml b/.github/workflows/template-tauri-build-linux-x64.yml index 9356c3f28..14cf6d6b8 100644 --- a/.github/workflows/template-tauri-build-linux-x64.yml +++ b/.github/workflows/template-tauri-build-linux-x64.yml @@ -151,6 +151,12 @@ jobs: fi - name: Build app run: | + # Pin linuxdeploy version to prevent @tauri-apps/cli-linux-x64-gnu from pulling in an outdated version + TAURI_TOOLKIT_PATH="${XDG_CACHE_HOME:-$HOME/.cache}/tauri" + mkdir -p "$TAURI_TOOLKIT_PATH" + wget https://github.com/linuxdeploy/linuxdeploy/releases/download/1-alpha-20250213-2/linuxdeploy-x86_64.AppImage -O "$TAURI_TOOLKIT_PATH/linuxdeploy-x86_64.AppImage" + chmod +x "$TAURI_TOOLKIT_PATH/linuxdeploy-x86_64.AppImage" + make build-tauri # Copy engines and bun to appimage wget https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage -O ./appimagetool From 35154887e300dbb8d4da4b98ce132911e81af51d Mon Sep 17 00:00:00 2001 From: hiento09 <136591877+hiento09@users.noreply.github.com> Date: Sun, 29 Jun 2025 22:34:36 +0700 Subject: [PATCH 09/48] chore: deprecate ci environment (#5592) --- .github/workflows/publish-npm-core.yml | 1 - .github/workflows/template-electron-build-linux-x64.yml | 6 ++---- .github/workflows/template-electron-build-macos.yml | 7 +++---- .github/workflows/template-get-update-version.yml | 1 - .../template-noti-discord-and-update-url-readme.yml | 1 - .github/workflows/template-tauri-build-linux-x64.yml | 1 - .github/workflows/template-tauri-build-macos.yml | 1 - 7 files changed, 5 insertions(+), 13 deletions(-) diff --git a/.github/workflows/publish-npm-core.yml b/.github/workflows/publish-npm-core.yml index 403deb100..f719ab3d4 100644 --- a/.github/workflows/publish-npm-core.yml +++ b/.github/workflows/publish-npm-core.yml @@ -6,7 +6,6 @@ on: workflow_dispatch: jobs: build-and-publish-plugins: - environment: production runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 diff --git a/.github/workflows/template-electron-build-linux-x64.yml b/.github/workflows/template-electron-build-linux-x64.yml index 4dfab5c09..cef11cb0f 100644 --- a/.github/workflows/template-electron-build-linux-x64.yml +++ b/.github/workflows/template-electron-build-linux-x64.yml @@ -43,7 +43,6 @@ jobs: build-linux-x64: if: inputs.public_provider == 'github' || inputs.public_provider == 'none' runs-on: ubuntu-latest - environment: production permissions: contents: write steps: @@ -76,7 +75,6 @@ jobs: cp electron/icons_dev/jan-nightly-tray@2x.png electron/icons/icon-tray@2x.png cp electron/icons_dev/jan-nightly-tray.png electron/icons/icon-tray.png - - name: Installing node uses: actions/setup-node@v1 with: @@ -131,7 +129,7 @@ jobs: env: VERSION_TAG: ${{ inputs.new_version }} - - name: Build and publish app to aws s3 r2 or github artifactory + - name: Build and publish app to aws s3 r2 or github artifactory if: inputs.public_provider != 'github' run: | # check public_provider is true or not @@ -185,4 +183,4 @@ jobs: uses: actions/upload-artifact@v4 with: name: jan-electron-linux-amd64-${{ inputs.new_version }}-AppImage - path: ./electron/dist/*.AppImage \ No newline at end of file + path: ./electron/dist/*.AppImage diff --git a/.github/workflows/template-electron-build-macos.yml b/.github/workflows/template-electron-build-macos.yml index ab9f002cb..8bcdcdf95 100644 --- a/.github/workflows/template-electron-build-macos.yml +++ b/.github/workflows/template-electron-build-macos.yml @@ -53,7 +53,6 @@ jobs: build-macos: if: inputs.public_provider == 'github' || inputs.public_provider == 'none' runs-on: macos-latest - environment: production permissions: contents: write steps: @@ -61,7 +60,7 @@ jobs: uses: actions/checkout@v3 with: ref: ${{ inputs.ref }} - + - name: Replace Icons for Beta Build if: inputs.beta == true && inputs.nightly != true shell: bash @@ -161,7 +160,7 @@ jobs: p12-file-base64: ${{ secrets.CODE_SIGN_P12_BASE64 }} p12-password: ${{ secrets.CODE_SIGN_P12_PASSWORD }} - - name: Build and publish app to aws s3 r2 or github artifactory + - name: Build and publish app to aws s3 r2 or github artifactory if: inputs.public_provider != 'github' run: | # check public_provider is true or not @@ -231,4 +230,4 @@ jobs: uses: actions/upload-artifact@v4 with: name: jan-electron-mac-universal-${{ inputs.new_version }} - path: ./electron/dist/*.dmg \ No newline at end of file + path: ./electron/dist/*.dmg diff --git a/.github/workflows/template-get-update-version.yml b/.github/workflows/template-get-update-version.yml index 70f5eace9..2d992fbec 100644 --- a/.github/workflows/template-get-update-version.yml +++ b/.github/workflows/template-get-update-version.yml @@ -9,7 +9,6 @@ on: jobs: get-update-version: runs-on: ubuntu-latest - environment: production outputs: new_version: ${{ steps.version_update.outputs.new_version }} steps: diff --git a/.github/workflows/template-noti-discord-and-update-url-readme.yml b/.github/workflows/template-noti-discord-and-update-url-readme.yml index eaaee7e50..ce288f541 100644 --- a/.github/workflows/template-noti-discord-and-update-url-readme.yml +++ b/.github/workflows/template-noti-discord-and-update-url-readme.yml @@ -26,7 +26,6 @@ on: jobs: noti-discord-and-update-url-readme: - environment: production runs-on: ubuntu-latest permissions: contents: write diff --git a/.github/workflows/template-tauri-build-linux-x64.yml b/.github/workflows/template-tauri-build-linux-x64.yml index 18f6c40e9..274aa3662 100644 --- a/.github/workflows/template-tauri-build-linux-x64.yml +++ b/.github/workflows/template-tauri-build-linux-x64.yml @@ -55,7 +55,6 @@ jobs: DEB_SIG: ${{ steps.packageinfo.outputs.DEB_SIG }} APPIMAGE_SIG: ${{ steps.packageinfo.outputs.APPIMAGE_SIG }} APPIMAGE_FILE_NAME: ${{ steps.packageinfo.outputs.APPIMAGE_FILE_NAME }} - environment: production permissions: contents: write steps: diff --git a/.github/workflows/template-tauri-build-macos.yml b/.github/workflows/template-tauri-build-macos.yml index 086e14ad2..038a084fa 100644 --- a/.github/workflows/template-tauri-build-macos.yml +++ b/.github/workflows/template-tauri-build-macos.yml @@ -63,7 +63,6 @@ jobs: outputs: MAC_UNIVERSAL_SIG: ${{ steps.metadata.outputs.MAC_UNIVERSAL_SIG }} TAR_NAME: ${{ steps.metadata.outputs.TAR_NAME }} - environment: production permissions: contents: write steps: From 5918c9cd6fcbaf90817ab681f1efb19889f2143b Mon Sep 17 00:00:00 2001 From: Sam Hoang Van Date: Mon, 30 Jun 2025 10:56:23 +0700 Subject: [PATCH 10/48] fix: custom based url and header by upgrade token.js version (#5596) --- web-app/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web-app/package.json b/web-app/package.json index 0272d1151..171966560 100644 --- a/web-app/package.json +++ b/web-app/package.json @@ -66,7 +66,7 @@ "remark-math": "^6.0.0", "sonner": "^2.0.3", "tailwindcss": "^4.1.4", - "token.js": "npm:token.js-fork@0.7.9", + "token.js": "npm:token.js-fork@0.7.12", "tw-animate-css": "^1.2.7", "ulidx": "^2.4.1", "unified": "^11.0.5", From 1444374fea1a6b400d6390c7055cad5d1195b27b Mon Sep 17 00:00:00 2001 From: Daniel Ching Date: Mon, 30 Jun 2025 12:15:20 +0800 Subject: [PATCH 11/48] Removed Max Tokens and Stop Sequences from docs as they are no longer present in model settings --- docs/src/pages/docs/model-parameters.mdx | 2 -- 1 file changed, 2 deletions(-) diff --git a/docs/src/pages/docs/model-parameters.mdx b/docs/src/pages/docs/model-parameters.mdx index 86846a8ea..56286bcf4 100644 --- a/docs/src/pages/docs/model-parameters.mdx +++ b/docs/src/pages/docs/model-parameters.mdx @@ -38,8 +38,6 @@ These settings are available in the model settings modal: | **Repeat Last N** | Number of tokens to consider for repeat penalty. | | **Repeat Penalty** | Penalize repeating token sequences. | | **Presence Penalty**| Penalize alpha presence (encourages new topics). | -| **Max Tokens** | Maximum length of the model's response. | -| **Stop Sequences** | Tokens or phrases that will end the model's response. | | **Frequency Penalty** | Reduces word repetition. |
From d05e5a5dae0de8d802171b7d37b64f5b7685f960 Mon Sep 17 00:00:00 2001 From: Daniel Ching Date: Mon, 30 Jun 2025 12:17:17 +0800 Subject: [PATCH 12/48] Removed settings/ folder and GPU settings (settings.json) --- docs/src/pages/docs/data-folder.mdx | 32 ----------------------------- 1 file changed, 32 deletions(-) diff --git a/docs/src/pages/docs/data-folder.mdx b/docs/src/pages/docs/data-folder.mdx index d72e16d76..f073152b3 100644 --- a/docs/src/pages/docs/data-folder.mdx +++ b/docs/src/pages/docs/data-folder.mdx @@ -158,38 +158,6 @@ The silicon brain collection. Each model has its own `model.json`. Full parameters: [here](/docs/model-parameters) -### `settings/` -Control panel. Extension settings in `/settings/@janhq/`: - -| Parameter | Description | -|----------------|----------------------------------------------------| -| key | Setting identifier | -| title | Display name | -| description | Setting explanation | -| controllerType | UI component type | -| controllerProps| Component properties | -| extensionName | Parent extension link | - -GPU settings (`settings.json`): - -| Parameter | Description | -|----------------------|--------------------------------------------| -| notify | Notification status | -| run_mode | Operating mode | -| nvidia_driver.exist | NVIDIA driver presence | -| nvidia_driver.version| Driver version | -| cuda.exist | CUDA availability | -| cuda.version | CUDA version | -| gpus[0].id | GPU identifier | -| gpus[0].vram | GPU memory (MB) | -| gpus[0].name | GPU model | -| gpus[0].arch | GPU architecture | -| gpu_highest_vram | Most capable GPU | -| gpus_in_use | Active GPUs | -| is_initial | First run flag | -| vulkan | Vulkan support | - - ### `threads/` Chat archive. Each thread (`/threads/jan_unixstamp/`) contains: From 3e22835049b19511fcf58bc0bcffa6a69c015029 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 30 Jun 2025 08:44:31 +0000 Subject: [PATCH 13/48] chore(deps-dev): bump rimraf in /extensions/download-extension --- updated-dependencies: - dependency-name: rimraf dependency-version: 6.0.1 dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- extensions/download-extension/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/download-extension/package.json b/extensions/download-extension/package.json index 1c3f2f174..f15f12bdb 100644 --- a/extensions/download-extension/package.json +++ b/extensions/download-extension/package.json @@ -13,7 +13,7 @@ }, "devDependencies": { "cpx": "^1.5.0", - "rimraf": "^3.0.2", + "rimraf": "^6.0.1", "rolldown": "1.0.0-beta.1", "run-script-os": "^1.1.6", "typescript": "5.8.3", From 1c9a64855eba0917cd964d52b9cfb8f6bf2aa866 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 30 Jun 2025 08:49:18 +0000 Subject: [PATCH 14/48] chore(deps-dev): bump rimraf in /extensions/conversational-extension --- updated-dependencies: - dependency-name: rimraf dependency-version: 6.0.1 dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- extensions/conversational-extension/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/conversational-extension/package.json b/extensions/conversational-extension/package.json index abb76e4d0..26ba21b9d 100644 --- a/extensions/conversational-extension/package.json +++ b/extensions/conversational-extension/package.json @@ -17,7 +17,7 @@ }, "devDependencies": { "cpx": "^1.5.0", - "rimraf": "^3.0.2", + "rimraf": "^6.0.1", "rolldown": "1.0.0-beta.1", "ts-loader": "^9.5.0", "typescript": "^5.7.2" From c35883180825bd9717ec8bfacaa2b4cbe18cbed7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 30 Jun 2025 08:51:12 +0000 Subject: [PATCH 15/48] chore(deps-dev): bump rimraf in /extensions/assistant-extension --- updated-dependencies: - dependency-name: rimraf dependency-version: 6.0.1 dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- extensions/assistant-extension/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/assistant-extension/package.json b/extensions/assistant-extension/package.json index 4761aa900..f17d42588 100644 --- a/extensions/assistant-extension/package.json +++ b/extensions/assistant-extension/package.json @@ -13,7 +13,7 @@ }, "devDependencies": { "cpx": "^1.5.0", - "rimraf": "^3.0.2", + "rimraf": "^6.0.1", "rolldown": "1.0.0-beta.1", "run-script-os": "^1.1.6", "typescript": "^5.3.3" From aa59a70b886125f6d4a6341ff608a66f00ae92fc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 30 Jun 2025 09:02:19 +0000 Subject: [PATCH 16/48] chore(deps-dev): bump rimraf from 3.0.2 to 6.0.1 in /core --- updated-dependencies: - dependency-name: rimraf dependency-version: 6.0.1 dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- core/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/package.json b/core/package.json index dffc2bcfd..1654bf74d 100644 --- a/core/package.json +++ b/core/package.json @@ -36,7 +36,7 @@ "pacote": "^21.0.0", "request": "^2.88.2", "request-progress": "^3.0.0", - "rimraf": "^3.0.2", + "rimraf": "^6.0.1", "rolldown": "1.0.0-beta.1", "ts-jest": "^29.2.5", "tslib": "^2.6.2", From 229bed995566d8634573ccf661f7e2d217a1dc5b Mon Sep 17 00:00:00 2001 From: Daniel Ching Date: Mon, 30 Jun 2025 17:22:59 +0800 Subject: [PATCH 17/48] Updated continue-dev documentation --- .../docs/server-examples/continue-dev.mdx | 47 +++++++++++-------- 1 file changed, 28 insertions(+), 19 deletions(-) diff --git a/docs/src/pages/docs/server-examples/continue-dev.mdx b/docs/src/pages/docs/server-examples/continue-dev.mdx index c6b9d50a8..a982697ba 100644 --- a/docs/src/pages/docs/server-examples/continue-dev.mdx +++ b/docs/src/pages/docs/server-examples/continue-dev.mdx @@ -36,11 +36,15 @@ Follow this [guide](https://continue.dev/docs/quickstart) to install the Continu To set up Continue for use with Jan's Local Server, you must activate the Jan API Server with your chosen model. -1. Press the `<>` button. Jan will take you to the **Local API Server** section. +1. Press the `⚙️ Settings` button. -2. Setup the server, which includes the **IP Port**, **Cross-Origin-Resource-Sharing (CORS)** and **Verbose Server Logs**. +2. Locate `Local API Server`. -3. Press the **Start Server** button +3. Setup the server, which includes the **IP Port**, **Cross-Origin-Resource-Sharing (CORS)** and **Verbose Server Logs**. + +4. Include your user-defined API Key. + +5. Press the **Start Server** button ### Step 3: Configure Continue to Use Jan's Local Server @@ -64,30 +68,35 @@ To set up Continue for use with Jan's Local Server, you must activate the Jan AP -```json title="~/.continue/config.json" -{ - "models": [ - { - "title": "Jan", - "provider": "openai", - "model": "mistral-ins-7b-q4", - "apiKey": "EMPTY", - "apiBase": "http://localhost:1337/v1" - } - ] -} +```yaml title="~/.continue/config.yaml" +name: Local Assistant +version: 1.0.0 +schema: v1 +models: + - name: Jan + provider: openai + model: #MODEL_NAME (e.g. qwen3:0.6b) + apiKey: #YOUR_USER_DEFINED_API_KEY_HERE (e.g. hello) + apiBase: http://localhost:1337/v1 +context: + - provider: code + - provider: docs + - provider: diff + - provider: terminal + - provider: problems + - provider: folder + - provider: codebase ``` 2. Ensure the file has the following configurations: - Ensure `openai` is selected as the `provider`. - Match the `model` with the one enabled in the Jan API Server. - - Set `apiBase` to `http://localhost:1337`. - - Leave the `apiKey` field to `EMPTY`. + - Set `apiBase` to `http://localhost:1337/v1`. ### Step 4: Ensure the Using Model Is Activated in Jan -1. Navigate to `Settings` > `My Models`. -2. Click the **three dots (⋮)** button. +1. Navigate to `Settings` > `Model Providers`. +2. Under Llama.cpp, find the model that you would want to use. 3. Select the **Start Model** button to activate the model. From c251b04d153efa411f9165824ac0969300e29653 Mon Sep 17 00:00:00 2001 From: Bui Quang Huy <34532913+LazyYuuki@users.noreply.github.com> Date: Tue, 1 Jul 2025 00:14:00 +0800 Subject: [PATCH 18/48] Update goal.md --- .github/ISSUE_TEMPLATE/goal.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/goal.md b/.github/ISSUE_TEMPLATE/goal.md index f5f5f4dff..ba69dcc2e 100644 --- a/.github/ISSUE_TEMPLATE/goal.md +++ b/.github/ISSUE_TEMPLATE/goal.md @@ -1,16 +1,15 @@ --- name: Goal -about: Team-wide Quarterly Goals for Jan +about: title: 'goal: ' labels: '' +type: Goal assignees: freelerobot --- ## Goal -## Motivation +## Tasklist -## Key Outcomes - -## Related Epics +## Out of scope From 69438035ebfe019c193fbf0a1bde077b41910bb3 Mon Sep 17 00:00:00 2001 From: Bui Quang Huy <34532913+LazyYuuki@users.noreply.github.com> Date: Tue, 1 Jul 2025 00:29:19 +0800 Subject: [PATCH 19/48] Update and rename goal.md to goal.yml --- .github/ISSUE_TEMPLATE/{goal.md => goal.yml} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename .github/ISSUE_TEMPLATE/{goal.md => goal.yml} (61%) diff --git a/.github/ISSUE_TEMPLATE/goal.md b/.github/ISSUE_TEMPLATE/goal.yml similarity index 61% rename from .github/ISSUE_TEMPLATE/goal.md rename to .github/ISSUE_TEMPLATE/goal.yml index ba69dcc2e..b732042e6 100644 --- a/.github/ISSUE_TEMPLATE/goal.md +++ b/.github/ISSUE_TEMPLATE/goal.yml @@ -1,6 +1,6 @@ --- name: Goal -about: +about: "Communicate externally the roadmap/goal that Jan is heading toward" title: 'goal: ' labels: '' type: Goal From 05a74481fa177d526961998492321086515d5aba Mon Sep 17 00:00:00 2001 From: Bui Quang Huy <34532913+LazyYuuki@users.noreply.github.com> Date: Tue, 1 Jul 2025 00:36:25 +0800 Subject: [PATCH 20/48] Update goal.yml --- .github/ISSUE_TEMPLATE/goal.yml | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/goal.yml b/.github/ISSUE_TEMPLATE/goal.yml index b732042e6..9a3168cd2 100644 --- a/.github/ISSUE_TEMPLATE/goal.yml +++ b/.github/ISSUE_TEMPLATE/goal.yml @@ -1,15 +1,27 @@ ---- -name: Goal -about: "Communicate externally the roadmap/goal that Jan is heading toward" +name: "Goal" +description: "Communicate externally the roadmap/goal that Jan is heading toward" title: 'goal: ' labels: '' -type: Goal +type: "Goal" assignees: freelerobot +body: + - type: textarea + validations: + required: true + attributes: + label: "Goal" + description: "Describe the conten of the goal" ---- + - type: textarea + validations: + required: true + attributes: + label: "Tasklist" + description: "List of task to complete to reach the goal" -## Goal - -## Tasklist - -## Out of scope + - type: textarea + validations: + required: true + attributes: + label: "Out of scope" + description: "List of things that is out of scope for this goal" From 8a309cf3d92ac6708fb4dedf3b2af7e83027abfb Mon Sep 17 00:00:00 2001 From: Bui Quang Huy <34532913+LazyYuuki@users.noreply.github.com> Date: Tue, 1 Jul 2025 00:40:13 +0800 Subject: [PATCH 21/48] Fix goal.yml --- .github/ISSUE_TEMPLATE/goal.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/goal.yml b/.github/ISSUE_TEMPLATE/goal.yml index 9a3168cd2..91adf5530 100644 --- a/.github/ISSUE_TEMPLATE/goal.yml +++ b/.github/ISSUE_TEMPLATE/goal.yml @@ -1,7 +1,6 @@ name: "Goal" description: "Communicate externally the roadmap/goal that Jan is heading toward" title: 'goal: ' -labels: '' type: "Goal" assignees: freelerobot body: From 0e41502bcc59c8c3307872143367daaf45d5c92a Mon Sep 17 00:00:00 2001 From: Bui Quang Huy <34532913+LazyYuuki@users.noreply.github.com> Date: Tue, 1 Jul 2025 00:53:22 +0800 Subject: [PATCH 22/48] Update goal.yml --- .github/ISSUE_TEMPLATE/goal.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/goal.yml b/.github/ISSUE_TEMPLATE/goal.yml index 91adf5530..084c92312 100644 --- a/.github/ISSUE_TEMPLATE/goal.yml +++ b/.github/ISSUE_TEMPLATE/goal.yml @@ -1,7 +1,8 @@ -name: "Goal" +name: "\U0001F3AF Goal" description: "Communicate externally the roadmap/goal that Jan is heading toward" title: 'goal: ' type: "Goal" +projects: "menloresearch/jan" assignees: freelerobot body: - type: textarea @@ -19,8 +20,6 @@ body: description: "List of task to complete to reach the goal" - type: textarea - validations: - required: true attributes: label: "Out of scope" description: "List of things that is out of scope for this goal" From bfa5410a52890820f69097ee485747d37511b38b Mon Sep 17 00:00:00 2001 From: Bui Quang Huy <34532913+LazyYuuki@users.noreply.github.com> Date: Tue, 1 Jul 2025 00:57:07 +0800 Subject: [PATCH 23/48] Update goal.yml --- .github/ISSUE_TEMPLATE/goal.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/goal.yml b/.github/ISSUE_TEMPLATE/goal.yml index 084c92312..793cfb729 100644 --- a/.github/ISSUE_TEMPLATE/goal.yml +++ b/.github/ISSUE_TEMPLATE/goal.yml @@ -2,7 +2,7 @@ name: "\U0001F3AF Goal" description: "Communicate externally the roadmap/goal that Jan is heading toward" title: 'goal: ' type: "Goal" -projects: "menloresearch/jan" +projects: "Jan" assignees: freelerobot body: - type: textarea From 9fe34ca2261cc7c80b1c197996d7958d02f9b9c4 Mon Sep 17 00:00:00 2001 From: Bui Quang Huy <34532913+LazyYuuki@users.noreply.github.com> Date: Tue, 1 Jul 2025 01:02:32 +0800 Subject: [PATCH 24/48] Update goal.yml --- .github/ISSUE_TEMPLATE/goal.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/goal.yml b/.github/ISSUE_TEMPLATE/goal.yml index 793cfb729..639620e30 100644 --- a/.github/ISSUE_TEMPLATE/goal.yml +++ b/.github/ISSUE_TEMPLATE/goal.yml @@ -2,7 +2,7 @@ name: "\U0001F3AF Goal" description: "Communicate externally the roadmap/goal that Jan is heading toward" title: 'goal: ' type: "Goal" -projects: "Jan" +projects: ["menloresearch/Jan"] assignees: freelerobot body: - type: textarea From 0d20f2e0b82a22ebfbde83692f0a0088a4c0a917 Mon Sep 17 00:00:00 2001 From: Bui Quang Huy <34532913+LazyYuuki@users.noreply.github.com> Date: Tue, 1 Jul 2025 01:06:04 +0800 Subject: [PATCH 25/48] Update goal.yml --- .github/ISSUE_TEMPLATE/goal.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/goal.yml b/.github/ISSUE_TEMPLATE/goal.yml index 639620e30..d52ea1619 100644 --- a/.github/ISSUE_TEMPLATE/goal.yml +++ b/.github/ISSUE_TEMPLATE/goal.yml @@ -2,7 +2,7 @@ name: "\U0001F3AF Goal" description: "Communicate externally the roadmap/goal that Jan is heading toward" title: 'goal: ' type: "Goal" -projects: ["menloresearch/Jan"] +projects: ["menloresearch/30"] assignees: freelerobot body: - type: textarea From 03f30b8a1d6cb15a5a3e7d26ab17e10d618d7aaf Mon Sep 17 00:00:00 2001 From: Bui Quang Huy <34532913+LazyYuuki@users.noreply.github.com> Date: Tue, 1 Jul 2025 01:12:25 +0800 Subject: [PATCH 26/48] Update bug_report.yml --- .github/ISSUE_TEMPLATE/bug_report.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 940383f72..b429b670a 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -1,7 +1,8 @@ name: "\U0001F41B Bug Report" +title: 'bug: ' description: "If something isn't working as expected \U0001F914" -title: 'bug: [DESCRIPTION]' - +type: "Bug" +projects: ["menloresearch/30"] body: - type: input validations: From f4b6a2054ebf8a1998dc374529dfdfb52c627780 Mon Sep 17 00:00:00 2001 From: Bui Quang Huy <34532913+LazyYuuki@users.noreply.github.com> Date: Tue, 1 Jul 2025 01:14:03 +0800 Subject: [PATCH 27/48] Update feature_request.yml --- .github/ISSUE_TEMPLATE/feature_request.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml index 8e7fb4ca7..6c1c10583 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yml +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -1,7 +1,8 @@ name: "\U0001F680 Feature Request" +title: 'idea: ' description: "Suggest an idea for this project \U0001F63B!" -title: 'idea: [DESCRIPTION]' labels: 'feature request' +projects: ["menloresearch/30"] body: - type: textarea validations: @@ -17,4 +18,4 @@ body: required: true attributes: label: "Feature Idea" - description: "Describe what you want instead. Examples are welcome!" \ No newline at end of file + description: "Describe what you want instead. Examples are welcome!" From 5c988d8890ddc83654ef64eaa0d42bef2463043f Mon Sep 17 00:00:00 2001 From: Bui Quang Huy <34532913+LazyYuuki@users.noreply.github.com> Date: Tue, 1 Jul 2025 01:17:25 +0800 Subject: [PATCH 28/48] Delete .github/ISSUE_TEMPLATE/model_request.yml --- .github/ISSUE_TEMPLATE/model_request.yml | 21 --------------------- 1 file changed, 21 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE/model_request.yml diff --git a/.github/ISSUE_TEMPLATE/model_request.yml b/.github/ISSUE_TEMPLATE/model_request.yml deleted file mode 100644 index 7f7c4f63c..000000000 --- a/.github/ISSUE_TEMPLATE/model_request.yml +++ /dev/null @@ -1,21 +0,0 @@ -name: "\U0001F929 Model Request" -description: "Request a new model to be compiled" -title: 'feat: [DESCRIPTION]' -labels: 'type: model request' -body: - - type: markdown - attributes: - value: "**Tip:** Download any HuggingFace model in app ([see guides](https://jan.ai/docs/models/manage-models#add-models)). Use this form for unsupported models only." - - type: textarea - validations: - required: true - attributes: - label: "Model Requests" - description: "If applicable, include the source URL, licenses, and any other relevant information" - - type: checkboxes - attributes: - label: "Which formats?" - options: - - label: GGUF (llama.cpp) - - label: TensorRT (TensorRT-LLM) - - label: ONNX (Onnx Runtime) From 73ff61620ea1856d1af6bfab4aea1c62e474f1f1 Mon Sep 17 00:00:00 2001 From: Bui Quang Huy <34532913+LazyYuuki@users.noreply.github.com> Date: Tue, 1 Jul 2025 01:18:35 +0800 Subject: [PATCH 29/48] Update config.yml Disable blank issues --- .github/ISSUE_TEMPLATE/config.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 2d49f0d6e..b507198d3 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,7 +1,7 @@ ## To encourage contributors to use issue templates, we don't allow blank issues -blank_issues_enabled: true +blank_issues_enabled: false contact_links: - name: "\1F4AC Jan Discussions" url: "https://github.com/orgs/menloresearch/discussions/categories/q-a" - about: "Get help, discuss features & roadmap, and share your projects" \ No newline at end of file + about: "Get help, discuss features & roadmap, and share your projects" From f24346b4fa81ce3c8582f8665ae101577051c07f Mon Sep 17 00:00:00 2001 From: Bui Quang Huy <34532913+LazyYuuki@users.noreply.github.com> Date: Tue, 1 Jul 2025 01:30:53 +0800 Subject: [PATCH 30/48] Update config.yml --- .github/ISSUE_TEMPLATE/config.yml | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index b507198d3..550b73916 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,7 +1,5 @@ -## To encourage contributors to use issue templates, we don't allow blank issues blank_issues_enabled: false - contact_links: - - name: "\1F4AC Jan Discussions" - url: "https://github.com/orgs/menloresearch/discussions/categories/q-a" - about: "Get help, discuss features & roadmap, and share your projects" + - name: Jan Discussions + url: https://github.com/orgs/menloresearch/discussions/categories/q-a + about: Get help, discuss features & roadmap, and share your projects From c3b6a08ff39c28c3e85c865db3982245161abfcb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 30 Jun 2025 18:12:27 +0000 Subject: [PATCH 31/48] chore(deps-dev): bump jest and @types/jest --- updated-dependencies: - dependency-name: jest dependency-version: 30.0.3 dependency-type: direct:development update-type: version-update:semver-major - dependency-name: "@types/jest" dependency-version: 30.0.0 dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- core/package.json | 4 +- package.json | 2 +- yarn.lock | 1493 ++++++++++++++++++++++++++++++++++++--------- 3 files changed, 1218 insertions(+), 281 deletions(-) diff --git a/core/package.json b/core/package.json index 1654bf74d..22c815e5b 100644 --- a/core/package.json +++ b/core/package.json @@ -23,14 +23,14 @@ }, "devDependencies": { "@npmcli/arborist": "^7.1.0", - "@types/jest": "^29.5.14", + "@types/jest": "^30.0.0", "@types/node": "^22.10.0", "@types/pacote": "^11.1.7", "@types/request": "^2.48.12", "electron": "33.2.1", "eslint": "8.57.0", "eslint-plugin-jest": "^27.9.0", - "jest": "^29.7.0", + "jest": "^30.0.3", "jest-junit": "^16.0.0", "jest-runner": "^29.7.0", "pacote": "^21.0.0", diff --git a/package.json b/package.json index 7e525f07b..7be0e769d 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,7 @@ "cpx": "^1.5.0", "cross-env": "^7.0.3", "husky": "^9.1.5", - "jest": "^29.7.0", + "jest": "^30.0.3", "jest-environment-jsdom": "^29.7.0", "rimraf": "^3.0.2", "run-script-os": "^1.1.6", diff --git a/yarn.lock b/yarn.lock index f7b708e02..44ca3958b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1119,6 +1119,17 @@ __metadata: languageName: node linkType: hard +"@babel/code-frame@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/code-frame@npm:7.27.1" + dependencies: + "@babel/helper-validator-identifier": "npm:^7.27.1" + js-tokens: "npm:^4.0.0" + picocolors: "npm:^1.1.1" + checksum: 10c0/5dd9a18baa5fce4741ba729acc3a3272c49c25cb8736c4b18e113099520e7ef7b545a4096a26d600e4416157e63e87d66db46aa3fbf0a5f2286da2705c12da00 + languageName: node + linkType: hard + "@babel/compat-data@npm:^7.26.5": version: 7.26.8 resolution: "@babel/compat-data@npm:7.26.8" @@ -1126,6 +1137,13 @@ __metadata: languageName: node linkType: hard +"@babel/compat-data@npm:^7.27.2": + version: 7.27.7 + resolution: "@babel/compat-data@npm:7.27.7" + checksum: 10c0/08f2d3bd1b38e7e8cd159c5ddeb458696338ef7cd3fe0cc4384a0af5353ef8577ee3f25f01f0a88544c0e7ada972d0d2826a06744c695b211bfb172b76c0ca38 + languageName: node + linkType: hard + "@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.23.9": version: 7.26.9 resolution: "@babel/core@npm:7.26.9" @@ -1172,6 +1190,29 @@ __metadata: languageName: node linkType: hard +"@babel/core@npm:^7.27.4": + version: 7.27.7 + resolution: "@babel/core@npm:7.27.7" + dependencies: + "@ampproject/remapping": "npm:^2.2.0" + "@babel/code-frame": "npm:^7.27.1" + "@babel/generator": "npm:^7.27.5" + "@babel/helper-compilation-targets": "npm:^7.27.2" + "@babel/helper-module-transforms": "npm:^7.27.3" + "@babel/helpers": "npm:^7.27.6" + "@babel/parser": "npm:^7.27.7" + "@babel/template": "npm:^7.27.2" + "@babel/traverse": "npm:^7.27.7" + "@babel/types": "npm:^7.27.7" + convert-source-map: "npm:^2.0.0" + debug: "npm:^4.1.0" + gensync: "npm:^1.0.0-beta.2" + json5: "npm:^2.2.3" + semver: "npm:^6.3.1" + checksum: 10c0/02c0cd475821c5333d5ee5eb9a0565af1a38234b37859ae09c4c95d7171bbc11a23a6f733c31b3cb12dc523311bdc8f7f9d705136f33eeb6704b7fbd6e6468ca + languageName: node + linkType: hard + "@babel/generator@npm:^7.26.10, @babel/generator@npm:^7.26.8, @babel/generator@npm:^7.27.0": version: 7.27.0 resolution: "@babel/generator@npm:7.27.0" @@ -1198,6 +1239,19 @@ __metadata: languageName: node linkType: hard +"@babel/generator@npm:^7.27.5": + version: 7.27.5 + resolution: "@babel/generator@npm:7.27.5" + dependencies: + "@babel/parser": "npm:^7.27.5" + "@babel/types": "npm:^7.27.3" + "@jridgewell/gen-mapping": "npm:^0.3.5" + "@jridgewell/trace-mapping": "npm:^0.3.25" + jsesc: "npm:^3.0.2" + checksum: 10c0/8f649ef4cd81765c832bb11de4d6064b035ffebdecde668ba7abee68a7b0bce5c9feabb5dc5bb8aeba5bd9e5c2afa3899d852d2bd9ca77a711ba8c8379f416f0 + languageName: node + linkType: hard + "@babel/helper-compilation-targets@npm:^7.26.5": version: 7.26.5 resolution: "@babel/helper-compilation-targets@npm:7.26.5" @@ -1211,6 +1265,19 @@ __metadata: languageName: node linkType: hard +"@babel/helper-compilation-targets@npm:^7.27.2": + version: 7.27.2 + resolution: "@babel/helper-compilation-targets@npm:7.27.2" + dependencies: + "@babel/compat-data": "npm:^7.27.2" + "@babel/helper-validator-option": "npm:^7.27.1" + browserslist: "npm:^4.24.0" + lru-cache: "npm:^5.1.1" + semver: "npm:^6.3.1" + checksum: 10c0/f338fa00dcfea931804a7c55d1a1c81b6f0a09787e528ec580d5c21b3ecb3913f6cb0f361368973ce953b824d910d3ac3e8a8ee15192710d3563826447193ad1 + languageName: node + linkType: hard + "@babel/helper-module-imports@npm:^7.25.9": version: 7.25.9 resolution: "@babel/helper-module-imports@npm:7.25.9" @@ -1221,6 +1288,16 @@ __metadata: languageName: node linkType: hard +"@babel/helper-module-imports@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-module-imports@npm:7.27.1" + dependencies: + "@babel/traverse": "npm:^7.27.1" + "@babel/types": "npm:^7.27.1" + checksum: 10c0/e00aace096e4e29290ff8648455c2bc4ed982f0d61dbf2db1b5e750b9b98f318bf5788d75a4f974c151bd318fd549e81dbcab595f46b14b81c12eda3023f51e8 + languageName: node + linkType: hard + "@babel/helper-module-transforms@npm:^7.26.0": version: 7.26.0 resolution: "@babel/helper-module-transforms@npm:7.26.0" @@ -1234,6 +1311,19 @@ __metadata: languageName: node linkType: hard +"@babel/helper-module-transforms@npm:^7.27.3": + version: 7.27.3 + resolution: "@babel/helper-module-transforms@npm:7.27.3" + dependencies: + "@babel/helper-module-imports": "npm:^7.27.1" + "@babel/helper-validator-identifier": "npm:^7.27.1" + "@babel/traverse": "npm:^7.27.3" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/fccb4f512a13b4c069af51e1b56b20f54024bcf1591e31e978a30f3502567f34f90a80da6a19a6148c249216292a8074a0121f9e52602510ef0f32dbce95ca01 + languageName: node + linkType: hard + "@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.25.9, @babel/helper-plugin-utils@npm:^7.8.0": version: 7.26.5 resolution: "@babel/helper-plugin-utils@npm:7.26.5" @@ -1241,6 +1331,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-plugin-utils@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-plugin-utils@npm:7.27.1" + checksum: 10c0/94cf22c81a0c11a09b197b41ab488d416ff62254ce13c57e62912c85700dc2e99e555225787a4099ff6bae7a1812d622c80fbaeda824b79baa10a6c5ac4cf69b + languageName: node + linkType: hard + "@babel/helper-string-parser@npm:^7.25.9": version: 7.25.9 resolution: "@babel/helper-string-parser@npm:7.25.9" @@ -1248,6 +1345,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-string-parser@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-string-parser@npm:7.27.1" + checksum: 10c0/8bda3448e07b5583727c103560bcf9c4c24b3c1051a4c516d4050ef69df37bb9a4734a585fe12725b8c2763de0a265aa1e909b485a4e3270b7cfd3e4dbe4b602 + languageName: node + linkType: hard + "@babel/helper-validator-identifier@npm:^7.25.9": version: 7.25.9 resolution: "@babel/helper-validator-identifier@npm:7.25.9" @@ -1255,6 +1359,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-validator-identifier@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-validator-identifier@npm:7.27.1" + checksum: 10c0/c558f11c4871d526498e49d07a84752d1800bf72ac0d3dad100309a2eaba24efbf56ea59af5137ff15e3a00280ebe588560534b0e894a4750f8b1411d8f78b84 + languageName: node + linkType: hard + "@babel/helper-validator-option@npm:^7.25.9": version: 7.25.9 resolution: "@babel/helper-validator-option@npm:7.25.9" @@ -1262,6 +1373,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-validator-option@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-validator-option@npm:7.27.1" + checksum: 10c0/6fec5f006eba40001a20f26b1ef5dbbda377b7b68c8ad518c05baa9af3f396e780bdfded24c4eef95d14bb7b8fd56192a6ed38d5d439b97d10efc5f1a191d148 + languageName: node + linkType: hard + "@babel/helpers@npm:^7.26.10": version: 7.27.0 resolution: "@babel/helpers@npm:7.27.0" @@ -1282,6 +1400,16 @@ __metadata: languageName: node linkType: hard +"@babel/helpers@npm:^7.27.6": + version: 7.27.6 + resolution: "@babel/helpers@npm:7.27.6" + dependencies: + "@babel/template": "npm:^7.27.2" + "@babel/types": "npm:^7.27.6" + checksum: 10c0/448bac96ef8b0f21f2294a826df9de6bf4026fd023f8a6bb6c782fe3e61946801ca24381490b8e58d861fee75cd695a1882921afbf1f53b0275ee68c938bd6d3 + languageName: node + linkType: hard + "@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.26.9": version: 7.26.9 resolution: "@babel/parser@npm:7.26.9" @@ -1304,6 +1432,17 @@ __metadata: languageName: node linkType: hard +"@babel/parser@npm:^7.27.2, @babel/parser@npm:^7.27.5, @babel/parser@npm:^7.27.7": + version: 7.27.7 + resolution: "@babel/parser@npm:7.27.7" + dependencies: + "@babel/types": "npm:^7.27.7" + bin: + parser: ./bin/babel-parser.js + checksum: 10c0/f6202faeb873f0b3083022e50a5046fe07266d337c0a3bd80a491f8435ba6d9e383d49725e3dcd666b3b52c0dccb4e0f1f1004915762345f7eeed5ba54ea9fd2 + languageName: node + linkType: hard + "@babel/plugin-syntax-async-generators@npm:^7.8.4": version: 7.8.4 resolution: "@babel/plugin-syntax-async-generators@npm:7.8.4" @@ -1392,6 +1531,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-syntax-jsx@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-syntax-jsx@npm:7.27.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/bc5afe6a458d5f0492c02a54ad98c5756a0c13bd6d20609aae65acd560a9e141b0876da5f358dce34ea136f271c1016df58b461184d7ae9c4321e0f98588bc84 + languageName: node + linkType: hard + "@babel/plugin-syntax-logical-assignment-operators@npm:^7.10.4": version: 7.10.4 resolution: "@babel/plugin-syntax-logical-assignment-operators@npm:7.10.4" @@ -1491,6 +1641,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-syntax-typescript@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-syntax-typescript@npm:7.27.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/11589b4c89c66ef02d57bf56c6246267851ec0c361f58929327dc3e070b0dab644be625bbe7fb4c4df30c3634bfdfe31244e1f517be397d2def1487dbbe3c37d + languageName: node + linkType: hard + "@babel/plugin-transform-react-jsx-self@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-react-jsx-self@npm:7.25.9" @@ -1547,7 +1708,7 @@ __metadata: languageName: node linkType: hard -"@babel/template@npm:^7.26.9, @babel/template@npm:^7.3.3": +"@babel/template@npm:^7.26.9": version: 7.26.9 resolution: "@babel/template@npm:7.26.9" dependencies: @@ -1558,6 +1719,17 @@ __metadata: languageName: node linkType: hard +"@babel/template@npm:^7.27.2": + version: 7.27.2 + resolution: "@babel/template@npm:7.27.2" + dependencies: + "@babel/code-frame": "npm:^7.27.1" + "@babel/parser": "npm:^7.27.2" + "@babel/types": "npm:^7.27.1" + checksum: 10c0/ed9e9022651e463cc5f2cc21942f0e74544f1754d231add6348ff1b472985a3b3502041c0be62dc99ed2d12cfae0c51394bf827452b98a2f8769c03b87aadc81 + languageName: node + linkType: hard + "@babel/traverse@npm:^7.23.7, @babel/traverse@npm:^7.26.10, @babel/traverse@npm:^7.26.8": version: 7.27.0 resolution: "@babel/traverse@npm:7.27.0" @@ -1588,6 +1760,21 @@ __metadata: languageName: node linkType: hard +"@babel/traverse@npm:^7.27.1, @babel/traverse@npm:^7.27.3, @babel/traverse@npm:^7.27.7": + version: 7.27.7 + resolution: "@babel/traverse@npm:7.27.7" + dependencies: + "@babel/code-frame": "npm:^7.27.1" + "@babel/generator": "npm:^7.27.5" + "@babel/parser": "npm:^7.27.7" + "@babel/template": "npm:^7.27.2" + "@babel/types": "npm:^7.27.7" + debug: "npm:^4.3.1" + globals: "npm:^11.1.0" + checksum: 10c0/941fecd0248546f059d58230590a2765d128ef072c8521c9e0bcf6037abf28a0ea4736003d0d695513128d07fe00a7bc57acaada2ed905941d44619b9f49cf0c + languageName: node + linkType: hard + "@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.25.9, @babel/types@npm:^7.26.9, @babel/types@npm:^7.3.3": version: 7.26.9 resolution: "@babel/types@npm:7.26.9" @@ -1608,6 +1795,16 @@ __metadata: languageName: node linkType: hard +"@babel/types@npm:^7.27.1, @babel/types@npm:^7.27.3, @babel/types@npm:^7.27.6, @babel/types@npm:^7.27.7": + version: 7.27.7 + resolution: "@babel/types@npm:7.27.7" + dependencies: + "@babel/helper-string-parser": "npm:^7.27.1" + "@babel/helper-validator-identifier": "npm:^7.27.1" + checksum: 10c0/1d1dcb5fa7cfba2b4034a3ab99ba17049bfc4af9e170935575246cdb1cee68b04329a0111506d9ae83fb917c47dbd4394a6db5e32fbd041b7834ffbb17ca086b + languageName: node + linkType: hard + "@bazel/runfiles@npm:^6.3.1": version: 6.3.1 resolution: "@bazel/runfiles@npm:6.3.1" @@ -1722,7 +1919,7 @@ __metadata: languageName: node linkType: hard -"@emnapi/core@npm:^1.4.0": +"@emnapi/core@npm:^1.4.0, @emnapi/core@npm:^1.4.3": version: 1.4.3 resolution: "@emnapi/core@npm:1.4.3" dependencies: @@ -1741,7 +1938,7 @@ __metadata: languageName: node linkType: hard -"@emnapi/runtime@npm:^1.4.0": +"@emnapi/runtime@npm:^1.4.0, @emnapi/runtime@npm:^1.4.3": version: 1.4.3 resolution: "@emnapi/runtime@npm:1.4.3" dependencies: @@ -2277,20 +2474,20 @@ __metadata: resolution: "@janhq/core@workspace:core" dependencies: "@npmcli/arborist": "npm:^7.1.0" - "@types/jest": "npm:^29.5.14" + "@types/jest": "npm:^30.0.0" "@types/node": "npm:^22.10.0" "@types/pacote": "npm:^11.1.7" "@types/request": "npm:^2.48.12" electron: "npm:33.2.1" eslint: "npm:8.57.0" eslint-plugin-jest: "npm:^27.9.0" - jest: "npm:^29.7.0" + jest: "npm:^30.0.3" jest-junit: "npm:^16.0.0" jest-runner: "npm:^29.7.0" pacote: "npm:^21.0.0" request: "npm:^2.88.2" request-progress: "npm:^3.0.0" - rimraf: "npm:^3.0.2" + rimraf: "npm:^6.0.1" rolldown: "npm:1.0.0-beta.1" rxjs: "npm:^7.8.1" ts-jest: "npm:^29.2.5" @@ -2387,6 +2584,20 @@ __metadata: languageName: unknown linkType: soft +"@jest/console@npm:30.0.2": + version: 30.0.2 + resolution: "@jest/console@npm:30.0.2" + dependencies: + "@jest/types": "npm:30.0.1" + "@types/node": "npm:*" + chalk: "npm:^4.1.2" + jest-message-util: "npm:30.0.2" + jest-util: "npm:30.0.2" + slash: "npm:^3.0.0" + checksum: 10c0/24ef330985ff020963e1d82088d0c3a7fbe981a62bc810b7afb71e6565b8c6cbcb5e789d494d3973762efc2dc351770ad05b96568517d370ad9cd8fd33f5acd0 + languageName: node + linkType: hard + "@jest/console@npm:^29.7.0": version: 29.7.0 resolution: "@jest/console@npm:29.7.0" @@ -2401,44 +2612,63 @@ __metadata: languageName: node linkType: hard -"@jest/core@npm:^29.7.0": - version: 29.7.0 - resolution: "@jest/core@npm:29.7.0" +"@jest/core@npm:30.0.3": + version: 30.0.3 + resolution: "@jest/core@npm:30.0.3" dependencies: - "@jest/console": "npm:^29.7.0" - "@jest/reporters": "npm:^29.7.0" - "@jest/test-result": "npm:^29.7.0" - "@jest/transform": "npm:^29.7.0" - "@jest/types": "npm:^29.6.3" + "@jest/console": "npm:30.0.2" + "@jest/pattern": "npm:30.0.1" + "@jest/reporters": "npm:30.0.2" + "@jest/test-result": "npm:30.0.2" + "@jest/transform": "npm:30.0.2" + "@jest/types": "npm:30.0.1" "@types/node": "npm:*" - ansi-escapes: "npm:^4.2.1" - chalk: "npm:^4.0.0" - ci-info: "npm:^3.2.0" - exit: "npm:^0.1.2" - graceful-fs: "npm:^4.2.9" - jest-changed-files: "npm:^29.7.0" - jest-config: "npm:^29.7.0" - jest-haste-map: "npm:^29.7.0" - jest-message-util: "npm:^29.7.0" - jest-regex-util: "npm:^29.6.3" - jest-resolve: "npm:^29.7.0" - jest-resolve-dependencies: "npm:^29.7.0" - jest-runner: "npm:^29.7.0" - jest-runtime: "npm:^29.7.0" - jest-snapshot: "npm:^29.7.0" - jest-util: "npm:^29.7.0" - jest-validate: "npm:^29.7.0" - jest-watcher: "npm:^29.7.0" - micromatch: "npm:^4.0.4" - pretty-format: "npm:^29.7.0" + ansi-escapes: "npm:^4.3.2" + chalk: "npm:^4.1.2" + ci-info: "npm:^4.2.0" + exit-x: "npm:^0.2.2" + graceful-fs: "npm:^4.2.11" + jest-changed-files: "npm:30.0.2" + jest-config: "npm:30.0.3" + jest-haste-map: "npm:30.0.2" + jest-message-util: "npm:30.0.2" + jest-regex-util: "npm:30.0.1" + jest-resolve: "npm:30.0.2" + jest-resolve-dependencies: "npm:30.0.3" + jest-runner: "npm:30.0.3" + jest-runtime: "npm:30.0.3" + jest-snapshot: "npm:30.0.3" + jest-util: "npm:30.0.2" + jest-validate: "npm:30.0.2" + jest-watcher: "npm:30.0.2" + micromatch: "npm:^4.0.8" + pretty-format: "npm:30.0.2" slash: "npm:^3.0.0" - strip-ansi: "npm:^6.0.0" peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 peerDependenciesMeta: node-notifier: optional: true - checksum: 10c0/934f7bf73190f029ac0f96662c85cd276ec460d407baf6b0dbaec2872e157db4d55a7ee0b1c43b18874602f662b37cb973dda469a4e6d88b4e4845b521adeeb2 + checksum: 10c0/0608245c0af4d69b8454628488ecdc44ed5cc8fee27d21640ed8c76bef26d34f8f0058f390e7350484d824d8de4f05a3b8b125cea950ca16251df8defe7cffe5 + languageName: node + linkType: hard + +"@jest/diff-sequences@npm:30.0.1": + version: 30.0.1 + resolution: "@jest/diff-sequences@npm:30.0.1" + checksum: 10c0/3a840404e6021725ef7f86b11f7b2d13dd02846481264db0e447ee33b7ee992134e402cdc8b8b0ac969d37c6c0183044e382dedee72001cdf50cfb3c8088de74 + languageName: node + linkType: hard + +"@jest/environment@npm:30.0.2": + version: 30.0.2 + resolution: "@jest/environment@npm:30.0.2" + dependencies: + "@jest/fake-timers": "npm:30.0.2" + "@jest/types": "npm:30.0.1" + "@types/node": "npm:*" + jest-mock: "npm:30.0.2" + checksum: 10c0/b16683337bd61f4c1134035c9221f92b958b79965be16d4105a5008169a22705edb004ef06cb10f42cbc23464b69bbc0eb5746d60931f764b2cbf2455477b430 languageName: node linkType: hard @@ -2454,6 +2684,15 @@ __metadata: languageName: node linkType: hard +"@jest/expect-utils@npm:30.0.3": + version: 30.0.3 + resolution: "@jest/expect-utils@npm:30.0.3" + dependencies: + "@jest/get-type": "npm:30.0.1" + checksum: 10c0/b3f662fd02980f12e4ec7b3657a728c13b1343a31b85eafd34363ea8c9a666b60ad156ffa33c1f8d2fce1cb1e06c1236361849eb52b6e31a1442195ed3b3eae0 + languageName: node + linkType: hard + "@jest/expect-utils@npm:^29.7.0": version: 29.7.0 resolution: "@jest/expect-utils@npm:29.7.0" @@ -2463,6 +2702,16 @@ __metadata: languageName: node linkType: hard +"@jest/expect@npm:30.0.3": + version: 30.0.3 + resolution: "@jest/expect@npm:30.0.3" + dependencies: + expect: "npm:30.0.3" + jest-snapshot: "npm:30.0.3" + checksum: 10c0/d76f727891df37bd1e93fff73ed4f12d6d77db33adf47cc12500b85951e7e6373e3e6f99d5826ff7c571e578d636e8a1260fd171ba0da0755b9a23b1ef75edbe + languageName: node + linkType: hard + "@jest/expect@npm:^29.7.0": version: 29.7.0 resolution: "@jest/expect@npm:29.7.0" @@ -2473,6 +2722,20 @@ __metadata: languageName: node linkType: hard +"@jest/fake-timers@npm:30.0.2": + version: 30.0.2 + resolution: "@jest/fake-timers@npm:30.0.2" + dependencies: + "@jest/types": "npm:30.0.1" + "@sinonjs/fake-timers": "npm:^13.0.0" + "@types/node": "npm:*" + jest-message-util: "npm:30.0.2" + jest-mock: "npm:30.0.2" + jest-util: "npm:30.0.2" + checksum: 10c0/896e727a1146948780998d62e7807214f9e2b0a724e283f19baca4dfe326fb8fb885244eee6d201bc5e1385336c176c093179f080e0fae03b20ec25c02604352 + languageName: node + linkType: hard + "@jest/fake-timers@npm:^29.7.0": version: 29.7.0 resolution: "@jest/fake-timers@npm:29.7.0" @@ -2487,6 +2750,25 @@ __metadata: languageName: node linkType: hard +"@jest/get-type@npm:30.0.1": + version: 30.0.1 + resolution: "@jest/get-type@npm:30.0.1" + checksum: 10c0/92437ae42d0df57e8acc2d067288151439db4752cde4f5e680c73c8a6e34568bbd8c1c81a2f2f9a637a619c2aac8bc87553fb80e31475b59e2ed789a71e5e540 + languageName: node + linkType: hard + +"@jest/globals@npm:30.0.3": + version: 30.0.3 + resolution: "@jest/globals@npm:30.0.3" + dependencies: + "@jest/environment": "npm:30.0.2" + "@jest/expect": "npm:30.0.3" + "@jest/types": "npm:30.0.1" + jest-mock: "npm:30.0.2" + checksum: 10c0/b080a924de4ff0cfb5fef4098eb7764efa5bc33de4a59b27116defc8c91ec76e6103c9e9a60cd33e00d060f03302e6c5a56ef8c4fc28133e29ae011b1be78d8e + languageName: node + linkType: hard + "@jest/globals@npm:^29.7.0": version: 29.7.0 resolution: "@jest/globals@npm:29.7.0" @@ -2499,40 +2781,58 @@ __metadata: languageName: node linkType: hard -"@jest/reporters@npm:^29.7.0": - version: 29.7.0 - resolution: "@jest/reporters@npm:29.7.0" +"@jest/pattern@npm:30.0.1": + version: 30.0.1 + resolution: "@jest/pattern@npm:30.0.1" + dependencies: + "@types/node": "npm:*" + jest-regex-util: "npm:30.0.1" + checksum: 10c0/32c5a7bfb6c591f004dac0ed36d645002ed168971e4c89bd915d1577031672870032594767557b855c5bc330aa1e39a2f54bf150d2ee88a7a0886e9cb65318bc + languageName: node + linkType: hard + +"@jest/reporters@npm:30.0.2": + version: 30.0.2 + resolution: "@jest/reporters@npm:30.0.2" dependencies: "@bcoe/v8-coverage": "npm:^0.2.3" - "@jest/console": "npm:^29.7.0" - "@jest/test-result": "npm:^29.7.0" - "@jest/transform": "npm:^29.7.0" - "@jest/types": "npm:^29.6.3" - "@jridgewell/trace-mapping": "npm:^0.3.18" + "@jest/console": "npm:30.0.2" + "@jest/test-result": "npm:30.0.2" + "@jest/transform": "npm:30.0.2" + "@jest/types": "npm:30.0.1" + "@jridgewell/trace-mapping": "npm:^0.3.25" "@types/node": "npm:*" - chalk: "npm:^4.0.0" - collect-v8-coverage: "npm:^1.0.0" - exit: "npm:^0.1.2" - glob: "npm:^7.1.3" - graceful-fs: "npm:^4.2.9" + chalk: "npm:^4.1.2" + collect-v8-coverage: "npm:^1.0.2" + exit-x: "npm:^0.2.2" + glob: "npm:^10.3.10" + graceful-fs: "npm:^4.2.11" istanbul-lib-coverage: "npm:^3.0.0" istanbul-lib-instrument: "npm:^6.0.0" istanbul-lib-report: "npm:^3.0.0" - istanbul-lib-source-maps: "npm:^4.0.0" + istanbul-lib-source-maps: "npm:^5.0.0" istanbul-reports: "npm:^3.1.3" - jest-message-util: "npm:^29.7.0" - jest-util: "npm:^29.7.0" - jest-worker: "npm:^29.7.0" + jest-message-util: "npm:30.0.2" + jest-util: "npm:30.0.2" + jest-worker: "npm:30.0.2" slash: "npm:^3.0.0" - string-length: "npm:^4.0.1" - strip-ansi: "npm:^6.0.0" + string-length: "npm:^4.0.2" v8-to-istanbul: "npm:^9.0.1" peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 peerDependenciesMeta: node-notifier: optional: true - checksum: 10c0/a754402a799541c6e5aff2c8160562525e2a47e7d568f01ebfc4da66522de39cbb809bbb0a841c7052e4270d79214e70aec3c169e4eae42a03bc1a8a20cb9fa2 + checksum: 10c0/4931fd1f3ae1236fba8f6068b8949b3788fe367ff2eaaa88293988344f50dcb5c15a4063a65cc4485546504bb3b85e2e6667c68acca249d3597b97425bbc2ee5 + languageName: node + linkType: hard + +"@jest/schemas@npm:30.0.1": + version: 30.0.1 + resolution: "@jest/schemas@npm:30.0.1" + dependencies: + "@sinclair/typebox": "npm:^0.34.0" + checksum: 10c0/27977359edc4b33293af7c85c53de5014a87c29b9ab98b0a827fedfc6635abdb522aad8c3ff276080080911f519699b094bd6f4e151b43f0cc5856ccc83c04a7 languageName: node linkType: hard @@ -2545,6 +2845,29 @@ __metadata: languageName: node linkType: hard +"@jest/snapshot-utils@npm:30.0.1": + version: 30.0.1 + resolution: "@jest/snapshot-utils@npm:30.0.1" + dependencies: + "@jest/types": "npm:30.0.1" + chalk: "npm:^4.1.2" + graceful-fs: "npm:^4.2.11" + natural-compare: "npm:^1.4.0" + checksum: 10c0/a90f09733ca98e695bc2850afdbb0a9d958f4f8805b0e5420cba210422c5bfeb097de57bf66436006f3d5cc3da4109e1e65f6c3e2947474a4911f4d22a8496e8 + languageName: node + linkType: hard + +"@jest/source-map@npm:30.0.1": + version: 30.0.1 + resolution: "@jest/source-map@npm:30.0.1" + dependencies: + "@jridgewell/trace-mapping": "npm:^0.3.25" + callsites: "npm:^3.1.0" + graceful-fs: "npm:^4.2.11" + checksum: 10c0/e7bda2786fc9f483d9dd7566c58c4bd948830997be862dfe80a3ae5550ff3f84753abb52e705d02ebe9db9f34ba7ebec4c2db11882048cdeef7a66f6332b3897 + languageName: node + linkType: hard + "@jest/source-map@npm:^29.6.3": version: 29.6.3 resolution: "@jest/source-map@npm:29.6.3" @@ -2556,6 +2879,18 @@ __metadata: languageName: node linkType: hard +"@jest/test-result@npm:30.0.2": + version: 30.0.2 + resolution: "@jest/test-result@npm:30.0.2" + dependencies: + "@jest/console": "npm:30.0.2" + "@jest/types": "npm:30.0.1" + "@types/istanbul-lib-coverage": "npm:^2.0.6" + collect-v8-coverage: "npm:^1.0.2" + checksum: 10c0/f2a1d5b3f1c8f786acc76b77c72a73dc314e579a4ea91ad5ad19e9906156ffa17b56a69cab33cffd1d9be32cfc5f98c60a92fceedd4c700280933b8a14de4e35 + languageName: node + linkType: hard + "@jest/test-result@npm:^29.7.0": version: 29.7.0 resolution: "@jest/test-result@npm:29.7.0" @@ -2568,15 +2903,38 @@ __metadata: languageName: node linkType: hard -"@jest/test-sequencer@npm:^29.7.0": - version: 29.7.0 - resolution: "@jest/test-sequencer@npm:29.7.0" +"@jest/test-sequencer@npm:30.0.2": + version: 30.0.2 + resolution: "@jest/test-sequencer@npm:30.0.2" dependencies: - "@jest/test-result": "npm:^29.7.0" - graceful-fs: "npm:^4.2.9" - jest-haste-map: "npm:^29.7.0" + "@jest/test-result": "npm:30.0.2" + graceful-fs: "npm:^4.2.11" + jest-haste-map: "npm:30.0.2" slash: "npm:^3.0.0" - checksum: 10c0/593a8c4272797bb5628984486080cbf57aed09c7cfdc0a634e8c06c38c6bef329c46c0016e84555ee55d1cd1f381518cf1890990ff845524c1123720c8c1481b + checksum: 10c0/5d6d74a8c530db1fac4ba085b6a27e98b52a196e2d88d53462771f3a8e8165d3f593a3cea28ed73951cbaf95ba80c7389719c58e99cb3700f0ad122376d1430b + languageName: node + linkType: hard + +"@jest/transform@npm:30.0.2": + version: 30.0.2 + resolution: "@jest/transform@npm:30.0.2" + dependencies: + "@babel/core": "npm:^7.27.4" + "@jest/types": "npm:30.0.1" + "@jridgewell/trace-mapping": "npm:^0.3.25" + babel-plugin-istanbul: "npm:^7.0.0" + chalk: "npm:^4.1.2" + convert-source-map: "npm:^2.0.0" + fast-json-stable-stringify: "npm:^2.1.0" + graceful-fs: "npm:^4.2.11" + jest-haste-map: "npm:30.0.2" + jest-regex-util: "npm:30.0.1" + jest-util: "npm:30.0.2" + micromatch: "npm:^4.0.8" + pirates: "npm:^4.0.7" + slash: "npm:^3.0.0" + write-file-atomic: "npm:^5.0.1" + checksum: 10c0/2ab4c049b2c4851dd7abc9f837565c7b3feb5d395955608d929c5caffc0052955a0216c20bf5db1eebef9b9a888cec508a1ea3b6237648cc1f77fea00b2321dd languageName: node linkType: hard @@ -2603,6 +2961,21 @@ __metadata: languageName: node linkType: hard +"@jest/types@npm:30.0.1": + version: 30.0.1 + resolution: "@jest/types@npm:30.0.1" + dependencies: + "@jest/pattern": "npm:30.0.1" + "@jest/schemas": "npm:30.0.1" + "@types/istanbul-lib-coverage": "npm:^2.0.6" + "@types/istanbul-reports": "npm:^3.0.4" + "@types/node": "npm:*" + "@types/yargs": "npm:^17.0.33" + chalk: "npm:^4.1.2" + checksum: 10c0/407469331e74f9bb1ffd40202c3a8cece2fd07ba535adeb60557bdcee13713cf2f14cf78869ba7ef50a7e6fe0ed7cc97ec775056dd640fc0a332e8fbfaec1ee8 + languageName: node + linkType: hard + "@jest/types@npm:^29.6.3": version: 29.6.3 resolution: "@jest/types@npm:29.6.3" @@ -2669,6 +3042,16 @@ __metadata: languageName: node linkType: hard +"@jridgewell/trace-mapping@npm:^0.3.23": + version: 0.3.28 + resolution: "@jridgewell/trace-mapping@npm:0.3.28" + dependencies: + "@jridgewell/resolve-uri": "npm:^3.1.0" + "@jridgewell/sourcemap-codec": "npm:^1.4.14" + checksum: 10c0/ca89e30e4f6ac7481d70ecd1d0aee670b566a9965330a1d9fc52af3e522eaa8beb9a322dc759921b4e1a8c5f5de4a998ea99c4251d6320460e96f7f1ce6a0270 + languageName: node + linkType: hard + "@mistralai/mistralai@npm:0.5.0": version: 0.5.0 resolution: "@mistralai/mistralai@npm:0.5.0" @@ -2678,6 +3061,17 @@ __metadata: languageName: node linkType: hard +"@napi-rs/wasm-runtime@npm:^0.2.11": + version: 0.2.11 + resolution: "@napi-rs/wasm-runtime@npm:0.2.11" + dependencies: + "@emnapi/core": "npm:^1.4.3" + "@emnapi/runtime": "npm:^1.4.3" + "@tybys/wasm-util": "npm:^0.9.0" + checksum: 10c0/049bd14c58b99fbe0967b95e9921c5503df196b59be22948d2155f17652eb305cff6728efd8685338b855da7e476dd2551fbe3a313fc2d810938f0717478441e + languageName: node + linkType: hard + "@napi-rs/wasm-runtime@npm:^0.2.4": version: 0.2.7 resolution: "@napi-rs/wasm-runtime@npm:0.2.7" @@ -3025,6 +3419,13 @@ __metadata: languageName: node linkType: hard +"@pkgr/core@npm:^0.2.4": + version: 0.2.7 + resolution: "@pkgr/core@npm:0.2.7" + checksum: 10c0/951f5ebf2feb6e9dbc202d937f1a364d60f2bf0e3e53594251bcc1d9d2ed0df0a919c49ba162a9499fce73cf46ebe4d7959a8dfbac03511dbe79b69f5fedb804 + languageName: node + linkType: hard + "@radix-ui/number@npm:1.1.1": version: 1.1.1 resolution: "@radix-ui/number@npm:1.1.1" @@ -4482,6 +4883,13 @@ __metadata: languageName: node linkType: hard +"@sinclair/typebox@npm:^0.34.0": + version: 0.34.37 + resolution: "@sinclair/typebox@npm:0.34.37" + checksum: 10c0/22fff01853d8f35e8a1f0be004e91a0c3ced16f35b8d7e915392e91bf021190bcba45102cd148679c53440c4ed228b31d7a2635461ea5d089ef581f6254ecfb4 + languageName: node + linkType: hard + "@sindresorhus/is@npm:^4.0.0, @sindresorhus/is@npm:^4.6.0": version: 4.6.0 resolution: "@sindresorhus/is@npm:4.6.0" @@ -4489,7 +4897,7 @@ __metadata: languageName: node linkType: hard -"@sinonjs/commons@npm:^3.0.0": +"@sinonjs/commons@npm:^3.0.0, @sinonjs/commons@npm:^3.0.1": version: 3.0.1 resolution: "@sinonjs/commons@npm:3.0.1" dependencies: @@ -4507,6 +4915,15 @@ __metadata: languageName: node linkType: hard +"@sinonjs/fake-timers@npm:^13.0.0": + version: 13.0.5 + resolution: "@sinonjs/fake-timers@npm:13.0.5" + dependencies: + "@sinonjs/commons": "npm:^3.0.1" + checksum: 10c0/a707476efd523d2138ef6bba916c83c4a377a8372ef04fad87499458af9f01afc58f4f245c5fd062793d6d70587309330c6f96947b5bd5697961c18004dc3e26 + languageName: node + linkType: hard + "@smithy/abort-controller@npm:^3.1.9": version: 3.1.9 resolution: "@smithy/abort-controller@npm:3.1.9" @@ -6238,7 +6655,7 @@ __metadata: languageName: node linkType: hard -"@types/babel__core@npm:^7.1.14, @types/babel__core@npm:^7.20.5": +"@types/babel__core@npm:^7.20.5": version: 7.20.5 resolution: "@types/babel__core@npm:7.20.5" dependencies: @@ -6270,7 +6687,7 @@ __metadata: languageName: node linkType: hard -"@types/babel__traverse@npm:*, @types/babel__traverse@npm:^7.0.6": +"@types/babel__traverse@npm:*": version: 7.20.6 resolution: "@types/babel__traverse@npm:7.20.6" dependencies: @@ -6403,7 +6820,7 @@ __metadata: languageName: node linkType: hard -"@types/istanbul-lib-coverage@npm:*, @types/istanbul-lib-coverage@npm:^2.0.0, @types/istanbul-lib-coverage@npm:^2.0.1": +"@types/istanbul-lib-coverage@npm:*, @types/istanbul-lib-coverage@npm:^2.0.0, @types/istanbul-lib-coverage@npm:^2.0.1, @types/istanbul-lib-coverage@npm:^2.0.6": version: 2.0.6 resolution: "@types/istanbul-lib-coverage@npm:2.0.6" checksum: 10c0/3948088654f3eeb45363f1db158354fb013b362dba2a5c2c18c559484d5eb9f6fd85b23d66c0a7c2fcfab7308d0a585b14dadaca6cc8bf89ebfdc7f8f5102fb7 @@ -6419,7 +6836,7 @@ __metadata: languageName: node linkType: hard -"@types/istanbul-reports@npm:^3.0.0": +"@types/istanbul-reports@npm:^3.0.0, @types/istanbul-reports@npm:^3.0.4": version: 3.0.4 resolution: "@types/istanbul-reports@npm:3.0.4" dependencies: @@ -6428,13 +6845,13 @@ __metadata: languageName: node linkType: hard -"@types/jest@npm:^29.5.14": - version: 29.5.14 - resolution: "@types/jest@npm:29.5.14" +"@types/jest@npm:^30.0.0": + version: 30.0.0 + resolution: "@types/jest@npm:30.0.0" dependencies: - expect: "npm:^29.0.0" - pretty-format: "npm:^29.0.0" - checksum: 10c0/18e0712d818890db8a8dab3d91e9ea9f7f19e3f83c2e50b312f557017dc81466207a71f3ed79cf4428e813ba939954fa26ffa0a9a7f153181ba174581b1c2aed + expect: "npm:^30.0.0" + pretty-format: "npm:^30.0.0" + checksum: 10c0/20c6ce574154bc16f8dd6a97afacca4b8c4921a819496a3970382031c509ebe87a1b37b152a1b8475089b82d8ca951a9e95beb4b9bf78fbf579b1536f0b65969 languageName: node linkType: hard @@ -6690,7 +7107,7 @@ __metadata: languageName: node linkType: hard -"@types/stack-utils@npm:^2.0.0": +"@types/stack-utils@npm:^2.0.0, @types/stack-utils@npm:^2.0.3": version: 2.0.3 resolution: "@types/stack-utils@npm:2.0.3" checksum: 10c0/1f4658385ae936330581bcb8aa3a066df03867d90281cdf89cc356d404bd6579be0f11902304e1f775d92df22c6dd761d4451c804b0a4fba973e06211e9bd77c @@ -6748,7 +7165,7 @@ __metadata: languageName: node linkType: hard -"@types/yargs@npm:^17.0.8": +"@types/yargs@npm:^17.0.33, @types/yargs@npm:^17.0.8": version: 17.0.33 resolution: "@types/yargs@npm:17.0.33" dependencies: @@ -6956,13 +7373,148 @@ __metadata: languageName: node linkType: hard -"@ungap/structured-clone@npm:^1.0.0, @ungap/structured-clone@npm:^1.2.0": +"@ungap/structured-clone@npm:^1.0.0, @ungap/structured-clone@npm:^1.2.0, @ungap/structured-clone@npm:^1.3.0": version: 1.3.0 resolution: "@ungap/structured-clone@npm:1.3.0" checksum: 10c0/0fc3097c2540ada1fc340ee56d58d96b5b536a2a0dab6e3ec17d4bfc8c4c86db345f61a375a8185f9da96f01c69678f836a2b57eeaa9e4b8eeafd26428e57b0a languageName: node linkType: hard +"@unrs/resolver-binding-android-arm-eabi@npm:1.9.2": + version: 1.9.2 + resolution: "@unrs/resolver-binding-android-arm-eabi@npm:1.9.2" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@unrs/resolver-binding-android-arm64@npm:1.9.2": + version: 1.9.2 + resolution: "@unrs/resolver-binding-android-arm64@npm:1.9.2" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@unrs/resolver-binding-darwin-arm64@npm:1.9.2": + version: 1.9.2 + resolution: "@unrs/resolver-binding-darwin-arm64@npm:1.9.2" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@unrs/resolver-binding-darwin-x64@npm:1.9.2": + version: 1.9.2 + resolution: "@unrs/resolver-binding-darwin-x64@npm:1.9.2" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@unrs/resolver-binding-freebsd-x64@npm:1.9.2": + version: 1.9.2 + resolution: "@unrs/resolver-binding-freebsd-x64@npm:1.9.2" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@unrs/resolver-binding-linux-arm-gnueabihf@npm:1.9.2": + version: 1.9.2 + resolution: "@unrs/resolver-binding-linux-arm-gnueabihf@npm:1.9.2" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@unrs/resolver-binding-linux-arm-musleabihf@npm:1.9.2": + version: 1.9.2 + resolution: "@unrs/resolver-binding-linux-arm-musleabihf@npm:1.9.2" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@unrs/resolver-binding-linux-arm64-gnu@npm:1.9.2": + version: 1.9.2 + resolution: "@unrs/resolver-binding-linux-arm64-gnu@npm:1.9.2" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@unrs/resolver-binding-linux-arm64-musl@npm:1.9.2": + version: 1.9.2 + resolution: "@unrs/resolver-binding-linux-arm64-musl@npm:1.9.2" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@unrs/resolver-binding-linux-ppc64-gnu@npm:1.9.2": + version: 1.9.2 + resolution: "@unrs/resolver-binding-linux-ppc64-gnu@npm:1.9.2" + conditions: os=linux & cpu=ppc64 & libc=glibc + languageName: node + linkType: hard + +"@unrs/resolver-binding-linux-riscv64-gnu@npm:1.9.2": + version: 1.9.2 + resolution: "@unrs/resolver-binding-linux-riscv64-gnu@npm:1.9.2" + conditions: os=linux & cpu=riscv64 & libc=glibc + languageName: node + linkType: hard + +"@unrs/resolver-binding-linux-riscv64-musl@npm:1.9.2": + version: 1.9.2 + resolution: "@unrs/resolver-binding-linux-riscv64-musl@npm:1.9.2" + conditions: os=linux & cpu=riscv64 & libc=musl + languageName: node + linkType: hard + +"@unrs/resolver-binding-linux-s390x-gnu@npm:1.9.2": + version: 1.9.2 + resolution: "@unrs/resolver-binding-linux-s390x-gnu@npm:1.9.2" + conditions: os=linux & cpu=s390x & libc=glibc + languageName: node + linkType: hard + +"@unrs/resolver-binding-linux-x64-gnu@npm:1.9.2": + version: 1.9.2 + resolution: "@unrs/resolver-binding-linux-x64-gnu@npm:1.9.2" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@unrs/resolver-binding-linux-x64-musl@npm:1.9.2": + version: 1.9.2 + resolution: "@unrs/resolver-binding-linux-x64-musl@npm:1.9.2" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@unrs/resolver-binding-wasm32-wasi@npm:1.9.2": + version: 1.9.2 + resolution: "@unrs/resolver-binding-wasm32-wasi@npm:1.9.2" + dependencies: + "@napi-rs/wasm-runtime": "npm:^0.2.11" + conditions: cpu=wasm32 + languageName: node + linkType: hard + +"@unrs/resolver-binding-win32-arm64-msvc@npm:1.9.2": + version: 1.9.2 + resolution: "@unrs/resolver-binding-win32-arm64-msvc@npm:1.9.2" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@unrs/resolver-binding-win32-ia32-msvc@npm:1.9.2": + version: 1.9.2 + resolution: "@unrs/resolver-binding-win32-ia32-msvc@npm:1.9.2" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@unrs/resolver-binding-win32-x64-msvc@npm:1.9.2": + version: 1.9.2 + resolution: "@unrs/resolver-binding-win32-x64-msvc@npm:1.9.2" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@vitejs/plugin-react@npm:^4.3.4": version: 4.4.1 resolution: "@vitejs/plugin-react@npm:4.4.1" @@ -7193,7 +7745,7 @@ __metadata: languageName: node linkType: hard -"ansi-escapes@npm:^4.2.1": +"ansi-escapes@npm:^4.2.1, ansi-escapes@npm:^4.3.2": version: 4.3.2 resolution: "ansi-escapes@npm:4.3.2" dependencies: @@ -7225,7 +7777,7 @@ __metadata: languageName: node linkType: hard -"ansi-styles@npm:^5.0.0": +"ansi-styles@npm:^5.0.0, ansi-styles@npm:^5.2.0": version: 5.2.0 resolution: "ansi-styles@npm:5.2.0" checksum: 10c0/9c4ca80eb3c2fb7b33841c210d2f20807f40865d27008d7c3f707b7f95cab7d67462a565e2388ac3285b71cb3d9bb2173de8da37c57692a362885ec34d6e27df @@ -7256,7 +7808,7 @@ __metadata: languageName: node linkType: hard -"anymatch@npm:^3.0.3, anymatch@npm:~3.1.2": +"anymatch@npm:^3.0.3, anymatch@npm:^3.1.3, anymatch@npm:~3.1.2": version: 3.1.3 resolution: "anymatch@npm:3.1.3" dependencies: @@ -7486,20 +8038,20 @@ __metadata: languageName: node linkType: hard -"babel-jest@npm:^29.7.0": - version: 29.7.0 - resolution: "babel-jest@npm:29.7.0" +"babel-jest@npm:30.0.2": + version: 30.0.2 + resolution: "babel-jest@npm:30.0.2" dependencies: - "@jest/transform": "npm:^29.7.0" - "@types/babel__core": "npm:^7.1.14" - babel-plugin-istanbul: "npm:^6.1.1" - babel-preset-jest: "npm:^29.6.3" - chalk: "npm:^4.0.0" - graceful-fs: "npm:^4.2.9" + "@jest/transform": "npm:30.0.2" + "@types/babel__core": "npm:^7.20.5" + babel-plugin-istanbul: "npm:^7.0.0" + babel-preset-jest: "npm:30.0.1" + chalk: "npm:^4.1.2" + graceful-fs: "npm:^4.2.11" slash: "npm:^3.0.0" peerDependencies: - "@babel/core": ^7.8.0 - checksum: 10c0/2eda9c1391e51936ca573dd1aedfee07b14c59b33dbe16ef347873ddd777bcf6e2fc739681e9e9661ab54ef84a3109a03725be2ac32cd2124c07ea4401cbe8c1 + "@babel/core": ^7.11.0 + checksum: 10c0/416deec120eea3f870b45166abc8a30ea29b9235d1acb4a2e50a3b7d623f401589621fa6502dcd4abfffbfaa506eccf20dbbef2c5d0eeac1df9344ec8d8de272 languageName: node linkType: hard @@ -7516,19 +8068,31 @@ __metadata: languageName: node linkType: hard -"babel-plugin-jest-hoist@npm:^29.6.3": - version: 29.6.3 - resolution: "babel-plugin-jest-hoist@npm:29.6.3" +"babel-plugin-istanbul@npm:^7.0.0": + version: 7.0.0 + resolution: "babel-plugin-istanbul@npm:7.0.0" dependencies: - "@babel/template": "npm:^7.3.3" - "@babel/types": "npm:^7.3.3" - "@types/babel__core": "npm:^7.1.14" - "@types/babel__traverse": "npm:^7.0.6" - checksum: 10c0/7e6451caaf7dce33d010b8aafb970e62f1b0c0b57f4978c37b0d457bbcf0874d75a395a102daf0bae0bd14eafb9f6e9a165ee5e899c0a4f1f3bb2e07b304ed2e + "@babel/helper-plugin-utils": "npm:^7.0.0" + "@istanbuljs/load-nyc-config": "npm:^1.0.0" + "@istanbuljs/schema": "npm:^0.1.3" + istanbul-lib-instrument: "npm:^6.0.2" + test-exclude: "npm:^6.0.0" + checksum: 10c0/79c37bd59ea9bcb16218e874993621e24048776fac7ee72eabe78f0909200851bdb93b32f6eba5b463206f15a1ee7ad40a725af8447952321ae1fdf14e740fe9 languageName: node linkType: hard -"babel-preset-current-node-syntax@npm:^1.0.0": +"babel-plugin-jest-hoist@npm:30.0.1": + version: 30.0.1 + resolution: "babel-plugin-jest-hoist@npm:30.0.1" + dependencies: + "@babel/template": "npm:^7.27.2" + "@babel/types": "npm:^7.27.3" + "@types/babel__core": "npm:^7.20.5" + checksum: 10c0/49087f45c8ac359d68c622f4bd471300376b0ca2b6bd6ecaa1bd254ea87eda8fa3ce6144848e3bbabad337d276474a47e2ac3f6272f82e1f2337924ff49a02bd + languageName: node + linkType: hard + +"babel-preset-current-node-syntax@npm:^1.0.0, babel-preset-current-node-syntax@npm:^1.1.0": version: 1.1.0 resolution: "babel-preset-current-node-syntax@npm:1.1.0" dependencies: @@ -7553,15 +8117,15 @@ __metadata: languageName: node linkType: hard -"babel-preset-jest@npm:^29.6.3": - version: 29.6.3 - resolution: "babel-preset-jest@npm:29.6.3" +"babel-preset-jest@npm:30.0.1": + version: 30.0.1 + resolution: "babel-preset-jest@npm:30.0.1" dependencies: - babel-plugin-jest-hoist: "npm:^29.6.3" - babel-preset-current-node-syntax: "npm:^1.0.0" + babel-plugin-jest-hoist: "npm:30.0.1" + babel-preset-current-node-syntax: "npm:^1.1.0" peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10c0/ec5fd0276b5630b05f0c14bb97cc3815c6b31600c683ebb51372e54dcb776cff790bdeeabd5b8d01ede375a040337ccbf6a3ccd68d3a34219125945e167ad943 + "@babel/core": ^7.11.0 + checksum: 10c0/33da0094965929b1742b02e55272b544f189cd487d55bbba60e68d96d62d48f466264fe51f65950454829d4f2271541f2433e1c1c5e6a7ff5b9e91f1303471b7 languageName: node linkType: hard @@ -8080,7 +8644,7 @@ __metadata: languageName: node linkType: hard -"callsites@npm:^3.0.0": +"callsites@npm:^3.0.0, callsites@npm:^3.1.0": version: 3.1.0 resolution: "callsites@npm:3.1.0" checksum: 10c0/fff92277400eb06c3079f9e74f3af120db9f8ea03bad0e84d9aede54bbe2d44a56cccb5f6cf12211f93f52306df87077ecec5b712794c5a9b5dac6d615a3f301 @@ -8111,7 +8675,7 @@ __metadata: languageName: node linkType: hard -"camelcase@npm:^6.2.0": +"camelcase@npm:^6.2.0, camelcase@npm:^6.3.0": version: 6.3.0 resolution: "camelcase@npm:6.3.0" checksum: 10c0/0d701658219bd3116d12da3eab31acddb3f9440790c0792e0d398f0a520a6a4058018e546862b6fba89d7ae990efaeb97da71e1913e9ebf5a8b5621a3d55c710 @@ -8304,6 +8868,13 @@ __metadata: languageName: node linkType: hard +"ci-info@npm:^4.2.0": + version: 4.2.0 + resolution: "ci-info@npm:4.2.0" + checksum: 10c0/37a2f4b6a213a5cf835890eb0241f0d5b022f6cfefde58a69e9af8e3a0e71e06d6ad7754b0d4efb9cd2613e58a7a33996d71b56b0d04242722e86666f3f3d058 + languageName: node + linkType: hard + "cipher-base@npm:^1.0.0, cipher-base@npm:^1.0.1, cipher-base@npm:^1.0.3": version: 1.0.6 resolution: "cipher-base@npm:1.0.6" @@ -8321,6 +8892,13 @@ __metadata: languageName: node linkType: hard +"cjs-module-lexer@npm:^2.1.0": + version: 2.1.0 + resolution: "cjs-module-lexer@npm:2.1.0" + checksum: 10c0/91cf28686dc3948e4a06dfa03a2fccb14b7a97471ffe7ae0124f62060ddf2de28e8e997f60007babe6e122b1b06a47c01a1b72cc015f185824d9cac3ccfa5533 + languageName: node + linkType: hard + "class-utils@npm:^0.3.5": version: 0.3.6 resolution: "class-utils@npm:0.3.6" @@ -8417,7 +8995,7 @@ __metadata: languageName: node linkType: hard -"collect-v8-coverage@npm:^1.0.0": +"collect-v8-coverage@npm:^1.0.0, collect-v8-coverage@npm:^1.0.2": version: 1.0.2 resolution: "collect-v8-coverage@npm:1.0.2" checksum: 10c0/ed7008e2e8b6852c5483b444a3ae6e976e088d4335a85aa0a9db2861c5f1d31bd2d7ff97a60469b3388deeba661a619753afbe201279fb159b4b9548ab8269a1 @@ -8678,23 +9256,6 @@ __metadata: languageName: node linkType: hard -"create-jest@npm:^29.7.0": - version: 29.7.0 - resolution: "create-jest@npm:29.7.0" - dependencies: - "@jest/types": "npm:^29.6.3" - chalk: "npm:^4.0.0" - exit: "npm:^0.1.2" - graceful-fs: "npm:^4.2.9" - jest-config: "npm:^29.7.0" - jest-util: "npm:^29.7.0" - prompts: "npm:^2.0.1" - bin: - create-jest: bin/create-jest.js - checksum: 10c0/e7e54c280692470d3398f62a6238fd396327e01c6a0757002833f06d00afc62dd7bfe04ff2b9cd145264460e6b4d1eb8386f2925b7e567f97939843b7b0e812f - languageName: node - linkType: hard - "create-require@npm:^1.1.0, create-require@npm:^1.1.1": version: 1.1.1 resolution: "create-require@npm:1.1.1" @@ -8971,15 +9532,15 @@ __metadata: languageName: node linkType: hard -"dedent@npm:^1.0.0": - version: 1.5.3 - resolution: "dedent@npm:1.5.3" +"dedent@npm:^1.6.0": + version: 1.6.0 + resolution: "dedent@npm:1.6.0" peerDependencies: babel-plugin-macros: ^3.1.0 peerDependenciesMeta: babel-plugin-macros: optional: true - checksum: 10c0/d94bde6e6f780be4da4fd760288fcf755ec368872f4ac5218197200d86430aeb8d90a003a840bff1c20221188e3f23adced0119cb811c6873c70d0ac66d12832 + checksum: 10c0/671b8f5e390dd2a560862c4511dd6d2638e71911486f78cb32116551f8f2aa6fcaf50579ffffb2f866d46b5b80fd72470659ca5760ede8f967619ef7df79e8a5 languageName: node linkType: hard @@ -9004,7 +9565,7 @@ __metadata: languageName: node linkType: hard -"deepmerge@npm:^4.2.2, deepmerge@npm:^4.3.1": +"deepmerge@npm:^4.3.1": version: 4.3.1 resolution: "deepmerge@npm:4.3.1" checksum: 10c0/e53481aaf1aa2c4082b5342be6b6d8ad9dfe387bc92ce197a66dea08bd4265904a087e75e464f14d1347cf2ac8afe1e4c16b266e0561cc5df29382d3c5f80044 @@ -9099,7 +9660,7 @@ __metadata: languageName: node linkType: hard -"detect-newline@npm:^3.0.0": +"detect-newline@npm:^3.0.0, detect-newline@npm:^3.1.0": version: 3.1.0 resolution: "detect-newline@npm:3.1.0" checksum: 10c0/c38cfc8eeb9fda09febb44bcd85e467c970d4e3bf526095394e5a4f18bc26dd0cf6b22c69c1fa9969261521c593836db335c2795218f6d781a512aea2fb8209d @@ -9931,7 +10492,7 @@ __metadata: languageName: node linkType: hard -"execa@npm:^5.0.0": +"execa@npm:^5.1.1": version: 5.1.1 resolution: "execa@npm:5.1.1" dependencies: @@ -9948,10 +10509,10 @@ __metadata: languageName: node linkType: hard -"exit@npm:^0.1.2": - version: 0.1.2 - resolution: "exit@npm:0.1.2" - checksum: 10c0/71d2ad9b36bc25bb8b104b17e830b40a08989be7f7d100b13269aaae7c3784c3e6e1e88a797e9e87523993a25ba27c8958959a554535370672cfb4d824af8989 +"exit-x@npm:^0.2.2": + version: 0.2.2 + resolution: "exit-x@npm:0.2.2" + checksum: 10c0/212a7a095ca5540e9581f1ef2d1d6a40df7a6027c8cc96e78ce1d16b86d1a88326d4a0eff8dff2b5ec1e68bb0c1edd5d0dfdde87df1869bf7514d4bc6a5cbd72 languageName: node linkType: hard @@ -9995,7 +10556,21 @@ __metadata: languageName: node linkType: hard -"expect@npm:^29.0.0, expect@npm:^29.7.0": +"expect@npm:30.0.3, expect@npm:^30.0.0": + version: 30.0.3 + resolution: "expect@npm:30.0.3" + dependencies: + "@jest/expect-utils": "npm:30.0.3" + "@jest/get-type": "npm:30.0.1" + jest-matcher-utils: "npm:30.0.3" + jest-message-util: "npm:30.0.2" + jest-mock: "npm:30.0.2" + jest-util: "npm:30.0.2" + checksum: 10c0/6bb88a42d6fcacbd0b25d4f90c389e2e439cd1d3b68f4b708582bcfe4a9575d1584edb554921e21230bc484ae55f8d639fc8186545ba9e6070a83e82a18655d8 + languageName: node + linkType: hard + +"expect@npm:^29.7.0": version: 29.7.0 resolution: "expect@npm:29.7.0" dependencies: @@ -10190,7 +10765,7 @@ __metadata: languageName: node linkType: hard -"fb-watchman@npm:^2.0.0": +"fb-watchman@npm:^2.0.0, fb-watchman@npm:^2.0.2": version: 2.0.2 resolution: "fb-watchman@npm:2.0.2" dependencies: @@ -10687,7 +11262,7 @@ __metadata: languageName: node linkType: hard -"fsevents@npm:^2.3.2, fsevents@npm:~2.3.2, fsevents@npm:~2.3.3": +"fsevents@npm:^2.3.2, fsevents@npm:^2.3.3, fsevents@npm:~2.3.2, fsevents@npm:~2.3.3": version: 2.3.3 resolution: "fsevents@npm:2.3.3" dependencies: @@ -10707,7 +11282,7 @@ __metadata: languageName: node linkType: hard -"fsevents@patch:fsevents@npm%3A^2.3.2#optional!builtin, fsevents@patch:fsevents@npm%3A~2.3.2#optional!builtin, fsevents@patch:fsevents@npm%3A~2.3.3#optional!builtin": +"fsevents@patch:fsevents@npm%3A^2.3.2#optional!builtin, fsevents@patch:fsevents@npm%3A^2.3.3#optional!builtin, fsevents@patch:fsevents@npm%3A~2.3.2#optional!builtin, fsevents@patch:fsevents@npm%3A~2.3.3#optional!builtin": version: 2.3.3 resolution: "fsevents@patch:fsevents@npm%3A2.3.3#optional!builtin::version=2.3.3&hash=df0bf1" dependencies: @@ -11077,7 +11652,7 @@ __metadata: languageName: node linkType: hard -"graceful-fs@npm:^4.1.10, graceful-fs@npm:^4.1.11, graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.2, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": +"graceful-fs@npm:^4.1.10, graceful-fs@npm:^4.1.11, graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.11, graceful-fs@npm:^4.2.2, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": version: 4.2.11 resolution: "graceful-fs@npm:4.2.11" checksum: 10c0/386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2 @@ -11747,7 +12322,7 @@ __metadata: languageName: node linkType: hard -"import-local@npm:^3.0.2": +"import-local@npm:^3.2.0": version: 3.2.0 resolution: "import-local@npm:3.2.0" dependencies: @@ -12041,7 +12616,7 @@ __metadata: languageName: node linkType: hard -"is-generator-fn@npm:^2.0.0": +"is-generator-fn@npm:^2.1.0": version: 2.1.0 resolution: "is-generator-fn@npm:2.1.0" checksum: 10c0/2957cab387997a466cd0bf5c1b6047bd21ecb32bdcfd8996b15747aa01002c1c88731802f1b3d34ac99f4f6874b626418bd118658cf39380fe5fff32a3af9c4d @@ -12361,7 +12936,7 @@ __metadata: languageName: node linkType: hard -"istanbul-lib-instrument@npm:^6.0.0": +"istanbul-lib-instrument@npm:^6.0.0, istanbul-lib-instrument@npm:^6.0.2": version: 6.0.3 resolution: "istanbul-lib-instrument@npm:6.0.3" dependencies: @@ -12385,14 +12960,14 @@ __metadata: languageName: node linkType: hard -"istanbul-lib-source-maps@npm:^4.0.0": - version: 4.0.1 - resolution: "istanbul-lib-source-maps@npm:4.0.1" +"istanbul-lib-source-maps@npm:^5.0.0": + version: 5.0.6 + resolution: "istanbul-lib-source-maps@npm:5.0.6" dependencies: + "@jridgewell/trace-mapping": "npm:^0.3.23" debug: "npm:^4.1.1" istanbul-lib-coverage: "npm:^3.0.0" - source-map: "npm:^0.6.1" - checksum: 10c0/19e4cc405016f2c906dff271a76715b3e881fa9faeb3f09a86cb99b8512b3a5ed19cadfe0b54c17ca0e54c1142c9c6de9330d65506e35873994e06634eebeb66 + checksum: 10c0/ffe75d70b303a3621ee4671554f306e0831b16f39ab7f4ab52e54d356a5d33e534d97563e318f1333a6aae1d42f91ec49c76b6cd3f3fb378addcb5c81da0255f languageName: node linkType: hard @@ -12462,7 +13037,7 @@ __metadata: cross-env: "npm:^7.0.3" download-cli: "npm:^1.1.1" husky: "npm:^9.1.5" - jest: "npm:^29.7.0" + jest: "npm:^30.0.3" jest-environment-jsdom: "npm:^29.7.0" rimraf: "npm:^3.0.2" run-script-os: "npm:^1.1.6" @@ -12472,106 +13047,122 @@ __metadata: languageName: unknown linkType: soft -"jest-changed-files@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-changed-files@npm:29.7.0" +"jest-changed-files@npm:30.0.2": + version: 30.0.2 + resolution: "jest-changed-files@npm:30.0.2" dependencies: - execa: "npm:^5.0.0" - jest-util: "npm:^29.7.0" + execa: "npm:^5.1.1" + jest-util: "npm:30.0.2" p-limit: "npm:^3.1.0" - checksum: 10c0/e071384d9e2f6bb462231ac53f29bff86f0e12394c1b49ccafbad225ce2ab7da226279a8a94f421949920bef9be7ef574fd86aee22e8adfa149be73554ab828b + checksum: 10c0/794c9e47c460974f2303631d9ee44845d03f4ccd5240649a5f736aa94af78fa5931022324ab302c577dad6adb442ed17140dee9b9985bbfa0d43cad3048a7350 languageName: node linkType: hard -"jest-circus@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-circus@npm:29.7.0" +"jest-circus@npm:30.0.3": + version: 30.0.3 + resolution: "jest-circus@npm:30.0.3" dependencies: - "@jest/environment": "npm:^29.7.0" - "@jest/expect": "npm:^29.7.0" - "@jest/test-result": "npm:^29.7.0" - "@jest/types": "npm:^29.6.3" + "@jest/environment": "npm:30.0.2" + "@jest/expect": "npm:30.0.3" + "@jest/test-result": "npm:30.0.2" + "@jest/types": "npm:30.0.1" "@types/node": "npm:*" - chalk: "npm:^4.0.0" + chalk: "npm:^4.1.2" co: "npm:^4.6.0" - dedent: "npm:^1.0.0" - is-generator-fn: "npm:^2.0.0" - jest-each: "npm:^29.7.0" - jest-matcher-utils: "npm:^29.7.0" - jest-message-util: "npm:^29.7.0" - jest-runtime: "npm:^29.7.0" - jest-snapshot: "npm:^29.7.0" - jest-util: "npm:^29.7.0" + dedent: "npm:^1.6.0" + is-generator-fn: "npm:^2.1.0" + jest-each: "npm:30.0.2" + jest-matcher-utils: "npm:30.0.3" + jest-message-util: "npm:30.0.2" + jest-runtime: "npm:30.0.3" + jest-snapshot: "npm:30.0.3" + jest-util: "npm:30.0.2" p-limit: "npm:^3.1.0" - pretty-format: "npm:^29.7.0" - pure-rand: "npm:^6.0.0" + pretty-format: "npm:30.0.2" + pure-rand: "npm:^7.0.0" slash: "npm:^3.0.0" - stack-utils: "npm:^2.0.3" - checksum: 10c0/8d15344cf7a9f14e926f0deed64ed190c7a4fa1ed1acfcd81e4cc094d3cc5bf7902ebb7b874edc98ada4185688f90c91e1747e0dfd7ac12463b097968ae74b5e + stack-utils: "npm:^2.0.6" + checksum: 10c0/cb0838cc9f08984614d92c5fe857ea95f1bdff6de4a510a1b228cc9c0513d18bb2db89dcaf55624e754b11d77fb77bdba1fc56c6af34c1534102c498ce058399 languageName: node linkType: hard -"jest-cli@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-cli@npm:29.7.0" +"jest-cli@npm:30.0.3": + version: 30.0.3 + resolution: "jest-cli@npm:30.0.3" dependencies: - "@jest/core": "npm:^29.7.0" - "@jest/test-result": "npm:^29.7.0" - "@jest/types": "npm:^29.6.3" - chalk: "npm:^4.0.0" - create-jest: "npm:^29.7.0" - exit: "npm:^0.1.2" - import-local: "npm:^3.0.2" - jest-config: "npm:^29.7.0" - jest-util: "npm:^29.7.0" - jest-validate: "npm:^29.7.0" - yargs: "npm:^17.3.1" + "@jest/core": "npm:30.0.3" + "@jest/test-result": "npm:30.0.2" + "@jest/types": "npm:30.0.1" + chalk: "npm:^4.1.2" + exit-x: "npm:^0.2.2" + import-local: "npm:^3.2.0" + jest-config: "npm:30.0.3" + jest-util: "npm:30.0.2" + jest-validate: "npm:30.0.2" + yargs: "npm:^17.7.2" peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 peerDependenciesMeta: node-notifier: optional: true bin: - jest: bin/jest.js - checksum: 10c0/a658fd55050d4075d65c1066364595962ead7661711495cfa1dfeecf3d6d0a8ffec532f3dbd8afbb3e172dd5fd2fb2e813c5e10256e7cf2fea766314942fb43a + jest: ./bin/jest.js + checksum: 10c0/17925e9e885b00069e06672c221fbe073d1bff1d869f228bcba08ac23bf8d2c258c7211ce4d0e8408ca7d0edf0afb8ae4098e3d0f5da253eed22d385b135ca90 languageName: node linkType: hard -"jest-config@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-config@npm:29.7.0" +"jest-config@npm:30.0.3": + version: 30.0.3 + resolution: "jest-config@npm:30.0.3" dependencies: - "@babel/core": "npm:^7.11.6" - "@jest/test-sequencer": "npm:^29.7.0" - "@jest/types": "npm:^29.6.3" - babel-jest: "npm:^29.7.0" - chalk: "npm:^4.0.0" - ci-info: "npm:^3.2.0" - deepmerge: "npm:^4.2.2" - glob: "npm:^7.1.3" - graceful-fs: "npm:^4.2.9" - jest-circus: "npm:^29.7.0" - jest-environment-node: "npm:^29.7.0" - jest-get-type: "npm:^29.6.3" - jest-regex-util: "npm:^29.6.3" - jest-resolve: "npm:^29.7.0" - jest-runner: "npm:^29.7.0" - jest-util: "npm:^29.7.0" - jest-validate: "npm:^29.7.0" - micromatch: "npm:^4.0.4" + "@babel/core": "npm:^7.27.4" + "@jest/get-type": "npm:30.0.1" + "@jest/pattern": "npm:30.0.1" + "@jest/test-sequencer": "npm:30.0.2" + "@jest/types": "npm:30.0.1" + babel-jest: "npm:30.0.2" + chalk: "npm:^4.1.2" + ci-info: "npm:^4.2.0" + deepmerge: "npm:^4.3.1" + glob: "npm:^10.3.10" + graceful-fs: "npm:^4.2.11" + jest-circus: "npm:30.0.3" + jest-docblock: "npm:30.0.1" + jest-environment-node: "npm:30.0.2" + jest-regex-util: "npm:30.0.1" + jest-resolve: "npm:30.0.2" + jest-runner: "npm:30.0.3" + jest-util: "npm:30.0.2" + jest-validate: "npm:30.0.2" + micromatch: "npm:^4.0.8" parse-json: "npm:^5.2.0" - pretty-format: "npm:^29.7.0" + pretty-format: "npm:30.0.2" slash: "npm:^3.0.0" strip-json-comments: "npm:^3.1.1" peerDependencies: "@types/node": "*" + esbuild-register: ">=3.4.0" ts-node: ">=9.0.0" peerDependenciesMeta: "@types/node": optional: true + esbuild-register: + optional: true ts-node: optional: true - checksum: 10c0/bab23c2eda1fff06e0d104b00d6adfb1d1aabb7128441899c9bff2247bd26710b050a5364281ce8d52b46b499153bf7e3ee88b19831a8f3451f1477a0246a0f1 + checksum: 10c0/bcde9e0e715bbc12dd36a135d6e081566291b0726ed7b3ac9a1e2ee2ade7c9bcc25d312ef8a649b72b9c99e2ad6661eb843eeb919ba6206f2ec2acccdd1e57d2 + languageName: node + linkType: hard + +"jest-diff@npm:30.0.3": + version: 30.0.3 + resolution: "jest-diff@npm:30.0.3" + dependencies: + "@jest/diff-sequences": "npm:30.0.1" + "@jest/get-type": "npm:30.0.1" + chalk: "npm:^4.1.2" + pretty-format: "npm:30.0.2" + checksum: 10c0/f6aaed30fc99bdca4b8b4505b283ffc78b780aa1bf33670dfbfe439e124721e7f6198c03217f7ed17a22c7d2ca79363afd6a4245643596fa21ae082b6b4ed4f5 languageName: node linkType: hard @@ -12587,6 +13178,15 @@ __metadata: languageName: node linkType: hard +"jest-docblock@npm:30.0.1": + version: 30.0.1 + resolution: "jest-docblock@npm:30.0.1" + dependencies: + detect-newline: "npm:^3.1.0" + checksum: 10c0/f9bad2651db8afa029867ea7a40f422c9d73c67657360297371846a314a40c8786424be00483261df9137499f52c2af28cd458fbd15a7bf7fac8775b4bcd6ee1 + languageName: node + linkType: hard + "jest-docblock@npm:^29.7.0": version: 29.7.0 resolution: "jest-docblock@npm:29.7.0" @@ -12596,16 +13196,16 @@ __metadata: languageName: node linkType: hard -"jest-each@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-each@npm:29.7.0" +"jest-each@npm:30.0.2": + version: 30.0.2 + resolution: "jest-each@npm:30.0.2" dependencies: - "@jest/types": "npm:^29.6.3" - chalk: "npm:^4.0.0" - jest-get-type: "npm:^29.6.3" - jest-util: "npm:^29.7.0" - pretty-format: "npm:^29.7.0" - checksum: 10c0/f7f9a90ebee80cc688e825feceb2613627826ac41ea76a366fa58e669c3b2403d364c7c0a74d862d469b103c843154f8456d3b1c02b487509a12afa8b59edbb4 + "@jest/get-type": "npm:30.0.1" + "@jest/types": "npm:30.0.1" + chalk: "npm:^4.1.2" + jest-util: "npm:30.0.2" + pretty-format: "npm:30.0.2" + checksum: 10c0/6fff0a470d08ba3f0149c58266b7e938e3e183398f99065fe937290f1297ca254635f0f4bca6196514f756fac0a9759144b1c7f67bef97cc0b7fa0b96304df9e languageName: node linkType: hard @@ -12630,6 +13230,21 @@ __metadata: languageName: node linkType: hard +"jest-environment-node@npm:30.0.2": + version: 30.0.2 + resolution: "jest-environment-node@npm:30.0.2" + dependencies: + "@jest/environment": "npm:30.0.2" + "@jest/fake-timers": "npm:30.0.2" + "@jest/types": "npm:30.0.1" + "@types/node": "npm:*" + jest-mock: "npm:30.0.2" + jest-util: "npm:30.0.2" + jest-validate: "npm:30.0.2" + checksum: 10c0/e58515d26f13704c3be6281d029c4fa0902172d2a55751205badf0153630520c4e651f7923577e1ab0dfbb64c4fedb1e4b78622b53b3a8d8e0515c1923f3adc3 + languageName: node + linkType: hard + "jest-environment-node@npm:^29.7.0": version: 29.7.0 resolution: "jest-environment-node@npm:29.7.0" @@ -12651,6 +13266,28 @@ __metadata: languageName: node linkType: hard +"jest-haste-map@npm:30.0.2": + version: 30.0.2 + resolution: "jest-haste-map@npm:30.0.2" + dependencies: + "@jest/types": "npm:30.0.1" + "@types/node": "npm:*" + anymatch: "npm:^3.1.3" + fb-watchman: "npm:^2.0.2" + fsevents: "npm:^2.3.3" + graceful-fs: "npm:^4.2.11" + jest-regex-util: "npm:30.0.1" + jest-util: "npm:30.0.2" + jest-worker: "npm:30.0.2" + micromatch: "npm:^4.0.8" + walker: "npm:^1.0.8" + dependenciesMeta: + fsevents: + optional: true + checksum: 10c0/6427b6976beb3fd33cae9a516e24f409d0cc0be2afa12a62e95671001a0d0d61662e8b2185027639b2036fe3e3b055e9d9b4dfd2063e787cf2a5d2140da0b80a + languageName: node + linkType: hard + "jest-haste-map@npm:^29.7.0": version: 29.7.0 resolution: "jest-haste-map@npm:29.7.0" @@ -12686,6 +13323,16 @@ __metadata: languageName: node linkType: hard +"jest-leak-detector@npm:30.0.2": + version: 30.0.2 + resolution: "jest-leak-detector@npm:30.0.2" + dependencies: + "@jest/get-type": "npm:30.0.1" + pretty-format: "npm:30.0.2" + checksum: 10c0/1df28475c40b41024adc6e18af0d3dc8d8d318fdbbf5c3560321fea0af2e0784c57f788b5b152efd83274ab6ea8dc3b36662060a83a2a555ffd8cdf7d628ee76 + languageName: node + linkType: hard + "jest-leak-detector@npm:^29.7.0": version: 29.7.0 resolution: "jest-leak-detector@npm:29.7.0" @@ -12696,6 +13343,18 @@ __metadata: languageName: node linkType: hard +"jest-matcher-utils@npm:30.0.3": + version: 30.0.3 + resolution: "jest-matcher-utils@npm:30.0.3" + dependencies: + "@jest/get-type": "npm:30.0.1" + chalk: "npm:^4.1.2" + jest-diff: "npm:30.0.3" + pretty-format: "npm:30.0.2" + checksum: 10c0/4d354f6d8d3992228ba5f0ecc728ec0c46f3693805927253d67e461e754deadc1e1b48ae80918e3f029c22da4abed9aaadb5049da1a1697f6714b0f6076eeafa + languageName: node + linkType: hard + "jest-matcher-utils@npm:^29.7.0": version: 29.7.0 resolution: "jest-matcher-utils@npm:29.7.0" @@ -12708,6 +13367,23 @@ __metadata: languageName: node linkType: hard +"jest-message-util@npm:30.0.2": + version: 30.0.2 + resolution: "jest-message-util@npm:30.0.2" + dependencies: + "@babel/code-frame": "npm:^7.27.1" + "@jest/types": "npm:30.0.1" + "@types/stack-utils": "npm:^2.0.3" + chalk: "npm:^4.1.2" + graceful-fs: "npm:^4.2.11" + micromatch: "npm:^4.0.8" + pretty-format: "npm:30.0.2" + slash: "npm:^3.0.0" + stack-utils: "npm:^2.0.6" + checksum: 10c0/c010d5b7d86e735e2fb4c4a220f57004349f488f5d4663240a7e9f2694d01b5228136540d55036777fde4227b5e0b56f08885b7f69395b295cab878357b1aeb1 + languageName: node + linkType: hard + "jest-message-util@npm:^29.7.0": version: 29.7.0 resolution: "jest-message-util@npm:29.7.0" @@ -12725,6 +13401,17 @@ __metadata: languageName: node linkType: hard +"jest-mock@npm:30.0.2": + version: 30.0.2 + resolution: "jest-mock@npm:30.0.2" + dependencies: + "@jest/types": "npm:30.0.1" + "@types/node": "npm:*" + jest-util: "npm:30.0.2" + checksum: 10c0/7728997c1d654475b88e18b7ba33a2a1b9f89ce33a9082bf2d14dcc3e831f372f80c762e481777886a3a04b4489ea5390ecdeb21c4def57fba5b2c77086a3959 + languageName: node + linkType: hard + "jest-mock@npm:^29.7.0": version: 29.7.0 resolution: "jest-mock@npm:29.7.0" @@ -12736,7 +13423,7 @@ __metadata: languageName: node linkType: hard -"jest-pnp-resolver@npm:^1.2.2": +"jest-pnp-resolver@npm:^1.2.2, jest-pnp-resolver@npm:^1.2.3": version: 1.2.3 resolution: "jest-pnp-resolver@npm:1.2.3" peerDependencies: @@ -12748,6 +13435,13 @@ __metadata: languageName: node linkType: hard +"jest-regex-util@npm:30.0.1": + version: 30.0.1 + resolution: "jest-regex-util@npm:30.0.1" + checksum: 10c0/f30c70524ebde2d1012afe5ffa5691d5d00f7d5ba9e43d588f6460ac6fe96f9e620f2f9b36a02d0d3e7e77bc8efb8b3450ae3b80ac53c8be5099e01bf54f6728 + languageName: node + linkType: hard + "jest-regex-util@npm:^29.6.3": version: 29.6.3 resolution: "jest-regex-util@npm:29.6.3" @@ -12755,13 +13449,29 @@ __metadata: languageName: node linkType: hard -"jest-resolve-dependencies@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-resolve-dependencies@npm:29.7.0" +"jest-resolve-dependencies@npm:30.0.3": + version: 30.0.3 + resolution: "jest-resolve-dependencies@npm:30.0.3" dependencies: - jest-regex-util: "npm:^29.6.3" - jest-snapshot: "npm:^29.7.0" - checksum: 10c0/b6e9ad8ae5b6049474118ea6441dfddd385b6d1fc471db0136f7c8fbcfe97137a9665e4f837a9f49f15a29a1deb95a14439b7aec812f3f99d08f228464930f0d + jest-regex-util: "npm:30.0.1" + jest-snapshot: "npm:30.0.3" + checksum: 10c0/5684e62f05d19c5ab97b2b2262075f056bd48745bf25501671d0b9a03f2a0548ab04370b9cec6e97207d57ead54d706a67ef3254729cacb6d6405ef381cdf511 + languageName: node + linkType: hard + +"jest-resolve@npm:30.0.2": + version: 30.0.2 + resolution: "jest-resolve@npm:30.0.2" + dependencies: + chalk: "npm:^4.1.2" + graceful-fs: "npm:^4.2.11" + jest-haste-map: "npm:30.0.2" + jest-pnp-resolver: "npm:^1.2.3" + jest-util: "npm:30.0.2" + jest-validate: "npm:30.0.2" + slash: "npm:^3.0.0" + unrs-resolver: "npm:^1.7.11" + checksum: 10c0/33ae69455b1206a926bb6f7dd46cd4b6cbf5e095387078873a05dfb693bef419b93897e052ee68026b31b5e5f537fdcfce42f2d31af0ce7e64a8179ed7882b51 languageName: node linkType: hard @@ -12782,6 +13492,36 @@ __metadata: languageName: node linkType: hard +"jest-runner@npm:30.0.3": + version: 30.0.3 + resolution: "jest-runner@npm:30.0.3" + dependencies: + "@jest/console": "npm:30.0.2" + "@jest/environment": "npm:30.0.2" + "@jest/test-result": "npm:30.0.2" + "@jest/transform": "npm:30.0.2" + "@jest/types": "npm:30.0.1" + "@types/node": "npm:*" + chalk: "npm:^4.1.2" + emittery: "npm:^0.13.1" + exit-x: "npm:^0.2.2" + graceful-fs: "npm:^4.2.11" + jest-docblock: "npm:30.0.1" + jest-environment-node: "npm:30.0.2" + jest-haste-map: "npm:30.0.2" + jest-leak-detector: "npm:30.0.2" + jest-message-util: "npm:30.0.2" + jest-resolve: "npm:30.0.2" + jest-runtime: "npm:30.0.3" + jest-util: "npm:30.0.2" + jest-watcher: "npm:30.0.2" + jest-worker: "npm:30.0.2" + p-limit: "npm:^3.1.0" + source-map-support: "npm:0.5.13" + checksum: 10c0/d139ee4ed4f2d7aeefc8c496efc906960e938beadc22dce6167e7270db4e10260092eace6748a6efb7ee2a40e3bd3ee5d60cbefc2a1e3459826cfde69cdb9195 + languageName: node + linkType: hard + "jest-runner@npm:^29.7.0": version: 29.7.0 resolution: "jest-runner@npm:29.7.0" @@ -12811,6 +13551,36 @@ __metadata: languageName: node linkType: hard +"jest-runtime@npm:30.0.3": + version: 30.0.3 + resolution: "jest-runtime@npm:30.0.3" + dependencies: + "@jest/environment": "npm:30.0.2" + "@jest/fake-timers": "npm:30.0.2" + "@jest/globals": "npm:30.0.3" + "@jest/source-map": "npm:30.0.1" + "@jest/test-result": "npm:30.0.2" + "@jest/transform": "npm:30.0.2" + "@jest/types": "npm:30.0.1" + "@types/node": "npm:*" + chalk: "npm:^4.1.2" + cjs-module-lexer: "npm:^2.1.0" + collect-v8-coverage: "npm:^1.0.2" + glob: "npm:^10.3.10" + graceful-fs: "npm:^4.2.11" + jest-haste-map: "npm:30.0.2" + jest-message-util: "npm:30.0.2" + jest-mock: "npm:30.0.2" + jest-regex-util: "npm:30.0.1" + jest-resolve: "npm:30.0.2" + jest-snapshot: "npm:30.0.3" + jest-util: "npm:30.0.2" + slash: "npm:^3.0.0" + strip-bom: "npm:^4.0.0" + checksum: 10c0/01a184b80bf1ae2d6eca280daf37e355b983795e342406de461cf4d45c75ec48a635bf89c08d54fb73f851180e870ef82004fd1f6b335f0329dc07f3bd14a94d + languageName: node + linkType: hard + "jest-runtime@npm:^29.7.0": version: 29.7.0 resolution: "jest-runtime@npm:29.7.0" @@ -12841,6 +13611,35 @@ __metadata: languageName: node linkType: hard +"jest-snapshot@npm:30.0.3": + version: 30.0.3 + resolution: "jest-snapshot@npm:30.0.3" + dependencies: + "@babel/core": "npm:^7.27.4" + "@babel/generator": "npm:^7.27.5" + "@babel/plugin-syntax-jsx": "npm:^7.27.1" + "@babel/plugin-syntax-typescript": "npm:^7.27.1" + "@babel/types": "npm:^7.27.3" + "@jest/expect-utils": "npm:30.0.3" + "@jest/get-type": "npm:30.0.1" + "@jest/snapshot-utils": "npm:30.0.1" + "@jest/transform": "npm:30.0.2" + "@jest/types": "npm:30.0.1" + babel-preset-current-node-syntax: "npm:^1.1.0" + chalk: "npm:^4.1.2" + expect: "npm:30.0.3" + graceful-fs: "npm:^4.2.11" + jest-diff: "npm:30.0.3" + jest-matcher-utils: "npm:30.0.3" + jest-message-util: "npm:30.0.2" + jest-util: "npm:30.0.2" + pretty-format: "npm:30.0.2" + semver: "npm:^7.7.2" + synckit: "npm:^0.11.8" + checksum: 10c0/0af682495b79bc0e640edbb03ada06db073a0784d6a9c0bb11e592afa4d0dca63c63ab485f540e8d1bd7674456418906e194e7f0660cc20107423d4fe11b4d6e + languageName: node + linkType: hard + "jest-snapshot@npm:^29.7.0": version: 29.7.0 resolution: "jest-snapshot@npm:29.7.0" @@ -12869,6 +13668,20 @@ __metadata: languageName: node linkType: hard +"jest-util@npm:30.0.2": + version: 30.0.2 + resolution: "jest-util@npm:30.0.2" + dependencies: + "@jest/types": "npm:30.0.1" + "@types/node": "npm:*" + chalk: "npm:^4.1.2" + ci-info: "npm:^4.2.0" + graceful-fs: "npm:^4.2.11" + picomatch: "npm:^4.0.2" + checksum: 10c0/07de384790b8e5a5925fba5448fa1475790a5b52271fbf99958c18e468da1af940f8b45e330d87766576cf6c5d1f4f41ce51c976483a5079653d9fcdba8aac8e + languageName: node + linkType: hard + "jest-util@npm:^29.0.0, jest-util@npm:^29.7.0": version: 29.7.0 resolution: "jest-util@npm:29.7.0" @@ -12883,6 +13696,20 @@ __metadata: languageName: node linkType: hard +"jest-validate@npm:30.0.2": + version: 30.0.2 + resolution: "jest-validate@npm:30.0.2" + dependencies: + "@jest/get-type": "npm:30.0.1" + "@jest/types": "npm:30.0.1" + camelcase: "npm:^6.3.0" + chalk: "npm:^4.1.2" + leven: "npm:^3.1.0" + pretty-format: "npm:30.0.2" + checksum: 10c0/9fd1b4f604851187655353eefe8db25db9638dd312d2e29d58868e626d78925edefe94fe2c8eb63305eefd41e5fe7f8aff334e2db9db5aaddeec866f9f6561d8 + languageName: node + linkType: hard + "jest-validate@npm:^29.7.0": version: 29.7.0 resolution: "jest-validate@npm:29.7.0" @@ -12897,6 +13724,22 @@ __metadata: languageName: node linkType: hard +"jest-watcher@npm:30.0.2": + version: 30.0.2 + resolution: "jest-watcher@npm:30.0.2" + dependencies: + "@jest/test-result": "npm:30.0.2" + "@jest/types": "npm:30.0.1" + "@types/node": "npm:*" + ansi-escapes: "npm:^4.3.2" + chalk: "npm:^4.1.2" + emittery: "npm:^0.13.1" + jest-util: "npm:30.0.2" + string-length: "npm:^4.0.2" + checksum: 10c0/7cb09da5feaa6c5558e5149406bde354c3e227ef692b5371efe4d13cf566d42a157c04a55f3a201d191afb7ebc49be84b1ed5a744f46497d9ecccc323d8963f5 + languageName: node + linkType: hard + "jest-watcher@npm:^29.7.0": version: 29.7.0 resolution: "jest-watcher@npm:29.7.0" @@ -12913,6 +13756,19 @@ __metadata: languageName: node linkType: hard +"jest-worker@npm:30.0.2": + version: 30.0.2 + resolution: "jest-worker@npm:30.0.2" + dependencies: + "@types/node": "npm:*" + "@ungap/structured-clone": "npm:^1.3.0" + jest-util: "npm:30.0.2" + merge-stream: "npm:^2.0.0" + supports-color: "npm:^8.1.1" + checksum: 10c0/d7d237e763a2f1aed4eba07f977490442a7bb085f7ab63163afa88776804c2644cc05a1e32da9d05a4b895ad22b2e939ef01a90ffb3024b53fc8c73b8ad1d3f1 + languageName: node + linkType: hard + "jest-worker@npm:^29.7.0": version: 29.7.0 resolution: "jest-worker@npm:29.7.0" @@ -12925,22 +13781,22 @@ __metadata: languageName: node linkType: hard -"jest@npm:^29.7.0": - version: 29.7.0 - resolution: "jest@npm:29.7.0" +"jest@npm:^30.0.3": + version: 30.0.3 + resolution: "jest@npm:30.0.3" dependencies: - "@jest/core": "npm:^29.7.0" - "@jest/types": "npm:^29.6.3" - import-local: "npm:^3.0.2" - jest-cli: "npm:^29.7.0" + "@jest/core": "npm:30.0.3" + "@jest/types": "npm:30.0.1" + import-local: "npm:^3.2.0" + jest-cli: "npm:30.0.3" peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 peerDependenciesMeta: node-notifier: optional: true bin: - jest: bin/jest.js - checksum: 10c0/f40eb8171cf147c617cc6ada49d062fbb03b4da666cb8d39cdbfb739a7d75eea4c3ca150fb072d0d273dce0c753db4d0467d54906ad0293f59c54f9db4a09d8b + jest: ./bin/jest.js + checksum: 10c0/ae4fbee2756e03b6f99f612438e3b4e25789731599a4d4617ce5002d4c68f169f6223f6b21522fe65cd3d00519e0bb534ac6db6b2cdb7cd46a4ad3ded6542f38 languageName: node linkType: hard @@ -13270,13 +14126,6 @@ __metadata: languageName: node linkType: hard -"kleur@npm:^3.0.3": - version: 3.0.3 - resolution: "kleur@npm:3.0.3" - checksum: 10c0/cd3a0b8878e7d6d3799e54340efe3591ca787d9f95f109f28129bdd2915e37807bf8918bb295ab86afb8c82196beec5a1adcaf29042ce3f2bd932b038fe3aa4b - languageName: node - linkType: hard - "layerr@npm:^3.0.0": version: 3.0.0 resolution: "layerr@npm:3.0.0" @@ -14794,6 +15643,15 @@ __metadata: languageName: node linkType: hard +"napi-postinstall@npm:^0.2.4": + version: 0.2.5 + resolution: "napi-postinstall@npm:0.2.5" + bin: + napi-postinstall: lib/cli.js + checksum: 10c0/c4a1a8ca61aece10a6a7b46b834d7689321c4bb164710df9d896a273f24544084c5be95b47c55208036a06ae5bfa0afabb6a8886985d4438543ee07344b9c90c + languageName: node + linkType: hard + "natural-compare@npm:^1.4.0": version: 1.4.0 resolution: "natural-compare@npm:1.4.0" @@ -15836,7 +16694,7 @@ __metadata: languageName: node linkType: hard -"pirates@npm:^4.0.6": +"pirates@npm:^4.0.6, pirates@npm:^4.0.7": version: 4.0.7 resolution: "pirates@npm:4.0.7" checksum: 10c0/a51f108dd811beb779d58a76864bbd49e239fa40c7984cd11596c75a121a8cc789f1c8971d8bb15f0dbf9d48b76c05bb62fcbce840f89b688c0fa64b37e8478a @@ -15980,7 +16838,18 @@ __metadata: languageName: node linkType: hard -"pretty-format@npm:^29.0.0, pretty-format@npm:^29.7.0": +"pretty-format@npm:30.0.2, pretty-format@npm:^30.0.0": + version: 30.0.2 + resolution: "pretty-format@npm:30.0.2" + dependencies: + "@jest/schemas": "npm:30.0.1" + ansi-styles: "npm:^5.2.0" + react-is: "npm:^18.3.1" + checksum: 10c0/cf542dc2d0be95e2b1c6e3a397a4fc13fce1c9f8feed6b56165c0d23c7a83423abb6b032ed8e3e1b7c1c0709f9b117dd30b5185f107e58f8766616be6de84850 + languageName: node + linkType: hard + +"pretty-format@npm:^29.7.0": version: 29.7.0 resolution: "pretty-format@npm:29.7.0" dependencies: @@ -16078,16 +16947,6 @@ __metadata: languageName: node linkType: hard -"prompts@npm:^2.0.1": - version: 2.4.2 - resolution: "prompts@npm:2.4.2" - dependencies: - kleur: "npm:^3.0.3" - sisteransi: "npm:^1.0.5" - checksum: 10c0/16f1ac2977b19fe2cf53f8411cc98db7a3c8b115c479b2ca5c82b5527cd937aa405fa04f9a5960abeb9daef53191b53b4d13e35c1f5d50e8718c76917c5f1ea4 - languageName: node - linkType: hard - "prop-types@npm:^15.7.2, prop-types@npm:^15.8.1": version: 15.8.1 resolution: "prop-types@npm:15.8.1" @@ -16183,10 +17042,10 @@ __metadata: languageName: node linkType: hard -"pure-rand@npm:^6.0.0": - version: 6.1.0 - resolution: "pure-rand@npm:6.1.0" - checksum: 10c0/1abe217897bf74dcb3a0c9aba3555fe975023147b48db540aa2faf507aee91c03bf54f6aef0eb2bf59cc259a16d06b28eca37f0dc426d94f4692aeff02fb0e65 +"pure-rand@npm:^7.0.0": + version: 7.0.1 + resolution: "pure-rand@npm:7.0.1" + checksum: 10c0/9cade41030f5ec95f5d55a11a71404cd6f46b69becaad892097cd7f58e2c6248cd0a933349ca7d21336ab629f1da42ffe899699b671bc4651600eaf6e57f837e languageName: node linkType: hard @@ -16348,7 +17207,7 @@ __metadata: languageName: node linkType: hard -"react-is@npm:^18.0.0": +"react-is@npm:^18.0.0, react-is@npm:^18.3.1": version: 18.3.1 resolution: "react-is@npm:18.3.1" checksum: 10c0/f2f1e60010c683479e74c63f96b09fb41603527cd131a9959e2aee1e5a8b0caf270b365e5ca77d4a6b18aae659b60a86150bb3979073528877029b35aecd2072 @@ -17478,6 +18337,15 @@ __metadata: languageName: node linkType: hard +"semver@npm:^7.7.2": + version: 7.7.2 + resolution: "semver@npm:7.7.2" + bin: + semver: bin/semver.js + checksum: 10c0/aca305edfbf2383c22571cb7714f48cadc7ac95371b4b52362fb8eeffdfbc0de0669368b82b2b15978f8848f01d7114da65697e56cd8c37b0dab8c58e543f9ea + languageName: node + linkType: hard + "serialize-error@npm:^7.0.1": version: 7.0.1 resolution: "serialize-error@npm:7.0.1" @@ -17668,13 +18536,6 @@ __metadata: languageName: node linkType: hard -"sisteransi@npm:^1.0.5": - version: 1.0.5 - resolution: "sisteransi@npm:1.0.5" - checksum: 10c0/230ac975cca485b7f6fe2b96a711aa62a6a26ead3e6fb8ba17c5a00d61b8bed0d7adc21f5626b70d7c33c62ff4e63933017a6462942c719d1980bb0b1207ad46 - languageName: node - linkType: hard - "skin-tone@npm:^2.0.0": version: 2.0.0 resolution: "skin-tone@npm:2.0.0" @@ -17856,7 +18717,7 @@ __metadata: languageName: node linkType: hard -"source-map@npm:^0.6.0, source-map@npm:^0.6.1, source-map@npm:~0.6.1": +"source-map@npm:^0.6.0, source-map@npm:~0.6.1": version: 0.6.1 resolution: "source-map@npm:0.6.1" checksum: 10c0/ab55398007c5e5532957cb0beee2368529618ac0ab372d789806f5718123cc4367d57de3904b4e6a4170eb5a0b0f41373066d02ca0735a0c4d75c7d328d3e011 @@ -17973,7 +18834,7 @@ __metadata: languageName: node linkType: hard -"stack-utils@npm:^2.0.3": +"stack-utils@npm:^2.0.3, stack-utils@npm:^2.0.6": version: 2.0.6 resolution: "stack-utils@npm:2.0.6" dependencies: @@ -18039,7 +18900,7 @@ __metadata: languageName: node linkType: hard -"string-length@npm:^4.0.1": +"string-length@npm:^4.0.1, string-length@npm:^4.0.2": version: 4.0.2 resolution: "string-length@npm:4.0.2" dependencies: @@ -18251,6 +19112,15 @@ __metadata: languageName: node linkType: hard +"synckit@npm:^0.11.8": + version: 0.11.8 + resolution: "synckit@npm:0.11.8" + dependencies: + "@pkgr/core": "npm:^0.2.4" + checksum: 10c0/a1de5131ee527512afcaafceb2399b2f3e63678e56b831e1cb2dc7019c972a8b654703a3b94ef4166868f87eb984ea252b467c9d9e486b018ec2e6a55c24dfd8 + languageName: node + linkType: hard + "tailwind-merge@npm:^3.2.0": version: 3.2.0 resolution: "tailwind-merge@npm:3.2.0" @@ -19163,6 +20033,73 @@ __metadata: languageName: node linkType: hard +"unrs-resolver@npm:^1.7.11": + version: 1.9.2 + resolution: "unrs-resolver@npm:1.9.2" + dependencies: + "@unrs/resolver-binding-android-arm-eabi": "npm:1.9.2" + "@unrs/resolver-binding-android-arm64": "npm:1.9.2" + "@unrs/resolver-binding-darwin-arm64": "npm:1.9.2" + "@unrs/resolver-binding-darwin-x64": "npm:1.9.2" + "@unrs/resolver-binding-freebsd-x64": "npm:1.9.2" + "@unrs/resolver-binding-linux-arm-gnueabihf": "npm:1.9.2" + "@unrs/resolver-binding-linux-arm-musleabihf": "npm:1.9.2" + "@unrs/resolver-binding-linux-arm64-gnu": "npm:1.9.2" + "@unrs/resolver-binding-linux-arm64-musl": "npm:1.9.2" + "@unrs/resolver-binding-linux-ppc64-gnu": "npm:1.9.2" + "@unrs/resolver-binding-linux-riscv64-gnu": "npm:1.9.2" + "@unrs/resolver-binding-linux-riscv64-musl": "npm:1.9.2" + "@unrs/resolver-binding-linux-s390x-gnu": "npm:1.9.2" + "@unrs/resolver-binding-linux-x64-gnu": "npm:1.9.2" + "@unrs/resolver-binding-linux-x64-musl": "npm:1.9.2" + "@unrs/resolver-binding-wasm32-wasi": "npm:1.9.2" + "@unrs/resolver-binding-win32-arm64-msvc": "npm:1.9.2" + "@unrs/resolver-binding-win32-ia32-msvc": "npm:1.9.2" + "@unrs/resolver-binding-win32-x64-msvc": "npm:1.9.2" + napi-postinstall: "npm:^0.2.4" + dependenciesMeta: + "@unrs/resolver-binding-android-arm-eabi": + optional: true + "@unrs/resolver-binding-android-arm64": + optional: true + "@unrs/resolver-binding-darwin-arm64": + optional: true + "@unrs/resolver-binding-darwin-x64": + optional: true + "@unrs/resolver-binding-freebsd-x64": + optional: true + "@unrs/resolver-binding-linux-arm-gnueabihf": + optional: true + "@unrs/resolver-binding-linux-arm-musleabihf": + optional: true + "@unrs/resolver-binding-linux-arm64-gnu": + optional: true + "@unrs/resolver-binding-linux-arm64-musl": + optional: true + "@unrs/resolver-binding-linux-ppc64-gnu": + optional: true + "@unrs/resolver-binding-linux-riscv64-gnu": + optional: true + "@unrs/resolver-binding-linux-riscv64-musl": + optional: true + "@unrs/resolver-binding-linux-s390x-gnu": + optional: true + "@unrs/resolver-binding-linux-x64-gnu": + optional: true + "@unrs/resolver-binding-linux-x64-musl": + optional: true + "@unrs/resolver-binding-wasm32-wasi": + optional: true + "@unrs/resolver-binding-win32-arm64-msvc": + optional: true + "@unrs/resolver-binding-win32-ia32-msvc": + optional: true + "@unrs/resolver-binding-win32-x64-msvc": + optional: true + checksum: 10c0/e3481cc19ea4b25f888e2412bbd80a729b13527a41b035e784b71d1a7d4e2109b58b174adce989085eb75c787435e80ffb385db2b1598288474f53beb01438c0 + languageName: node + linkType: hard + "unset-value@npm:^1.0.0": version: 1.0.0 resolution: "unset-value@npm:1.0.0" @@ -19942,7 +20879,7 @@ __metadata: languageName: node linkType: hard -"write-file-atomic@npm:^5.0.0": +"write-file-atomic@npm:^5.0.0, write-file-atomic@npm:^5.0.1": version: 5.0.1 resolution: "write-file-atomic@npm:5.0.1" dependencies: @@ -20031,7 +20968,7 @@ __metadata: languageName: node linkType: hard -"yargs@npm:^17.3.1, yargs@npm:^17.7.2": +"yargs@npm:^17.7.2": version: 17.7.2 resolution: "yargs@npm:17.7.2" dependencies: From 0e2a00e006631ad3bff649e36e3bc25af2f45a77 Mon Sep 17 00:00:00 2001 From: Bui Quang Huy <34532913+LazyYuuki@users.noreply.github.com> Date: Tue, 1 Jul 2025 09:58:36 +0800 Subject: [PATCH 32/48] Create epic.yml --- .github/ISSUE_TEMPLATE/epic.yml | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/epic.yml diff --git a/.github/ISSUE_TEMPLATE/epic.yml b/.github/ISSUE_TEMPLATE/epic.yml new file mode 100644 index 000000000..a1364c049 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/epic.yml @@ -0,0 +1,24 @@ +name: "\U0001F31F Epic" +description: "Major building block that push us toward Jan Goal" +title: 'goal: ' +type: "Epic" +projects: ["menloresearch/30"] +body: + - type: textarea + validations: + required: true + attributes: + label: "Goal" + description: "Describe the conten of the goal" + + - type: textarea + validations: + required: true + attributes: + label: "Tasklist" + description: "List of task to complete to reach the goal" + + - type: textarea + attributes: + label: "Out of scope" + description: "List of things that is out of scope for this goal" From 041fc2b33077244d64d9c29e40ef3a4fbce5525b Mon Sep 17 00:00:00 2001 From: Bui Quang Huy <34532913+LazyYuuki@users.noreply.github.com> Date: Tue, 1 Jul 2025 10:01:11 +0800 Subject: [PATCH 33/48] Update .github/ISSUE_TEMPLATE/epic.yml Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> --- .github/ISSUE_TEMPLATE/epic.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/epic.yml b/.github/ISSUE_TEMPLATE/epic.yml index a1364c049..580187c7b 100644 --- a/.github/ISSUE_TEMPLATE/epic.yml +++ b/.github/ISSUE_TEMPLATE/epic.yml @@ -9,7 +9,7 @@ body: required: true attributes: label: "Goal" - description: "Describe the conten of the goal" + description: "Describe the content of the goal" - type: textarea validations: From f62290cb0002cb43dcfda07523dc573f86f79bf8 Mon Sep 17 00:00:00 2001 From: Bui Quang Huy <34532913+LazyYuuki@users.noreply.github.com> Date: Tue, 1 Jul 2025 10:01:27 +0800 Subject: [PATCH 34/48] Update .github/ISSUE_TEMPLATE/epic.yml Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> --- .github/ISSUE_TEMPLATE/epic.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/epic.yml b/.github/ISSUE_TEMPLATE/epic.yml index 580187c7b..66346c33a 100644 --- a/.github/ISSUE_TEMPLATE/epic.yml +++ b/.github/ISSUE_TEMPLATE/epic.yml @@ -16,7 +16,7 @@ body: required: true attributes: label: "Tasklist" - description: "List of task to complete to reach the goal" + description: "List of tasks to complete to reach the goal" - type: textarea attributes: From 34014451ce75226d7c04cb7102e3d282406fb731 Mon Sep 17 00:00:00 2001 From: Nguyen Ngoc Minh <91668012+Minh141120@users.noreply.github.com> Date: Tue, 1 Jul 2025 09:14:50 +0700 Subject: [PATCH 35/48] chore: add build script for appimage package (#5635) --- .devcontainer/buildAppImage.sh | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 .devcontainer/buildAppImage.sh diff --git a/.devcontainer/buildAppImage.sh b/.devcontainer/buildAppImage.sh new file mode 100644 index 000000000..efb963d5a --- /dev/null +++ b/.devcontainer/buildAppImage.sh @@ -0,0 +1,24 @@ +#!/usr/bin/env bash + +make clean + +# To reproduce https://github.com/menloresearch/jan/pull/5463 +TAURI_TOOLKIT_PATH="${XDG_CACHE_HOME:-$HOME/.cache}/tauri" +mkdir -p "$TAURI_TOOLKIT_PATH" +wget https://github.com/linuxdeploy/linuxdeploy/releases/download/1-alpha-20250213-2/linuxdeploy-x86_64.AppImage -O "$TAURI_TOOLKIT_PATH/linuxdeploy-x86_64.AppImage" +chmod +x "$TAURI_TOOLKIT_PATH/linuxdeploy-x86_64.AppImage" + +jq '.bundle.resources = ["resources/pre-install/**/*"] | .bundle.externalBin = ["binaries/cortex-server", "resources/bin/uv"]' ./src-tauri/tauri.conf.json > /tmp/tauri.conf.json +mv /tmp/tauri.conf.json ./src-tauri/tauri.conf.json + +make build-tauri + +cp ./src-tauri/resources/bin/bun ./src-tauri/target/release/bundle/appimage/Jan.AppDir/usr/bin/bun +mkdir -p ./src-tauri/target/release/bundle/appimage/Jan.AppDir/usr/lib/Jan/binaries/engines +cp -f ./src-tauri/binaries/deps/*.so* ./src-tauri/target/release/bundle/appimage/Jan.AppDir/usr/lib/Jan/binaries/ +cp -f ./src-tauri/binaries/*.so* ./src-tauri/target/release/bundle/appimage/Jan.AppDir/usr/lib/Jan/binaries/ +cp -rf ./src-tauri/binaries/engines ./src-tauri/target/release/bundle/appimage/Jan.AppDir/usr/lib/Jan/binaries/ +APP_IMAGE=./src-tauri/target/release/bundle/appimage/$(ls ./src-tauri/target/release/bundle/appimage/ | grep AppImage | head -1) +echo $APP_IMAGE +rm -f $APP_IMAGE +/opt/bin/appimagetool ./src-tauri/target/release/bundle/appimage/Jan.AppDir $APP_IMAGE \ No newline at end of file From 2a143e71e4c904447da0e90da72115726e3b13ce Mon Sep 17 00:00:00 2001 From: LazyYuuki Date: Tue, 1 Jul 2025 10:15:50 +0800 Subject: [PATCH 36/48] =?UTF-8?q?=F0=9F=94=A7=20config:=20github=20templat?= =?UTF-8?q?e?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{bug_report.yml => 1-bug-report.yml} | 0 .../{feature_request.yml => 2-feature-request.yml} | 1 - .github/ISSUE_TEMPLATE/{epic.yml => 3-epic.yml} | 12 +++++------- .github/ISSUE_TEMPLATE/{goal.yml => 4-goal.yml} | 10 ++++------ 4 files changed, 9 insertions(+), 14 deletions(-) rename .github/ISSUE_TEMPLATE/{bug_report.yml => 1-bug-report.yml} (100%) rename .github/ISSUE_TEMPLATE/{feature_request.yml => 2-feature-request.yml} (95%) rename .github/ISSUE_TEMPLATE/{epic.yml => 3-epic.yml} (52%) rename .github/ISSUE_TEMPLATE/{goal.yml => 4-goal.yml} (56%) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/1-bug-report.yml similarity index 100% rename from .github/ISSUE_TEMPLATE/bug_report.yml rename to .github/ISSUE_TEMPLATE/1-bug-report.yml diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/2-feature-request.yml similarity index 95% rename from .github/ISSUE_TEMPLATE/feature_request.yml rename to .github/ISSUE_TEMPLATE/2-feature-request.yml index 6c1c10583..4c1f1decd 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yml +++ b/.github/ISSUE_TEMPLATE/2-feature-request.yml @@ -1,7 +1,6 @@ name: "\U0001F680 Feature Request" title: 'idea: ' description: "Suggest an idea for this project \U0001F63B!" -labels: 'feature request' projects: ["menloresearch/30"] body: - type: textarea diff --git a/.github/ISSUE_TEMPLATE/epic.yml b/.github/ISSUE_TEMPLATE/3-epic.yml similarity index 52% rename from .github/ISSUE_TEMPLATE/epic.yml rename to .github/ISSUE_TEMPLATE/3-epic.yml index 66346c33a..9993db4f8 100644 --- a/.github/ISSUE_TEMPLATE/epic.yml +++ b/.github/ISSUE_TEMPLATE/3-epic.yml @@ -1,6 +1,6 @@ name: "\U0001F31F Epic" -description: "Major building block that push us toward Jan Goal" -title: 'goal: ' +description: "Major building block that advances Jan's goals" +title: 'epic: ' type: "Epic" projects: ["menloresearch/30"] body: @@ -9,16 +9,14 @@ body: required: true attributes: label: "Goal" - description: "Describe the content of the goal" - + description: "Describe the epic's objective and expected impact" - type: textarea validations: required: true attributes: label: "Tasklist" - description: "List of tasks to complete to reach the goal" - + description: "List the key tasks required to complete this epic" - type: textarea attributes: label: "Out of scope" - description: "List of things that is out of scope for this goal" + description: "List items that are explicitly excluded from this epic" diff --git a/.github/ISSUE_TEMPLATE/goal.yml b/.github/ISSUE_TEMPLATE/4-goal.yml similarity index 56% rename from .github/ISSUE_TEMPLATE/goal.yml rename to .github/ISSUE_TEMPLATE/4-goal.yml index d52ea1619..3ed2acf53 100644 --- a/.github/ISSUE_TEMPLATE/goal.yml +++ b/.github/ISSUE_TEMPLATE/4-goal.yml @@ -1,5 +1,5 @@ name: "\U0001F3AF Goal" -description: "Communicate externally the roadmap/goal that Jan is heading toward" +description: "External communication of Jan's roadmap and objectives" title: 'goal: ' type: "Goal" projects: ["menloresearch/30"] @@ -10,16 +10,14 @@ body: required: true attributes: label: "Goal" - description: "Describe the conten of the goal" - + description: "Describe the objective and desired outcome" - type: textarea validations: required: true attributes: label: "Tasklist" - description: "List of task to complete to reach the goal" - + description: "List the specific tasks needed to achieve this goal" - type: textarea attributes: label: "Out of scope" - description: "List of things that is out of scope for this goal" + description: "List items that are explicitly excluded from this goal" From 662879bb5dbef0d4ae662bebbce33a8e4f8561aa Mon Sep 17 00:00:00 2001 From: Faisal Amir Date: Tue, 1 Jul 2025 09:44:32 +0700 Subject: [PATCH 37/48] =?UTF-8?q?=E2=9C=A8enhancement:=20setting=20respons?= =?UTF-8?q?ive=20(#5615)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * ✨feat: setting responsive * 🧹cleanup: feeback PR * 🧹cleanup: unused className * 🧹cleanup: unused props --- web-app/src/constants/routes.ts | 1 + web-app/src/containers/Card.tsx | 58 +++-- web-app/src/containers/ChatWidthSwitcher.tsx | 26 ++- web-app/src/containers/ProvidersMenu.tsx | 152 ------------- web-app/src/containers/SettingsMenu.tsx | 204 +++++++++++++----- web-app/src/routeTree.gen.ts | 28 ++- web-app/src/routes/settings/appearance.tsx | 7 +- web-app/src/routes/settings/general.tsx | 21 +- .../src/routes/settings/local-api-server.tsx | 4 + web-app/src/routes/settings/mcp-servers.tsx | 2 +- .../settings/providers/$providerName.tsx | 22 +- .../src/routes/settings/providers/index.tsx | 187 ++++++++++++++++ 12 files changed, 456 insertions(+), 256 deletions(-) delete mode 100644 web-app/src/containers/ProvidersMenu.tsx create mode 100644 web-app/src/routes/settings/providers/index.tsx diff --git a/web-app/src/constants/routes.ts b/web-app/src/constants/routes.ts index db741e9e6..e9997590a 100644 --- a/web-app/src/constants/routes.ts +++ b/web-app/src/constants/routes.ts @@ -5,6 +5,7 @@ export const route = { assistant: '/assistant', settings: { index: '/settings', + model_providers: '/settings/providers', providers: '/settings/providers/$providerName', general: '/settings/general', appearance: '/settings/appearance', diff --git a/web-app/src/containers/Card.tsx b/web-app/src/containers/Card.tsx index 324b98b2d..7d68550db 100644 --- a/web-app/src/containers/Card.tsx +++ b/web-app/src/containers/Card.tsx @@ -10,43 +10,63 @@ type CardProps = { type CardItemProps = { title?: string | ReactNode description?: string | ReactNode + descriptionOutside?: string | ReactNode align?: 'start' | 'center' | 'end' actions?: ReactNode column?: boolean className?: string + classNameWrapperAction?: string } export function CardItem({ title, description, + descriptionOutside, className, + classNameWrapperAction, align = 'center', column, actions, }: CardItemProps) { return ( -

-
-

{title}

- {description && ( - - {description} - + <> +
+
+

{title}

+ {description && ( + + {description} + + )} +
+ {actions && ( +
+ {actions} +
)}
- {actions && ( -
{actions}
+ {descriptionOutside && ( + + {descriptionOutside} + )} -
+ ) } diff --git a/web-app/src/containers/ChatWidthSwitcher.tsx b/web-app/src/containers/ChatWidthSwitcher.tsx index 27cc3c69d..10417200e 100644 --- a/web-app/src/containers/ChatWidthSwitcher.tsx +++ b/web-app/src/containers/ChatWidthSwitcher.tsx @@ -9,27 +9,31 @@ export function ChatWidthSwitcher() { const { t } = useTranslation() return ( -
+
- - - - - - - -
-
-
- ) -} - -export default ProvidersMenu diff --git a/web-app/src/containers/SettingsMenu.tsx b/web-app/src/containers/SettingsMenu.tsx index 5d5e3ef5b..8aea3b501 100644 --- a/web-app/src/containers/SettingsMenu.tsx +++ b/web-app/src/containers/SettingsMenu.tsx @@ -1,20 +1,56 @@ -import { Link, useMatches } from '@tanstack/react-router' +import { Link } from '@tanstack/react-router' import { route } from '@/constants/routes' import { useTranslation } from '@/i18n/react-i18next-compat' -import { useModelProvider } from '@/hooks/useModelProvider' +import { useState, useEffect } from 'react' +import { + IconChevronDown, + IconChevronRight, + IconMenu2, + IconX, +} from '@tabler/icons-react' +import { useMatches, useNavigate } from '@tanstack/react-router' +import { cn } from '@/lib/utils' + import { useGeneralSetting } from '@/hooks/useGeneralSetting' +import { useModelProvider } from '@/hooks/useModelProvider' +import { getProviderTitle } from '@/lib/utils' +import ProvidersAvatar from '@/containers/ProvidersAvatar' const SettingsMenu = () => { const { t } = useTranslation() - const { providers } = useModelProvider() - const { experimentalFeatures } = useGeneralSetting() - const firstItemProvider = - providers.length > 0 ? providers[0].provider : 'llama.cpp' + const [expandedProviders, setExpandedProviders] = useState(false) + const [isMenuOpen, setIsMenuOpen] = useState(false) const matches = useMatches() - const isActive = matches.some( + const navigate = useNavigate() + + const { experimentalFeatures } = useGeneralSetting() + const { providers } = useModelProvider() + + // Filter providers that have active API keys (or are llama.cpp which doesn't need one) + const activeProviders = providers.filter((provider) => provider.active) + + // Check if current route has a providerName parameter and expand providers submenu + useEffect(() => { + const hasProviderName = matches.some( + (match) => + match.routeId === '/settings/providers/$providerName' && + 'providerName' in match.params + ) + const isProvidersRoute = matches.some( + (match) => match.routeId === '/settings/providers/' + ) + if (hasProviderName || isProvidersRoute) { + setExpandedProviders(true) + } + }, [matches]) + + // Check if we're in the setup remote provider step + const stepSetupRemoteProvider = matches.some( (match) => - match.routeId === '/settings/providers/$providerName' && - 'providerName' in match.params + match.search && + typeof match.search === 'object' && + 'step' in match.search && + match.search.step === 'setup_remote_provider' ) const menuSettings = [ @@ -30,6 +66,11 @@ const SettingsMenu = () => { title: 'common:privacy', route: route.settings.privacy, }, + { + title: 'common:modelProviders', + route: route.settings.model_providers, + hasSubMenu: activeProviders.length > 0, + }, { title: 'common:keyboardShortcuts', route: route.settings.shortcuts, @@ -61,52 +102,113 @@ const SettingsMenu = () => { }, ] + const toggleProvidersExpansion = () => { + setExpandedProviders(!expandedProviders) + } + + const toggleMenu = () => { + setIsMenuOpen(!isMenuOpen) + } + return ( -
-
- {menuSettings.map((menu, index) => { - // Render the menu item - const menuItem = ( - - {t(menu.title)} - - ) + <> + +
+
+ {menuSettings.map((menu) => ( +
+ +
+ {t(menu.title)} + {menu.hasSubMenu && ( + + )} +
+ - if (index === 2) { - return ( -
- {menuItem} + {/* Sub-menu for model providers */} + {menu.hasSubMenu && expandedProviders && ( +
+ {activeProviders.map((provider) => { + const isActive = matches.some( + (match) => + match.routeId === '/settings/providers/$providerName' && + 'providerName' in match.params && + match.params.providerName === provider.provider + ) - {/* Model Providers Link with default parameter */} - {isActive ? ( -
- {t('common:modelProviders')} -
- ) : ( - - - {t('common:modelProviders')} - - - )} -
- ) - } - - // For other menu items, just render them normally - return menuItem - })} + return ( +
+ +
+ ) + })} +
+ )} +
+ ))} +
-
+ ) } diff --git a/web-app/src/routeTree.gen.ts b/web-app/src/routeTree.gen.ts index 52782cb2e..bbd3db391 100644 --- a/web-app/src/routeTree.gen.ts +++ b/web-app/src/routeTree.gen.ts @@ -27,6 +27,7 @@ import { Route as SettingsGeneralImport } from './routes/settings/general' import { Route as SettingsExtensionsImport } from './routes/settings/extensions' import { Route as SettingsAppearanceImport } from './routes/settings/appearance' import { Route as LocalApiServerLogsImport } from './routes/local-api-server/logs' +import { Route as SettingsProvidersIndexImport } from './routes/settings/providers/index' import { Route as SettingsProvidersProviderNameImport } from './routes/settings/providers/$providerName' // Create/Update Routes @@ -127,6 +128,12 @@ const LocalApiServerLogsRoute = LocalApiServerLogsImport.update({ getParentRoute: () => rootRoute, } as any) +const SettingsProvidersIndexRoute = SettingsProvidersIndexImport.update({ + id: '/settings/providers/', + path: '/settings/providers/', + getParentRoute: () => rootRoute, +} as any) + const SettingsProvidersProviderNameRoute = SettingsProvidersProviderNameImport.update({ id: '/settings/providers/$providerName', @@ -257,6 +264,13 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof SettingsProvidersProviderNameImport parentRoute: typeof rootRoute } + '/settings/providers/': { + id: '/settings/providers/' + path: '/settings/providers' + fullPath: '/settings/providers' + preLoaderRoute: typeof SettingsProvidersIndexImport + parentRoute: typeof rootRoute + } } } @@ -280,6 +294,7 @@ export interface FileRoutesByFullPath { '/settings/shortcuts': typeof SettingsShortcutsRoute '/threads/$threadId': typeof ThreadsThreadIdRoute '/settings/providers/$providerName': typeof SettingsProvidersProviderNameRoute + '/settings/providers': typeof SettingsProvidersIndexRoute } export interface FileRoutesByTo { @@ -300,6 +315,7 @@ export interface FileRoutesByTo { '/settings/shortcuts': typeof SettingsShortcutsRoute '/threads/$threadId': typeof ThreadsThreadIdRoute '/settings/providers/$providerName': typeof SettingsProvidersProviderNameRoute + '/settings/providers': typeof SettingsProvidersIndexRoute } export interface FileRoutesById { @@ -321,6 +337,7 @@ export interface FileRoutesById { '/settings/shortcuts': typeof SettingsShortcutsRoute '/threads/$threadId': typeof ThreadsThreadIdRoute '/settings/providers/$providerName': typeof SettingsProvidersProviderNameRoute + '/settings/providers/': typeof SettingsProvidersIndexRoute } export interface FileRouteTypes { @@ -343,6 +360,7 @@ export interface FileRouteTypes { | '/settings/shortcuts' | '/threads/$threadId' | '/settings/providers/$providerName' + | '/settings/providers' fileRoutesByTo: FileRoutesByTo to: | '/' @@ -362,6 +380,7 @@ export interface FileRouteTypes { | '/settings/shortcuts' | '/threads/$threadId' | '/settings/providers/$providerName' + | '/settings/providers' id: | '__root__' | '/' @@ -381,6 +400,7 @@ export interface FileRouteTypes { | '/settings/shortcuts' | '/threads/$threadId' | '/settings/providers/$providerName' + | '/settings/providers/' fileRoutesById: FileRoutesById } @@ -402,6 +422,7 @@ export interface RootRouteChildren { SettingsShortcutsRoute: typeof SettingsShortcutsRoute ThreadsThreadIdRoute: typeof ThreadsThreadIdRoute SettingsProvidersProviderNameRoute: typeof SettingsProvidersProviderNameRoute + SettingsProvidersIndexRoute: typeof SettingsProvidersIndexRoute } const rootRouteChildren: RootRouteChildren = { @@ -422,6 +443,7 @@ const rootRouteChildren: RootRouteChildren = { SettingsShortcutsRoute: SettingsShortcutsRoute, ThreadsThreadIdRoute: ThreadsThreadIdRoute, SettingsProvidersProviderNameRoute: SettingsProvidersProviderNameRoute, + SettingsProvidersIndexRoute: SettingsProvidersIndexRoute, } export const routeTree = rootRoute @@ -450,7 +472,8 @@ export const routeTree = rootRoute "/settings/privacy", "/settings/shortcuts", "/threads/$threadId", - "/settings/providers/$providerName" + "/settings/providers/$providerName", + "/settings/providers/" ] }, "/": { @@ -503,6 +526,9 @@ export const routeTree = rootRoute }, "/settings/providers/$providerName": { "filePath": "settings/providers/$providerName.tsx" + }, + "/settings/providers/": { + "filePath": "settings/providers/index.tsx" } } } diff --git a/web-app/src/routes/settings/appearance.tsx b/web-app/src/routes/settings/appearance.tsx index df0da98fa..3cba3eed5 100644 --- a/web-app/src/routes/settings/appearance.tsx +++ b/web-app/src/routes/settings/appearance.tsx @@ -35,7 +35,7 @@ function Appareances() {

{t('common:settings')}

-
+
@@ -55,26 +55,31 @@ function Appareances() { } /> } /> } /> } /> } />

{t('common:settings')}

-
+
@@ -222,6 +222,7 @@ function General() { @@ -273,13 +275,15 @@ function General() { })}   -
- - {janDataFolder} - +
+
+ + {janDataFolder} + +

} - description={ + descriptionOutside={
{t('mcp-servers:command')}: {config.command} diff --git a/web-app/src/routes/settings/providers/$providerName.tsx b/web-app/src/routes/settings/providers/$providerName.tsx index 60254cf65..d15260908 100644 --- a/web-app/src/routes/settings/providers/$providerName.tsx +++ b/web-app/src/routes/settings/providers/$providerName.tsx @@ -1,9 +1,8 @@ import { Card, CardItem } from '@/containers/Card' import HeaderPage from '@/containers/HeaderPage' -import ProvidersMenu from '@/containers/ProvidersMenu' +import SettingsMenu from '@/containers/SettingsMenu' import { useModelProvider } from '@/hooks/useModelProvider' import { cn, getProviderTitle } from '@/lib/utils' -import { Switch } from '@/components/ui/switch' import { open } from '@tauri-apps/plugin-dialog' import { getActiveModels, @@ -228,23 +227,13 @@ function ProviderDetail() {

{t('common:settings')}

-
- -
+

{getProviderTitle(providerName)}

- { - if (provider) { - updateProvider(providerName, { ...provider, active: e }) - } - }} - />
-

{model.id}

+

+ {model.id} +

} diff --git a/web-app/src/routes/settings/providers/index.tsx b/web-app/src/routes/settings/providers/index.tsx new file mode 100644 index 000000000..94c01865b --- /dev/null +++ b/web-app/src/routes/settings/providers/index.tsx @@ -0,0 +1,187 @@ +import { createFileRoute } from '@tanstack/react-router' +import { route } from '@/constants/routes' +import SettingsMenu from '@/containers/SettingsMenu' +import HeaderPage from '@/containers/HeaderPage' +import { Button } from '@/components/ui/button' +import { Card, CardItem } from '@/containers/Card' +import { useTranslation } from '@/i18n/react-i18next-compat' +import { useModelProvider } from '@/hooks/useModelProvider' +import { useNavigate } from '@tanstack/react-router' +import { IconCirclePlus, IconSettings } from '@tabler/icons-react' +import { getProviderTitle } from '@/lib/utils' +import ProvidersAvatar from '@/containers/ProvidersAvatar' +import { + Dialog, + DialogClose, + DialogContent, + DialogFooter, + DialogHeader, + DialogTitle, + DialogTrigger, +} from '@/components/ui/dialog' +import { Input } from '@/components/ui/input' +import { Switch } from '@/components/ui/switch' +import { useCallback, useState } from 'react' +import { openAIProviderSettings } from '@/mock/data' +import cloneDeep from 'lodash/cloneDeep' +import { toast } from 'sonner' + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export const Route = createFileRoute(route.settings.model_providers as any)({ + component: ModelProviders, +}) + +function ModelProviders() { + const { t } = useTranslation() + const { providers, addProvider, updateProvider } = useModelProvider() + const navigate = useNavigate() + const [name, setName] = useState('') + + const createProvider = useCallback(() => { + if (providers.some((e) => e.provider === name)) { + toast.error(t('providerAlreadyExists', { name })) + return + } + const newProvider = { + provider: name, + active: true, + models: [], + settings: cloneDeep(openAIProviderSettings) as ProviderSetting[], + api_key: '', + base_url: 'https://api.openai.com/v1', + } + addProvider(newProvider) + setTimeout(() => { + navigate({ + to: route.settings.providers, + params: { + providerName: name, + }, + }) + }, 0) + }, [providers, name, addProvider, t, navigate]) + + return ( +
+ +

{t('common:settings')}

+
+
+ +
+
+ {/* Model Providers */} + + + {t('common:modelProviders')} + + + + + + + + + {t('provider:addOpenAIProvider')} + + setName(e.target.value)} + className="mt-2" + placeholder={t('provider:enterNameForProvider')} + onKeyDown={(e) => { + // Prevent key from being captured by parent components + e.stopPropagation() + }} + /> + + + + + + + + + + + +
+ } + > + {providers.map((provider, index) => ( + + +
+

+ {getProviderTitle(provider.provider)} +

+

+ {provider.models.length} Models +

+
+
+ } + actions={ +
+ {provider.active && ( + + )} + { + updateProvider(provider.provider, { + ...provider, + active: e, + }) + }} + /> +
+ } + /> + ))} + +
+
+
+
+ ) +} From 9ba199503045bfacba112c2a47a078f6b093779b Mon Sep 17 00:00:00 2001 From: Daniel Ching Date: Tue, 1 Jul 2025 11:52:19 +0800 Subject: [PATCH 38/48] Updated Jan description --- docs/src/pages/docs/data-folder.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/src/pages/docs/data-folder.mdx b/docs/src/pages/docs/data-folder.mdx index f073152b3..4c582c801 100644 --- a/docs/src/pages/docs/data-folder.mdx +++ b/docs/src/pages/docs/data-folder.mdx @@ -99,7 +99,7 @@ Where AI personalities live. The default one (`/assistants/jan/`): "object": "assistant", "created_at": 1750945742.536, "name": "Jan", - "description": "Jan is a helpful desktop assistant that can reason through complex tasks and use tools to complete them on the user’s behalf.", + "description": "Jan is a helpful AI assistant that can use tools and help complete tasks for its users.", "model": "*", "instructions": "You have access to a set of tools to help you answer the user’s question. You can use only one tool per message, and you’ll receive the result of that tool in the user’s next response. To complete a task, use tools step by step—each step should be guided by the outcome of the previous one.\nTool Usage Rules:\n1. Always provide the correct values as arguments when using tools. Do not pass variable names—use actual values instead.\n2. You may perform multiple tool steps to complete a task.\n3. Avoid repeating a tool call with exactly the same parameters to prevent infinite loops.", "tools": [ From 1e8c9956cd7d493a09fb467410791cecb59a79b8 Mon Sep 17 00:00:00 2001 From: Louis Date: Fri, 27 Jun 2025 11:39:59 +0700 Subject: [PATCH 39/48] Merge pull request #5568 from menloresearch/fix/min_p-validation-on-model-load fix: min p validation on model load --- core/src/browser/models/manager.test.ts | 133 +++++++++++++++++++++ core/src/browser/models/utils.test.ts | 152 ++++++++++++++++++++++-- core/src/browser/models/utils.ts | 3 +- 3 files changed, 278 insertions(+), 10 deletions(-) create mode 100644 core/src/browser/models/manager.test.ts diff --git a/core/src/browser/models/manager.test.ts b/core/src/browser/models/manager.test.ts new file mode 100644 index 000000000..189ca1209 --- /dev/null +++ b/core/src/browser/models/manager.test.ts @@ -0,0 +1,133 @@ +import { ModelManager } from './manager' +import { Model, ModelEvent } from '../../types' +import { events } from '../events' + +jest.mock('../events', () => ({ + events: { + emit: jest.fn(), + }, +})) + +Object.defineProperty(global, 'window', { + value: { + core: {}, + }, + writable: true, +}) + +describe('ModelManager', () => { + let modelManager: ModelManager + let mockModel: Model + + beforeEach(() => { + jest.clearAllMocks() + ;(global.window as any).core = {} + modelManager = new ModelManager() + mockModel = { + id: 'test-model-1', + name: 'Test Model', + version: '1.0.0', + } as Model + }) + + describe('constructor', () => { + it('should set itself on window.core.modelManager when window exists', () => { + expect((global.window as any).core.modelManager).toBe(modelManager) + }) + }) + + describe('register', () => { + it('should register a new model', () => { + modelManager.register(mockModel) + + expect(modelManager.models.has('test-model-1')).toBe(true) + expect(modelManager.models.get('test-model-1')).toEqual(mockModel) + expect(events.emit).toHaveBeenCalledWith(ModelEvent.OnModelsUpdate, {}) + }) + + it('should merge existing model with new model data', () => { + const existingModel: Model = { + id: 'test-model-1', + name: 'Existing Model', + description: 'Existing description', + } as Model + + const updatedModel: Model = { + id: 'test-model-1', + name: 'Updated Model', + version: '2.0.0', + } as Model + + modelManager.register(existingModel) + modelManager.register(updatedModel) + + const registeredModel = modelManager.models.get('test-model-1') + expect(registeredModel).toEqual({ + id: 'test-model-1', + name: 'Existing Model', + description: 'Existing description', + version: '2.0.0', + }) + expect(events.emit).toHaveBeenCalledTimes(2) + }) + }) + + describe('get', () => { + it('should retrieve a registered model by id', () => { + modelManager.register(mockModel) + + const retrievedModel = modelManager.get('test-model-1') + expect(retrievedModel).toEqual(mockModel) + }) + + it('should return undefined for non-existent model', () => { + const retrievedModel = modelManager.get('non-existent-model') + expect(retrievedModel).toBeUndefined() + }) + + it('should return correctly typed model', () => { + modelManager.register(mockModel) + + const retrievedModel = modelManager.get('test-model-1') + expect(retrievedModel?.id).toBe('test-model-1') + expect(retrievedModel?.name).toBe('Test Model') + }) + }) + + describe('instance', () => { + it('should create a new instance when none exists on window.core', () => { + ;(global.window as any).core = {} + + const instance = ModelManager.instance() + expect(instance).toBeInstanceOf(ModelManager) + expect((global.window as any).core.modelManager).toBe(instance) + }) + + it('should return existing instance when it exists on window.core', () => { + const existingManager = new ModelManager() + ;(global.window as any).core.modelManager = existingManager + + const instance = ModelManager.instance() + expect(instance).toBe(existingManager) + }) + }) + + describe('models property', () => { + it('should initialize with empty Map', () => { + expect(modelManager.models).toBeInstanceOf(Map) + expect(modelManager.models.size).toBe(0) + }) + + it('should maintain multiple models', () => { + const model1: Model = { id: 'model-1', name: 'Model 1' } as Model + const model2: Model = { id: 'model-2', name: 'Model 2' } as Model + + modelManager.register(model1) + modelManager.register(model2) + + expect(modelManager.models.size).toBe(2) + expect(modelManager.models.get('model-1')).toEqual(model1) + expect(modelManager.models.get('model-2')).toEqual(model2) + }) + }) +}) \ No newline at end of file diff --git a/core/src/browser/models/utils.test.ts b/core/src/browser/models/utils.test.ts index ac876c3dc..313ad0969 100644 --- a/core/src/browser/models/utils.test.ts +++ b/core/src/browser/models/utils.test.ts @@ -152,6 +152,33 @@ describe('validationRules', () => { expect(validationRules.text_model('true')).toBe(false) expect(validationRules.text_model(1)).toBe(false) }) + + it('should validate repeat_last_n correctly', () => { + expect(validationRules.repeat_last_n(5)).toBe(true) + expect(validationRules.repeat_last_n(-5)).toBe(true) + expect(validationRules.repeat_last_n(0)).toBe(true) + expect(validationRules.repeat_last_n(1.5)).toBe(true) + expect(validationRules.repeat_last_n('5')).toBe(false) + expect(validationRules.repeat_last_n(null)).toBe(false) + }) + + it('should validate repeat_penalty correctly', () => { + expect(validationRules.repeat_penalty(1.1)).toBe(true) + expect(validationRules.repeat_penalty(0.9)).toBe(true) + expect(validationRules.repeat_penalty(0)).toBe(true) + expect(validationRules.repeat_penalty(-1)).toBe(true) + expect(validationRules.repeat_penalty('1.1')).toBe(false) + expect(validationRules.repeat_penalty(null)).toBe(false) + }) + + it('should validate min_p correctly', () => { + expect(validationRules.min_p(0.1)).toBe(true) + expect(validationRules.min_p(0)).toBe(true) + expect(validationRules.min_p(-0.1)).toBe(true) + expect(validationRules.min_p(1.5)).toBe(true) + expect(validationRules.min_p('0.1')).toBe(false) + expect(validationRules.min_p(null)).toBe(false) + }) }) it('should normalize invalid values for keys not listed in validationRules', () => { @@ -192,18 +219,125 @@ describe('normalizeValue', () => { expect(normalizeValue('cpu_threads', '4')).toBe(4) expect(normalizeValue('cpu_threads', 0)).toBe(0) }) + + it('should handle edge cases for normalization', () => { + expect(normalizeValue('ctx_len', -5.7)).toBe(-6) + expect(normalizeValue('token_limit', 'abc')).toBeNaN() + expect(normalizeValue('max_tokens', null)).toBe(0) + expect(normalizeValue('ngl', undefined)).toBeNaN() + expect(normalizeValue('n_parallel', Infinity)).toBe(Infinity) + expect(normalizeValue('cpu_threads', -Infinity)).toBe(-Infinity) + }) + + it('should not normalize non-integer parameters', () => { + expect(normalizeValue('temperature', 1.5)).toBe(1.5) + expect(normalizeValue('top_p', 0.9)).toBe(0.9) + expect(normalizeValue('stream', true)).toBe(true) + expect(normalizeValue('prompt_template', 'template')).toBe('template') + }) }) -it('should handle invalid values correctly by falling back to originParams', () => { - const modelParams = { temperature: 'invalid', token_limit: -1 } - const originParams = { temperature: 0.5, token_limit: 100 } - expect(extractInferenceParams(modelParams as any, originParams)).toEqual(originParams) +describe('extractInferenceParams', () => { + it('should handle invalid values correctly by falling back to originParams', () => { + const modelParams = { temperature: 'invalid', token_limit: -1 } + const originParams = { temperature: 0.5, token_limit: 100 } + expect(extractInferenceParams(modelParams as any, originParams)).toEqual(originParams) + }) + + it('should return an empty object when no modelParams are provided', () => { + expect(extractInferenceParams()).toEqual({}) + }) + + it('should extract and normalize valid inference parameters', () => { + const modelParams = { + temperature: 1.5, + token_limit: 100.7, + top_p: 0.9, + stream: true, + max_tokens: 50.3, + invalid_param: 'should_be_ignored' + } + + const result = extractInferenceParams(modelParams as any) + expect(result).toEqual({ + temperature: 1.5, + token_limit: 100, + top_p: 0.9, + stream: true, + max_tokens: 50 + }) + }) + + it('should handle parameters without validation rules', () => { + const modelParams = { engine: 'llama' } + const result = extractInferenceParams(modelParams as any) + expect(result).toEqual({ engine: 'llama' }) + }) + + it('should skip invalid values when no origin params provided', () => { + const modelParams = { temperature: 'invalid', top_p: 0.8 } + const result = extractInferenceParams(modelParams as any) + expect(result).toEqual({ top_p: 0.8 }) + }) }) -it('should return an empty object when no modelParams are provided', () => { - expect(extractModelLoadParams()).toEqual({}) -}) +describe('extractModelLoadParams', () => { + it('should return an empty object when no modelParams are provided', () => { + expect(extractModelLoadParams()).toEqual({}) + }) -it('should return an empty object when no modelParams are provided', () => { - expect(extractInferenceParams()).toEqual({}) + it('should extract and normalize valid model load parameters', () => { + const modelParams = { + ctx_len: 2048.5, + ngl: 12.7, + embedding: true, + n_parallel: 4.2, + cpu_threads: 8.9, + prompt_template: 'template', + llama_model_path: '/path/to/model', + vision_model: false, + invalid_param: 'should_be_ignored' + } + + const result = extractModelLoadParams(modelParams as any) + expect(result).toEqual({ + ctx_len: 2048, + ngl: 12, + embedding: true, + n_parallel: 4, + cpu_threads: 8, + prompt_template: 'template', + llama_model_path: '/path/to/model', + vision_model: false + }) + }) + + it('should handle parameters without validation rules', () => { + const modelParams = { + engine: 'llama', + pre_prompt: 'System:', + system_prompt: 'You are helpful', + model_path: '/path' + } + const result = extractModelLoadParams(modelParams as any) + expect(result).toEqual({ + engine: 'llama', + pre_prompt: 'System:', + system_prompt: 'You are helpful', + model_path: '/path' + }) + }) + + it('should fall back to origin params for invalid values', () => { + const modelParams = { ctx_len: -1, ngl: 'invalid' } + const originParams = { ctx_len: 2048, ngl: 12 } + const result = extractModelLoadParams(modelParams as any, originParams) + expect(result).toEqual({}) + }) + + it('should skip invalid values when no origin params provided', () => { + const modelParams = { ctx_len: -1, embedding: true } + const result = extractModelLoadParams(modelParams as any) + expect(result).toEqual({ embedding: true }) + }) }) diff --git a/core/src/browser/models/utils.ts b/core/src/browser/models/utils.ts index 192b838da..d3fe0cb01 100644 --- a/core/src/browser/models/utils.ts +++ b/core/src/browser/models/utils.ts @@ -17,9 +17,10 @@ export const validationRules: { [key: string]: (value: any) => boolean } = { presence_penalty: (value: any) => typeof value === 'number' && value >= 0 && value <= 1, repeat_last_n: (value: any) => typeof value === 'number', repeat_penalty: (value: any) => typeof value === 'number', + min_p: (value: any) => typeof value === 'number', ctx_len: (value: any) => Number.isInteger(value) && value >= 0, - ngl: (value: any) => Number.isInteger(value), + ngl: (value: any) => Number.isInteger(value) && value >= 0, embedding: (value: any) => typeof value === 'boolean', n_parallel: (value: any) => Number.isInteger(value) && value >= 0, cpu_threads: (value: any) => Number.isInteger(value) && value >= 0, From 7b22ba8c5406712035d37cfa6a0d200f749d4341 Mon Sep 17 00:00:00 2001 From: Louis Date: Tue, 1 Jul 2025 13:17:32 +0700 Subject: [PATCH 40/48] fix: some of the model settings are not applied --- core/src/browser/models/utils.ts | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/core/src/browser/models/utils.ts b/core/src/browser/models/utils.ts index d3fe0cb01..6f8e106c4 100644 --- a/core/src/browser/models/utils.ts +++ b/core/src/browser/models/utils.ts @@ -50,6 +50,22 @@ export const normalizeValue = (key: string, value: any) => { // Convert to integer return Math.floor(Number(value)) } + if ( + key === 'temperature' || + key === 'top_k' || + key === 'top_p' || + key === 'min_p' || + key === 'repeat_penalty' || + key === 'frequency_penalty' || + key === 'presence_penalty' || + key === 'repeat_last_n' + ) { + // Convert to float + const newValue = parseFloat(value) + if (newValue && !isNaN(newValue)) { + return newValue + } + } return value } From db74f2cf3f8eb7734e049dc7ea1a52de508da1c4 Mon Sep 17 00:00:00 2001 From: Louis Date: Tue, 1 Jul 2025 13:28:30 +0700 Subject: [PATCH 41/48] fix: check newValue not null --- core/src/browser/models/utils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/browser/models/utils.ts b/core/src/browser/models/utils.ts index 6f8e106c4..cb1baacd7 100644 --- a/core/src/browser/models/utils.ts +++ b/core/src/browser/models/utils.ts @@ -62,7 +62,7 @@ export const normalizeValue = (key: string, value: any) => { ) { // Convert to float const newValue = parseFloat(value) - if (newValue && !isNaN(newValue)) { + if (newValue !== null && !isNaN(newValue)) { return newValue } } From f1e28c2ab5f877e5628da026aae5f4f3f95f552a Mon Sep 17 00:00:00 2001 From: Bui Quang Huy <34532913+LazyYuuki@users.noreply.github.com> Date: Tue, 1 Jul 2025 15:03:12 +0800 Subject: [PATCH 42/48] Update config.yml --- .github/ISSUE_TEMPLATE/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 550b73916..057cb8148 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,4 +1,4 @@ -blank_issues_enabled: false +blank_issues_enabled: true contact_links: - name: Jan Discussions url: https://github.com/orgs/menloresearch/discussions/categories/q-a From 0b88d93e18a81badc246f67599e54f5883403390 Mon Sep 17 00:00:00 2001 From: Louis Date: Tue, 1 Jul 2025 16:40:22 +0700 Subject: [PATCH 43/48] fix: top_k validation --- core/src/browser/models/utils.test.ts | 28 +++++++++++++-------------- core/src/browser/models/utils.ts | 6 +++--- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/core/src/browser/models/utils.test.ts b/core/src/browser/models/utils.test.ts index 313ad0969..c5dff7868 100644 --- a/core/src/browser/models/utils.test.ts +++ b/core/src/browser/models/utils.test.ts @@ -29,7 +29,7 @@ describe('validationRules', () => { expect(validationRules.top_k(1)).toBe(true) expect(validationRules.top_k(0)).toBe(true) expect(validationRules.top_k(-0.1)).toBe(false) - expect(validationRules.top_k(1.1)).toBe(false) + expect(validationRules.top_k(1.1)).toBe(true) expect(validationRules.top_k('0.5')).toBe(false) }) @@ -68,8 +68,8 @@ describe('validationRules', () => { expect(validationRules.frequency_penalty(0.5)).toBe(true) expect(validationRules.frequency_penalty(1)).toBe(true) expect(validationRules.frequency_penalty(0)).toBe(true) - expect(validationRules.frequency_penalty(-0.1)).toBe(false) - expect(validationRules.frequency_penalty(1.1)).toBe(false) + expect(validationRules.frequency_penalty(-0.1)).toBe(true) + expect(validationRules.frequency_penalty(1.1)).toBe(true) expect(validationRules.frequency_penalty('0.5')).toBe(false) }) @@ -77,8 +77,8 @@ describe('validationRules', () => { expect(validationRules.presence_penalty(0.5)).toBe(true) expect(validationRules.presence_penalty(1)).toBe(true) expect(validationRules.presence_penalty(0)).toBe(true) - expect(validationRules.presence_penalty(-0.1)).toBe(false) - expect(validationRules.presence_penalty(1.1)).toBe(false) + expect(validationRules.presence_penalty(-0.1)).toBe(true) + expect(validationRules.presence_penalty(1.1)).toBe(true) expect(validationRules.presence_penalty('0.5')).toBe(false) }) @@ -255,16 +255,16 @@ describe('extractInferenceParams', () => { top_p: 0.9, stream: true, max_tokens: 50.3, - invalid_param: 'should_be_ignored' + invalid_param: 'should_be_ignored', } - + const result = extractInferenceParams(modelParams as any) expect(result).toEqual({ temperature: 1.5, token_limit: 100, top_p: 0.9, stream: true, - max_tokens: 50 + max_tokens: 50, }) }) @@ -296,9 +296,9 @@ describe('extractModelLoadParams', () => { prompt_template: 'template', llama_model_path: '/path/to/model', vision_model: false, - invalid_param: 'should_be_ignored' + invalid_param: 'should_be_ignored', } - + const result = extractModelLoadParams(modelParams as any) expect(result).toEqual({ ctx_len: 2048, @@ -308,23 +308,23 @@ describe('extractModelLoadParams', () => { cpu_threads: 8, prompt_template: 'template', llama_model_path: '/path/to/model', - vision_model: false + vision_model: false, }) }) it('should handle parameters without validation rules', () => { - const modelParams = { + const modelParams = { engine: 'llama', pre_prompt: 'System:', system_prompt: 'You are helpful', - model_path: '/path' + model_path: '/path', } const result = extractModelLoadParams(modelParams as any) expect(result).toEqual({ engine: 'llama', pre_prompt: 'System:', system_prompt: 'You are helpful', - model_path: '/path' + model_path: '/path', }) }) diff --git a/core/src/browser/models/utils.ts b/core/src/browser/models/utils.ts index cb1baacd7..c11bed4c7 100644 --- a/core/src/browser/models/utils.ts +++ b/core/src/browser/models/utils.ts @@ -8,13 +8,13 @@ import { ModelParams, ModelRuntimeParams, ModelSettingParams } from '../../types export const validationRules: { [key: string]: (value: any) => boolean } = { temperature: (value: any) => typeof value === 'number' && value >= 0 && value <= 2, token_limit: (value: any) => Number.isInteger(value) && value >= 0, - top_k: (value: any) => typeof value === 'number' && value >= 0 && value <= 1, + top_k: (value: any) => typeof value === 'number' && value >= 0, top_p: (value: any) => typeof value === 'number' && value >= 0 && value <= 1, stream: (value: any) => typeof value === 'boolean', max_tokens: (value: any) => Number.isInteger(value) && value >= 0, stop: (value: any) => Array.isArray(value) && value.every((v) => typeof v === 'string'), - frequency_penalty: (value: any) => typeof value === 'number' && value >= 0 && value <= 1, - presence_penalty: (value: any) => typeof value === 'number' && value >= 0 && value <= 1, + frequency_penalty: (value: any) => typeof value === 'number' && value >= -2 && value <= 2, + presence_penalty: (value: any) => typeof value === 'number' && value >= -2 && value <= 2, repeat_last_n: (value: any) => typeof value === 'number', repeat_penalty: (value: any) => typeof value === 'number', min_p: (value: any) => typeof value === 'number', From 8e837fc73d2f92144b4ddb233944f7e1334bd2cf Mon Sep 17 00:00:00 2001 From: LazyYuuki Date: Tue, 1 Jul 2025 23:25:08 +0800 Subject: [PATCH 44/48] =?UTF-8?q?=F0=9F=94=A7=20config:=20from=20yml=20to?= =?UTF-8?q?=20md=20for=20template?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/ISSUE_TEMPLATE/1-bug-report.md | 31 ++++++++++++++++++ .github/ISSUE_TEMPLATE/1-bug-report.yml | 43 ------------------------- 2 files changed, 31 insertions(+), 43 deletions(-) create mode 100644 .github/ISSUE_TEMPLATE/1-bug-report.md delete mode 100644 .github/ISSUE_TEMPLATE/1-bug-report.yml diff --git a/.github/ISSUE_TEMPLATE/1-bug-report.md b/.github/ISSUE_TEMPLATE/1-bug-report.md new file mode 100644 index 000000000..61892fb9d --- /dev/null +++ b/.github/ISSUE_TEMPLATE/1-bug-report.md @@ -0,0 +1,31 @@ +--- +name: 🐛 Bug Report +about: If something isn't working as expected 🤔 +title: 'bug: ' +type: Bug +projects: ["menloresearch/30"] +--- + +## Jan Version + +**Version:** e.g. 0.5.x-xxx + +## Describe the Bug + + + +## Steps to Reproduce + +1. Go to '...' +2. Click on '...' +3. + +## Screenshots / Logs + + + +## Operating System + +- [ ] MacOS +- [ ] Windows +- [ ] Linux diff --git a/.github/ISSUE_TEMPLATE/1-bug-report.yml b/.github/ISSUE_TEMPLATE/1-bug-report.yml deleted file mode 100644 index b429b670a..000000000 --- a/.github/ISSUE_TEMPLATE/1-bug-report.yml +++ /dev/null @@ -1,43 +0,0 @@ -name: "\U0001F41B Bug Report" -title: 'bug: ' -description: "If something isn't working as expected \U0001F914" -type: "Bug" -projects: ["menloresearch/30"] -body: - - type: input - validations: - required: true - attributes: - label: "Jan version" - description: "**Tip:** The version is in the app's bottom right corner" - placeholder: "e.g. 0.5.x-xxx" - - - type: textarea - validations: - required: true - attributes: - label: "Describe the Bug" - description: "A clear & concise description of the bug" - - - type: textarea - attributes: - label: "Steps to Reproduce" - description: | - Please list out steps to reproduce the issue - placeholder: | - 1. Go to '...' - 2. Click on '...' - - - type: textarea - attributes: - label: "Screenshots / Logs" - description: | - You can find logs in: ~/jan/logs/app.logs - - - type: checkboxes - attributes: - label: "What is your OS?" - options: - - label: MacOS - - label: Windows - - label: Linux From 5dc9073108185fdb2a54a3fba24443e79e7dae79 Mon Sep 17 00:00:00 2001 From: LazyYuuki Date: Tue, 1 Jul 2025 23:33:30 +0800 Subject: [PATCH 45/48] =?UTF-8?q?=F0=9F=94=A7=20config:=20fix=20bug=20temp?= =?UTF-8?q?late?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/ISSUE_TEMPLATE/1-bug-report.md | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/1-bug-report.md b/.github/ISSUE_TEMPLATE/1-bug-report.md index 61892fb9d..041dcc81f 100644 --- a/.github/ISSUE_TEMPLATE/1-bug-report.md +++ b/.github/ISSUE_TEMPLATE/1-bug-report.md @@ -3,11 +3,9 @@ name: 🐛 Bug Report about: If something isn't working as expected 🤔 title: 'bug: ' type: Bug -projects: ["menloresearch/30"] +projects: menloresearch/30 --- -## Jan Version - **Version:** e.g. 0.5.x-xxx ## Describe the Bug @@ -15,17 +13,13 @@ projects: ["menloresearch/30"] ## Steps to Reproduce - -1. Go to '...' -2. Click on '...' -3. +1. ## Screenshots / Logs - + ## Operating System - - [ ] MacOS - [ ] Windows - [ ] Linux From a8a1de9ad0ff73b18c54c90e18ddd8ce17836cd0 Mon Sep 17 00:00:00 2001 From: LazyYuuki Date: Tue, 1 Jul 2025 23:45:44 +0800 Subject: [PATCH 46/48] =?UTF-8?q?=F0=9F=94=A7=20config:=20all=20yml=20to?= =?UTF-8?q?=20md=20for=20issue=20template?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/ISSUE_TEMPLATE/1-bug-report.md | 1 - .github/ISSUE_TEMPLATE/2-feature-request.md | 11 ++++++++++ .github/ISSUE_TEMPLATE/2-feature-request.yml | 20 ----------------- .github/ISSUE_TEMPLATE/3-epic.md | 12 ++++++++++ .github/ISSUE_TEMPLATE/3-epic.yml | 22 ------------------- .github/ISSUE_TEMPLATE/4-goal.md | 13 +++++++++++ .github/ISSUE_TEMPLATE/4-goal.yml | 23 -------------------- 7 files changed, 36 insertions(+), 66 deletions(-) create mode 100644 .github/ISSUE_TEMPLATE/2-feature-request.md delete mode 100644 .github/ISSUE_TEMPLATE/2-feature-request.yml create mode 100644 .github/ISSUE_TEMPLATE/3-epic.md delete mode 100644 .github/ISSUE_TEMPLATE/3-epic.yml create mode 100644 .github/ISSUE_TEMPLATE/4-goal.md delete mode 100644 .github/ISSUE_TEMPLATE/4-goal.yml diff --git a/.github/ISSUE_TEMPLATE/1-bug-report.md b/.github/ISSUE_TEMPLATE/1-bug-report.md index 041dcc81f..495adb305 100644 --- a/.github/ISSUE_TEMPLATE/1-bug-report.md +++ b/.github/ISSUE_TEMPLATE/1-bug-report.md @@ -3,7 +3,6 @@ name: 🐛 Bug Report about: If something isn't working as expected 🤔 title: 'bug: ' type: Bug -projects: menloresearch/30 --- **Version:** e.g. 0.5.x-xxx diff --git a/.github/ISSUE_TEMPLATE/2-feature-request.md b/.github/ISSUE_TEMPLATE/2-feature-request.md new file mode 100644 index 000000000..3a6c97232 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/2-feature-request.md @@ -0,0 +1,11 @@ +--- +name: 🚀 Feature Request +about: Suggest an idea for this project 😻! +title: 'idea: ' +--- + +## Problem Statement + + +## Feature Idea + diff --git a/.github/ISSUE_TEMPLATE/2-feature-request.yml b/.github/ISSUE_TEMPLATE/2-feature-request.yml deleted file mode 100644 index 4c1f1decd..000000000 --- a/.github/ISSUE_TEMPLATE/2-feature-request.yml +++ /dev/null @@ -1,20 +0,0 @@ -name: "\U0001F680 Feature Request" -title: 'idea: ' -description: "Suggest an idea for this project \U0001F63B!" -projects: ["menloresearch/30"] -body: - - type: textarea - validations: - required: true - attributes: - label: "Problem Statement" - description: "Describe the problem you're facing" - placeholder: | - I'm always frustrated when ... - - - type: textarea - validations: - required: true - attributes: - label: "Feature Idea" - description: "Describe what you want instead. Examples are welcome!" diff --git a/.github/ISSUE_TEMPLATE/3-epic.md b/.github/ISSUE_TEMPLATE/3-epic.md new file mode 100644 index 000000000..afffc6b5c --- /dev/null +++ b/.github/ISSUE_TEMPLATE/3-epic.md @@ -0,0 +1,12 @@ +--- +name: 🌟 Epic +about: Major building block that advances Jan's goals +title: 'epic: ' +type: Epic +--- + +## Goal + +## Tasklist + +## Out of scope diff --git a/.github/ISSUE_TEMPLATE/3-epic.yml b/.github/ISSUE_TEMPLATE/3-epic.yml deleted file mode 100644 index 9993db4f8..000000000 --- a/.github/ISSUE_TEMPLATE/3-epic.yml +++ /dev/null @@ -1,22 +0,0 @@ -name: "\U0001F31F Epic" -description: "Major building block that advances Jan's goals" -title: 'epic: ' -type: "Epic" -projects: ["menloresearch/30"] -body: - - type: textarea - validations: - required: true - attributes: - label: "Goal" - description: "Describe the epic's objective and expected impact" - - type: textarea - validations: - required: true - attributes: - label: "Tasklist" - description: "List the key tasks required to complete this epic" - - type: textarea - attributes: - label: "Out of scope" - description: "List items that are explicitly excluded from this epic" diff --git a/.github/ISSUE_TEMPLATE/4-goal.md b/.github/ISSUE_TEMPLATE/4-goal.md new file mode 100644 index 000000000..28b32382a --- /dev/null +++ b/.github/ISSUE_TEMPLATE/4-goal.md @@ -0,0 +1,13 @@ +--- +name: 🎯 Goal +about: External communication of Jan's roadmap and objectives +title: 'goal: ' +type: Goal +--- + +## Goal + +## Tasklist + +## Out of scope + diff --git a/.github/ISSUE_TEMPLATE/4-goal.yml b/.github/ISSUE_TEMPLATE/4-goal.yml deleted file mode 100644 index 3ed2acf53..000000000 --- a/.github/ISSUE_TEMPLATE/4-goal.yml +++ /dev/null @@ -1,23 +0,0 @@ -name: "\U0001F3AF Goal" -description: "External communication of Jan's roadmap and objectives" -title: 'goal: ' -type: "Goal" -projects: ["menloresearch/30"] -assignees: freelerobot -body: - - type: textarea - validations: - required: true - attributes: - label: "Goal" - description: "Describe the objective and desired outcome" - - type: textarea - validations: - required: true - attributes: - label: "Tasklist" - description: "List the specific tasks needed to achieve this goal" - - type: textarea - attributes: - label: "Out of scope" - description: "List items that are explicitly excluded from this goal" From 264895cd598ef3c3313f8ac35d9ae1d582c82d43 Mon Sep 17 00:00:00 2001 From: Bui Quang Huy <34532913+LazyYuuki@users.noreply.github.com> Date: Wed, 2 Jul 2025 18:59:07 +0800 Subject: [PATCH 47/48] Update 2-feature-request.md --- .github/ISSUE_TEMPLATE/2-feature-request.md | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/ISSUE_TEMPLATE/2-feature-request.md b/.github/ISSUE_TEMPLATE/2-feature-request.md index 3a6c97232..4da9e8450 100644 --- a/.github/ISSUE_TEMPLATE/2-feature-request.md +++ b/.github/ISSUE_TEMPLATE/2-feature-request.md @@ -2,6 +2,7 @@ name: 🚀 Feature Request about: Suggest an idea for this project 😻! title: 'idea: ' +type: Idea --- ## Problem Statement From f572350c20eab1f6126c96cbdc9829dcff4c3ae5 Mon Sep 17 00:00:00 2001 From: hiento09 <136591877+hiento09@users.noreply.github.com> Date: Thu, 3 Jul 2025 00:05:52 +0700 Subject: [PATCH 48/48] chore: migrate to selfhosted runner (#5593) --- .../workflows/jan-electron-build-nightly.yml | 215 --------- .github/workflows/jan-electron-build.yml | 131 ------ .../jan-electron-linter-and-test.yml | 435 ------------------ .github/workflows/jan-linter-and-test.yml | 272 +++++++++++ .../template-electron-build-linux-x64.yml | 186 -------- .../template-electron-build-macos.yml | 233 ---------- .../template-electron-build-windows-x64.yml | 230 --------- 7 files changed, 272 insertions(+), 1430 deletions(-) delete mode 100644 .github/workflows/jan-electron-build-nightly.yml delete mode 100644 .github/workflows/jan-electron-build.yml delete mode 100644 .github/workflows/jan-electron-linter-and-test.yml create mode 100644 .github/workflows/jan-linter-and-test.yml delete mode 100644 .github/workflows/template-electron-build-linux-x64.yml delete mode 100644 .github/workflows/template-electron-build-macos.yml delete mode 100644 .github/workflows/template-electron-build-windows-x64.yml diff --git a/.github/workflows/jan-electron-build-nightly.yml b/.github/workflows/jan-electron-build-nightly.yml deleted file mode 100644 index b4d275658..000000000 --- a/.github/workflows/jan-electron-build-nightly.yml +++ /dev/null @@ -1,215 +0,0 @@ -name: Electron Builder - Nightly / Manual - -on: - schedule: - - cron: '0 20 * * 1,2,3' # At 8 PM UTC on Monday, Tuesday, and Wednesday which is 3 AM UTC+7 Tuesday, Wednesday, and Thursday - workflow_dispatch: - inputs: - public_provider: - type: choice - description: 'Public Provider' - options: - - none - - aws-s3 - default: none - pull_request: - branches: - - release/** - -jobs: - set-public-provider: - runs-on: ubuntu-latest - outputs: - public_provider: ${{ steps.set-public-provider.outputs.public_provider }} - ref: ${{ steps.set-public-provider.outputs.ref }} - steps: - - name: Set public provider - id: set-public-provider - run: | - if [ "${{ github.event_name }}" == "workflow_dispatch" ]; then - echo "::set-output name=public_provider::${{ github.event.inputs.public_provider }}" - echo "::set-output name=ref::${{ github.ref }}" - else - if [ "${{ github.event_name }}" == "schedule" ]; then - echo "::set-output name=public_provider::aws-s3" - echo "::set-output name=ref::refs/heads/dev" - elif [ "${{ github.event_name }}" == "push" ]; then - echo "::set-output name=public_provider::aws-s3" - echo "::set-output name=ref::${{ github.ref }}" - elif [ "${{ github.event_name }}" == "pull_request_review" ]; then - echo "::set-output name=public_provider::none" - echo "::set-output name=ref::${{ github.ref }}" - else - echo "::set-output name=public_provider::none" - echo "::set-output name=ref::${{ github.ref }}" - fi - fi - # Job create Update app version based on latest release tag with build number and save to output - get-update-version: - uses: ./.github/workflows/template-get-update-version.yml - - build-tauri-macos: - uses: ./.github/workflows/template-tauri-build-macos.yml - secrets: inherit - needs: [get-update-version, set-public-provider] - with: - ref: ${{ needs.set-public-provider.outputs.ref }} - public_provider: ${{ needs.set-public-provider.outputs.public_provider }} - new_version: ${{ needs.get-update-version.outputs.new_version }} - channel: nightly - cortex_api_port: "39261" - - build-tauri-windows-x64: - uses: ./.github/workflows/template-tauri-build-windows-x64.yml - secrets: inherit - needs: [get-update-version, set-public-provider] - with: - ref: ${{ needs.set-public-provider.outputs.ref }} - public_provider: ${{ needs.set-public-provider.outputs.public_provider }} - new_version: ${{ needs.get-update-version.outputs.new_version }} - channel: nightly - cortex_api_port: "39261" - - build-tauri-linux-x64: - uses: ./.github/workflows/template-tauri-build-linux-x64.yml - secrets: inherit - needs: [get-update-version, set-public-provider] - with: - ref: ${{ needs.set-public-provider.outputs.ref }} - public_provider: ${{ needs.set-public-provider.outputs.public_provider }} - new_version: ${{ needs.get-update-version.outputs.new_version }} - channel: nightly - cortex_api_port: "39261" - - sync-temp-to-latest: - needs: [get-update-version, set-public-provider, build-tauri-windows-x64, build-tauri-linux-x64, build-tauri-macos] - runs-on: ubuntu-latest - steps: - - name: Getting the repo - uses: actions/checkout@v3 - - name: Install jq - uses: dcarbone/install-jq-action@v2.0.1 - - name: create latest.json file - run: | - VERSION=${{ needs.get-update-version.outputs.new_version }} - PUB_DATE=$(date -u +"%Y-%m-%dT%H:%M:%S.%3NZ") - LINUX_SIGNATURE="${{ needs.build-tauri-linux-x64.outputs.APPIMAGE_SIG }}" - LINUX_URL="https://delta.jan.ai/nightly/${{ needs.build-tauri-linux-x64.outputs.APPIMAGE_FILE_NAME }}" - WINDOWS_SIGNATURE="${{ needs.build-tauri-windows-x64.outputs.WIN_SIG }}" - WINDOWS_URL="https://delta.jan.ai/nightly/${{ needs.build-tauri-windows-x64.outputs.FILE_NAME }}" - DARWIN_SIGNATURE="${{ needs.build-tauri-macos.outputs.MAC_UNIVERSAL_SIG }}" - DARWIN_URL="https://delta.jan.ai/nightly/Jan-nightly_${{ needs.get-update-version.outputs.new_version }}.app.tar.gz" - - jq --arg version "$VERSION" \ - --arg pub_date "$PUB_DATE" \ - --arg linux_signature "$LINUX_SIGNATURE" \ - --arg linux_url "$LINUX_URL" \ - --arg windows_signature "$WINDOWS_SIGNATURE" \ - --arg windows_url "$WINDOWS_URL" \ - --arg darwin_arm_signature "$DARWIN_SIGNATURE" \ - --arg darwin_arm_url "$DARWIN_URL" \ - --arg darwin_amd_signature "$DARWIN_SIGNATURE" \ - --arg darwin_amd_url "$DARWIN_URL" \ - '.version = $version - | .pub_date = $pub_date - | .platforms["linux-x86_64"].signature = $linux_signature - | .platforms["linux-x86_64"].url = $linux_url - | .platforms["windows-x86_64"].signature = $windows_signature - | .platforms["windows-x86_64"].url = $windows_url - | .platforms["darwin-aarch64"].signature = $darwin_arm_signature - | .platforms["darwin-aarch64"].url = $darwin_arm_url - | .platforms["darwin-x86_64"].signature = $darwin_amd_signature - | .platforms["darwin-x86_64"].url = $darwin_amd_url' \ - src-tauri/latest.json.template > latest.json - cat latest.json - - name: Sync temp to latest - if: ${{ needs.set-public-provider.outputs.public_provider == 'aws-s3' }} - run: | - aws s3 cp ./latest.json s3://${{ secrets.DELTA_AWS_S3_BUCKET_NAME }}/temp-nightly/latest.json - aws s3 sync s3://${{ secrets.DELTA_AWS_S3_BUCKET_NAME }}/temp-nightly/ s3://${{ secrets.DELTA_AWS_S3_BUCKET_NAME }}/nightly/ - env: - AWS_ACCESS_KEY_ID: ${{ secrets.DELTA_AWS_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.DELTA_AWS_SECRET_ACCESS_KEY }} - AWS_DEFAULT_REGION: ${{ secrets.DELTA_AWS_REGION }} - AWS_EC2_METADATA_DISABLED: "true" - - noti-discord-nightly-and-update-url-readme: - needs: [ - build-tauri-macos, - build-tauri-windows-x64, - build-tauri-linux-x64, - get-update-version, - set-public-provider, - sync-temp-to-latest - ] - secrets: inherit - if: github.event_name == 'schedule' - uses: ./.github/workflows/template-noti-discord-and-update-url-readme.yml - with: - ref: refs/heads/dev - build_reason: Nightly - push_to_branch: dev - new_version: ${{ needs.get-update-version.outputs.new_version }} - - noti-discord-pre-release-and-update-url-readme: - needs: [ - build-tauri-macos, - build-tauri-windows-x64, - build-tauri-linux-x64, - get-update-version, - set-public-provider, - sync-temp-to-latest - ] - secrets: inherit - if: github.event_name == 'push' - uses: ./.github/workflows/template-noti-discord-and-update-url-readme.yml - with: - ref: refs/heads/dev - build_reason: Pre-release - push_to_branch: dev - new_version: ${{ needs.get-update-version.outputs.new_version }} - - noti-discord-manual-and-update-url-readme: - needs: [ - build-tauri-macos, - build-tauri-windows-x64, - build-tauri-linux-x64, - get-update-version, - set-public-provider, - sync-temp-to-latest - ] - secrets: inherit - if: github.event_name == 'workflow_dispatch' && github.event.inputs.public_provider == 'aws-s3' - uses: ./.github/workflows/template-noti-discord-and-update-url-readme.yml - with: - ref: refs/heads/dev - build_reason: Manual - push_to_branch: dev - new_version: ${{ needs.get-update-version.outputs.new_version }} - - - # comment-pr-build-url: - # needs: [ - # build-tauri-macos, - # build-tauri-windows-x64, - # build-tauri-linux-x64, - # get-update-version, - # set-public-provider, - # sync-temp-to-latest - # ] - # runs-on: ubuntu-latest - # if: github.event_name == 'pull_request_review' - # steps: - # - name: Set up GitHub CLI - # run: | - # curl -sSL https://github.com/cli/cli/releases/download/v2.33.0/gh_2.33.0_linux_amd64.tar.gz | tar xz - # sudo cp gh_2.33.0_linux_amd64/bin/gh /usr/local/bin/ - - # - name: Comment build URL on PR - # env: - # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - # run: | - # PR_URL=${{ github.event.pull_request.html_url }} - # RUN_ID=${{ github.run_id }} - # COMMENT="This is the build for this pull request. You can download it from the Artifacts section here: [Build URL](https://github.com/${{ github.repository }}/actions/runs/${RUN_ID})." - # gh pr comment $PR_URL --body "$COMMENT" \ No newline at end of file diff --git a/.github/workflows/jan-electron-build.yml b/.github/workflows/jan-electron-build.yml deleted file mode 100644 index a223027f3..000000000 --- a/.github/workflows/jan-electron-build.yml +++ /dev/null @@ -1,131 +0,0 @@ -name: Electron Builder - Tag - -on: - push: - tags: ["v[0-9]+.[0-9]+.[0-9]+"] - -jobs: - # Job create Update app version based on latest release tag with build number and save to output - get-update-version: - uses: ./.github/workflows/template-get-update-version.yml - - create-draft-release: - runs-on: ubuntu-latest - if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') - outputs: - upload_url: ${{ steps.create_release.outputs.upload_url }} - version: ${{ steps.get_version.outputs.version }} - permissions: - contents: write - steps: - - name: Extract tag name without v prefix - id: get_version - run: echo "VERSION=${GITHUB_REF#refs/tags/v}" >> $GITHUB_ENV && echo "::set-output name=version::${GITHUB_REF#refs/tags/v}" - env: - GITHUB_REF: ${{ github.ref }} - - name: Create Draft Release - id: create_release - uses: softprops/action-gh-release@v2 - with: - tag_name: ${{ github.ref_name }} - token: ${{ secrets.GITHUB_TOKEN }} - name: "${{ env.VERSION }}" - draft: true - prerelease: false - - build-electron-macos: - uses: ./.github/workflows/template-electron-build-macos.yml - secrets: inherit - needs: [get-update-version] - with: - ref: ${{ github.ref }} - public_provider: github - beta: false - nightly: false - new_version: ${{ needs.get-update-version.outputs.new_version }} - - build-electron-windows-x64: - uses: ./.github/workflows/template-electron-build-windows-x64.yml - secrets: inherit - needs: [get-update-version] - with: - ref: ${{ github.ref }} - public_provider: github - beta: false - nightly: false - new_version: ${{ needs.get-update-version.outputs.new_version }} - - build-electron-linux-x64: - uses: ./.github/workflows/template-electron-build-linux-x64.yml - secrets: inherit - needs: [get-update-version] - with: - ref: ${{ github.ref }} - public_provider: github - beta: false - nightly: false - new_version: ${{ needs.get-update-version.outputs.new_version }} - - # build-tauri-macos: - # uses: ./.github/workflows/template-tauri-build-macos.yml - # secrets: inherit - # needs: [get-update-version, create-draft-release] - # with: - # ref: ${{ github.ref }} - # public_provider: github - # channel: stable - # new_version: ${{ needs.get-update-version.outputs.new_version }} - # upload_url: ${{ needs.create-draft-release.outputs.upload_url }} - - # build-tauri-windows-x64: - # uses: ./.github/workflows/template-tauri-build-windows-x64.yml - # secrets: inherit - # needs: [get-update-version, create-draft-release] - # with: - # ref: ${{ github.ref }} - # public_provider: github - # channel: stable - # new_version: ${{ needs.get-update-version.outputs.new_version }} - # upload_url: ${{ needs.create-draft-release.outputs.upload_url }} - - # build-tauri-linux-x64: - # uses: ./.github/workflows/template-tauri-build-linux-x64.yml - # secrets: inherit - # needs: [get-update-version, create-draft-release] - # with: - # ref: ${{ github.ref }} - # public_provider: github - # channel: stable - # new_version: ${{ needs.get-update-version.outputs.new_version }} - # upload_url: ${{ needs.create-draft-release.outputs.upload_url }} - - update_release_draft: - needs: [ - build-electron-windows-x64, - build-electron-linux-x64, - build-electron-macos, - build-tauri-windows-x64, - build-tauri-linux-x64, - build-tauri-macos - ] - permissions: - # write permission is required to create a github release - contents: write - # write permission is required for autolabeler - # otherwise, read permission is required at least - pull-requests: write - runs-on: ubuntu-latest - steps: - # (Optional) GitHub Enterprise requires GHE_HOST variable set - #- name: Set GHE_HOST - # run: | - # echo "GHE_HOST=${GITHUB_SERVER_URL##https:\/\/}" >> $GITHUB_ENV - - # Drafts your next Release notes as Pull Requests are merged into "master" - - uses: release-drafter/release-drafter@v5 - # (Optional) specify config name to use, relative to .github/. Default: release-drafter.yml - # with: - # config-name: my-config.yml - # disable-autolabeler: true - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file diff --git a/.github/workflows/jan-electron-linter-and-test.yml b/.github/workflows/jan-electron-linter-and-test.yml deleted file mode 100644 index e895baf06..000000000 --- a/.github/workflows/jan-electron-linter-and-test.yml +++ /dev/null @@ -1,435 +0,0 @@ -name: Test - Linter & Playwright -on: - workflow_dispatch: - push: - branches: - - main - - dev - paths: - - 'electron/**' - - .github/workflows/jan-electron-linter-and-test.yml - - 'web/**' - - 'joi/**' - - 'package.json' - - 'node_modules/**' - - 'yarn.lock' - - 'core/**' - - 'extensions/**' - - '!README.md' - - 'Makefile' - - pull_request: - branches: - - main - - dev - - release/** - paths: - - 'electron/**' - - .github/workflows/jan-electron-linter-and-test.yml - - 'web/**' - - 'joi/**' - - 'package.json' - - 'node_modules/**' - - 'yarn.lock' - - 'Makefile' - - 'extensions/**' - - 'core/**' - - 'src-tauri/**' - - 'web-app/**' - - '!README.md' - -jobs: - base_branch_cov: - runs-on: ubuntu-latest - continue-on-error: true - steps: - - uses: actions/checkout@v3 - with: - ref: ${{ github.base_ref }} - - name: Use Node.js 20.x - uses: actions/setup-node@v3 - with: - node-version: 20 - - - name: Install dependencies - run: | - make config-yarn - yarn - yarn build:core - - - name: Run test coverage - run: yarn test:coverage - - - name: Upload code coverage for ref branch - uses: actions/upload-artifact@v4 - with: - name: ref-lcov.info - path: ./coverage/lcov.info - - test-on-macos: - if: (github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == github.repository) || github.event_name == 'push' || github.event_name == 'workflow_dispatch' - runs-on: macos-latest - steps: - - name: Getting the repo - uses: actions/checkout@v3 - with: - fetch-depth: 0 - - - name: Installing node - uses: actions/setup-node@v3 - with: - node-version: 20 - - - name: Set IS_TEST environment variable - run: | - echo "IS_TEST=true" >> $GITHUB_ENV - - - name: 'Cleanup cache' - continue-on-error: true - run: | - rm -rf ~/jan - make clean - - - name: Get Commit Message for PR - if: github.event_name == 'pull_request' - run: | - echo "REPORT_PORTAL_DESCRIPTION=${{github.event.after}})" >> $GITHUB_ENV - - - name: Get Commit Message for push event - if: github.event_name == 'push' - run: | - echo "REPORT_PORTAL_DESCRIPTION=${{github.sha}})" >> $GITHUB_ENV - - # - name: 'Config report portal' - # run: | - # make update-playwright-config REPORT_PORTAL_URL=${{ secrets.REPORT_PORTAL_URL }} REPORT_PORTAL_API_KEY=${{ secrets.REPORT_PORTAL_API_KEY }} REPORT_PORTAL_PROJECT_NAME=${{ secrets.REPORT_PORTAL_PROJECT_NAME }} REPORT_PORTAL_LAUNCH_NAME="Jan App macos" REPORT_PORTAL_DESCRIPTION="${{env.REPORT_PORTAL_DESCRIPTION}}" - - - name: Linter and test - run: | - make test - env: - CSC_IDENTITY_AUTO_DISCOVERY: 'false' - - test-on-macos-pr-target: - if: github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name != github.repository - runs-on: macos-latest - steps: - - name: Getting the repo - uses: actions/checkout@v3 - with: - fetch-depth: 0 - - - name: Installing node - uses: actions/setup-node@v3 - with: - node-version: 20 - - - name: 'Cleanup cache' - continue-on-error: true - run: | - rm -rf ~/jan - make clean - - - name: Linter and test - run: | - make test - env: - CSC_IDENTITY_AUTO_DISCOVERY: 'false' - - test-on-windows: - if: github.event_name == 'push' - strategy: - fail-fast: false - matrix: - antivirus-tools: ['mcafee', 'default-windows-security', 'bit-defender'] - runs-on: windows-desktop-${{ matrix.antivirus-tools }} - steps: - - name: Getting the repo - uses: actions/checkout@v3 - with: - fetch-depth: 0 - - - name: Installing node - uses: actions/setup-node@v3 - with: - node-version: 20 - - - name: Install tauri-driver dependencies - run: | - cargo install tauri-driver --locked - - # Clean cache, continue on error - - name: 'Cleanup cache' - shell: powershell - continue-on-error: true - run: | - $path = "$Env:APPDATA\jan" - if (Test-Path $path) { - Remove-Item "\\?\$path" -Recurse -Force - } else { - Write-Output "Folder does not exist." - } - make clean - - - name: Get Commit Message for push event - if: github.event_name == 'push' - shell: bash - run: | - echo "REPORT_PORTAL_DESCRIPTION=${{github.sha}}" >> $GITHUB_ENV - - # - name: 'Config report portal' - # shell: bash - # run: | - # make update-playwright-config REPORT_PORTAL_URL=${{ secrets.REPORT_PORTAL_URL }} REPORT_PORTAL_API_KEY=${{ secrets.REPORT_PORTAL_API_KEY }} REPORT_PORTAL_PROJECT_NAME=${{ secrets.REPORT_PORTAL_PROJECT_NAME }} REPORT_PORTAL_LAUNCH_NAME="Jan App Windows ${{ matrix.antivirus-tools }}" REPORT_PORTAL_DESCRIPTION="${{env.REPORT_PORTAL_DESCRIPTION}}" - - - name: Linter and test - shell: powershell - run: | - make test - - test-on-windows-pr: - if: (github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == github.repository) || github.event_name == 'workflow_dispatch' - runs-on: windows-latest - steps: - - name: Getting the repo - uses: actions/checkout@v3 - with: - fetch-depth: 0 - - - uses: actions/cache@v4 # v4 - with: - path: | - ~/.cargo/bin/ - ~/.cargo/registry/index/ - ~/.cargo/registry/cache/ - ~/.cargo/git/db/ - target/ - key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}-${{ hashFiles('**/yarn.lock') }} - - - name: Installing node - uses: actions/setup-node@v3 - with: - node-version: 20 - - - name: Install tauri-driver dependencies - run: | - cargo install tauri-driver --locked - - # Clean cache, continue on error - - name: 'Cleanup cache' - shell: powershell - continue-on-error: true - run: | - $path = "$Env:APPDATA\jan" - if (Test-Path $path) { - Remove-Item "\\?\$path" -Recurse -Force - } else { - Write-Output "Folder does not exist." - } - make clean - - - name: Get Commit Message for PR - if: github.event_name == 'pull_request' - shell: bash - run: | - echo "REPORT_PORTAL_DESCRIPTION=${{github.event.after}}" >> $GITHUB_ENV - - # - name: 'Config report portal' - # shell: bash - # run: | - # make update-playwright-config REPORT_PORTAL_URL=${{ secrets.REPORT_PORTAL_URL }} REPORT_PORTAL_API_KEY=${{ secrets.REPORT_PORTAL_API_KEY }} REPORT_PORTAL_PROJECT_NAME=${{ secrets.REPORT_PORTAL_PROJECT_NAME }} REPORT_PORTAL_LAUNCH_NAME="Jan App Windows" REPORT_PORTAL_DESCRIPTION="${{env.REPORT_PORTAL_DESCRIPTION}}" - - - name: Install Prerequisites - shell: 'powershell' - # https://github.com/actions/runner-images/issues/9538 - # https://github.com/microsoft/playwright/pull/30009/files - # https://github.com/tauri-apps/wry/issues/1268 - # Evergreen Bootstrapper - # The Bootstrapper is a tiny installer that downloads - # the Evergreen Runtime matching device architecture - # and installs it locally. - # https://developer.microsoft.com/en-us/microsoft-edge/webview2/consumer/?form=MA13LH - run: | - Invoke-WebRequest -Uri 'https://go.microsoft.com/fwlink/p/?LinkId=2124703' -OutFile 'setup.exe' - Start-Process -FilePath setup.exe -Verb RunAs -Wait - - - name: Linter and test - shell: powershell - run: | - make test - - test-on-windows-pr-target: - if: github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name != github.repository - runs-on: windows-latest - steps: - - name: Getting the repo - uses: actions/checkout@v3 - with: - fetch-depth: 0 - - - name: Installing node - uses: actions/setup-node@v1 - with: - node-version: 20 - - - name: Install tauri-driver dependencies - run: | - cargo install tauri-driver --locked - - # Clean cache, continue on error - - name: 'Cleanup cache' - shell: powershell - continue-on-error: true - run: | - $path = "$Env:APPDATA\jan" - if (Test-Path $path) { - Remove-Item "\\?\$path" -Recurse -Force - } else { - Write-Output "Folder does not exist." - } - make clean - - - name: Linter and test - shell: powershell - run: | - make test - - test-on-ubuntu: - runs-on: ubuntu-latest - if: (github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == github.repository) || github.event_name == 'push' || github.event_name == 'workflow_dispatch' - steps: - - name: Getting the repo - uses: actions/checkout@v3 - with: - fetch-depth: 0 - - - name: Installing node - uses: actions/setup-node@v3 - with: - node-version: 20 - - - name: Install Tauri dependencies - run: | - sudo apt update - sudo apt install -y libglib2.0-dev libatk1.0-dev libpango1.0-dev libgtk-3-dev libsoup-3.0-dev libwebkit2gtk-4.1-dev librsvg2-dev libfuse2 webkit2gtk-driver - - - name: Install tauri-driver dependencies - run: | - cargo install tauri-driver --locked - - - name: 'Cleanup cache' - continue-on-error: true - run: | - rm -rf ~/jan - make clean - - - name: Get Commit Message for PR - if: github.event_name == 'pull_request' - run: | - echo "REPORT_PORTAL_DESCRIPTION=${{github.event.after}}" >> $GITHUB_ENV - - - name: Get Commit Message for push event - if: github.event_name == 'push' - run: | - echo "REPORT_PORTAL_DESCRIPTION=${{github.sha}}" >> $GITHUB_ENV - - # - name: 'Config report portal' - # shell: bash - # run: | - # make update-playwright-config REPORT_PORTAL_URL=${{ secrets.REPORT_PORTAL_URL }} REPORT_PORTAL_API_KEY=${{ secrets.REPORT_PORTAL_API_KEY }} REPORT_PORTAL_PROJECT_NAME=${{ secrets.REPORT_PORTAL_PROJECT_NAME }} REPORT_PORTAL_LAUNCH_NAME="Jan App Linux" REPORT_PORTAL_DESCRIPTION="${{env.REPORT_PORTAL_DESCRIPTION}}" - - - name: Linter and test - run: | - export DISPLAY=$(w -h | awk 'NR==1 {print $2}') - echo -e "Display ID: $DISPLAY" - make test - - - uses: actions/upload-artifact@v4 - if: always() - with: - name: playwright-report - path: electron/playwright-report/ - retention-days: 2 - - # coverage-check: - # runs-on: ubuntu-latest - # needs: base_branch_cov - # continue-on-error: true - # if: (github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == github.repository) || github.event_name == 'push' || github.event_name == 'workflow_dispatch' - # steps: - # - name: Getting the repo - # uses: actions/checkout@v3 - # with: - # fetch-depth: 0 - - # - name: Installing node - # uses: actions/setup-node@v3 - # with: - # node-version: 20 - - # - name: Install yarn - # run: npm install -g yarn - - # - name: 'Cleanup cache' - # continue-on-error: true - # run: | - # rm -rf ~/jan - # make clean - - # - name: Download code coverage report from base branch - # uses: actions/download-artifact@v4 - # with: - # name: ref-lcov.info - - # - name: Linter and test coverage - # run: | - # export DISPLAY=$(w -h | awk 'NR==1 {print $2}') - # echo -e "Display ID: $DISPLAY" - # make lint - # yarn build:test - # yarn test:coverage - - # - name: Generate Code Coverage report - # id: code-coverage - # uses: barecheck/code-coverage-action@v1 - # with: - # github-token: ${{ secrets.GITHUB_TOKEN }} - # lcov-file: './coverage/lcov.info' - # base-lcov-file: './lcov.info' - # send-summary-comment: true - # show-annotations: 'warning' - - test-on-ubuntu-pr-target: - runs-on: ubuntu-latest - if: github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name != github.repository - steps: - - name: Getting the repo - uses: actions/checkout@v3 - with: - fetch-depth: 0 - - - name: Installing node - uses: actions/setup-node@v3 - with: - node-version: 20 - - - name: Install Tauri dependencies - run: | - sudo apt update - sudo apt install -y libglib2.0-dev libatk1.0-dev libpango1.0-dev libgtk-3-dev libsoup-3.0-dev libwebkit2gtk-4.1-dev librsvg2-dev libfuse2 webkit2gtk-driver - - - name: Install tauri-driver dependencies - run: | - cargo install tauri-driver --locked - - - name: 'Cleanup cache' - continue-on-error: true - run: | - rm -rf ~/jan - make clean - - - name: Linter and test - run: | - export DISPLAY=$(w -h | awk 'NR==1 {print $2}') - echo -e "Display ID: $DISPLAY" - make test diff --git a/.github/workflows/jan-linter-and-test.yml b/.github/workflows/jan-linter-and-test.yml new file mode 100644 index 000000000..ae1f81f61 --- /dev/null +++ b/.github/workflows/jan-linter-and-test.yml @@ -0,0 +1,272 @@ +name: Test - Linter & Playwright +on: + workflow_dispatch: + push: + branches: + - main + - dev + paths: + - .github/workflows/jan-linter-and-test.yml + - 'web/**' + - 'joi/**' + - 'package.json' + - 'node_modules/**' + - 'yarn.lock' + - 'core/**' + - 'extensions/**' + - '!README.md' + - 'Makefile' + + pull_request: + branches: + - main + - dev + - release/** + paths: + - .github/workflows/jan-linter-and-test.yml + - 'web/**' + - 'joi/**' + - 'package.json' + - 'node_modules/**' + - 'yarn.lock' + - 'Makefile' + - 'extensions/**' + - 'core/**' + - 'src-tauri/**' + - 'web-app/**' + - '!README.md' + +jobs: + base_branch_cov: + runs-on: ubuntu-latest + continue-on-error: true + steps: + - uses: actions/checkout@v3 + with: + ref: ${{ github.base_ref }} + - name: Use Node.js 20.x + uses: actions/setup-node@v3 + with: + node-version: 20 + + - name: Install dependencies + run: | + make config-yarn + yarn + yarn build:core + + - name: Run test coverage + run: yarn test:coverage + + - name: Upload code coverage for ref branch + uses: actions/upload-artifact@v4 + with: + name: ref-lcov.info + path: ./coverage/lcov.info + + test-on-macos: + runs-on: ${{ (github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name != github.repository) && 'macos-latest' || 'macos-selfhosted-12-arm64' }} + if: github.event_name == 'pull_request' || github.event_name == 'push' || github.event_name == 'workflow_dispatch' + steps: + - name: Getting the repo + uses: actions/checkout@v3 + with: + fetch-depth: 0 + + - name: Installing node + uses: actions/setup-node@v3 + with: + node-version: 20 + + - name: Set IS_TEST environment variable + if: github.event.pull_request.head.repo.full_name == github.repository + run: echo "IS_TEST=true" >> $GITHUB_ENV + + - name: 'Cleanup cache' + continue-on-error: true + run: | + rm -rf ~/jan + make clean + + - name: Linter and test + run: | + make test + env: + CSC_IDENTITY_AUTO_DISCOVERY: 'false' + + test-on-windows: + if: github.event_name == 'push' + strategy: + fail-fast: false + matrix: + antivirus-tools: ['mcafee', 'default-windows-security', 'bit-defender'] + runs-on: windows-desktop-${{ matrix.antivirus-tools }} + steps: + - name: Getting the repo + uses: actions/checkout@v3 + with: + fetch-depth: 0 + + - name: Installing node + uses: actions/setup-node@v3 + with: + node-version: 20 + + - name: Install tauri-driver dependencies + run: | + cargo install tauri-driver --locked + + # Clean cache, continue on error + - name: 'Cleanup cache' + shell: powershell + continue-on-error: true + run: | + $path = "$Env:APPDATA\jan" + if (Test-Path $path) { + Remove-Item "\\?\$path" -Recurse -Force + } else { + Write-Output "Folder does not exist." + } + make clean + + - name: Linter and test + shell: powershell + run: | + make test + + test-on-windows-pr: + if: github.event_name == 'pull_request' || github.event_name == 'workflow_dispatch' + runs-on: ${{ (github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name != github.repository) && 'windows-latest' || 'WINDOWS-11' }} + steps: + - name: Getting the repo + uses: actions/checkout@v3 + with: + fetch-depth: 0 + + - name: install dependencies + run: | + choco install --yes --no-progress make + + - name: Installing node + uses: actions/setup-node@v3 + with: + node-version: 20 + + - name: Install tauri-driver dependencies + run: | + cargo install tauri-driver --locked + + - name: 'Cleanup cache' + shell: powershell + continue-on-error: true + run: | + $path = "$Env:APPDATA\jan" + if (Test-Path $path) { + Remove-Item "\\?\$path" -Recurse -Force + } else { + Write-Output "Folder does not exist." + } + make clean + + - name: Install WebView2 Runtime (Bootstrapper) + shell: powershell + run: | + Invoke-WebRequest -Uri 'https://go.microsoft.com/fwlink/p/?LinkId=2124703' -OutFile 'setup.exe' + Start-Process -FilePath setup.exe -Verb RunAs -Wait + + - name: Linter and test + shell: powershell + run: | + make test + env: + NODE_OPTIONS: '--max-old-space-size=2048' + + test-on-ubuntu: + runs-on: ${{ (github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name != github.repository) && 'ubuntu-latest' || 'ubuntu-latest' }} + if: github.event_name == 'pull_request' || github.event_name == 'push' || github.event_name == 'workflow_dispatch' + steps: + - name: Getting the repo + uses: actions/checkout@v3 + with: + fetch-depth: 0 + + - name: Installing node + uses: actions/setup-node@v3 + with: + node-version: 20 + + - name: Install Tauri dependencies + run: | + sudo apt update + sudo apt install -y libglib2.0-dev libatk1.0-dev libpango1.0-dev libgtk-3-dev libsoup-3.0-dev libwebkit2gtk-4.1-dev librsvg2-dev libfuse2 webkit2gtk-driver + + - name: Install tauri-driver dependencies + run: | + cargo install tauri-driver --locked + + - name: 'Cleanup cache' + continue-on-error: true + run: | + rm -rf ~/jan + make clean + + - name: Linter and test + run: | + export DISPLAY=$(w -h | awk 'NR==1 {print $2}') + echo -e "Display ID: $DISPLAY" + make test + + - uses: actions/upload-artifact@v4 + if: always() + with: + name: playwright-report + path: electron/playwright-report/ + retention-days: 2 + + # coverage-check: + # runs-on: ubuntu-latest + # needs: base_branch_cov + # continue-on-error: true + # if: (github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == github.repository) || github.event_name == 'push' || github.event_name == 'workflow_dispatch' + # steps: + # - name: Getting the repo + # uses: actions/checkout@v3 + # with: + # fetch-depth: 0 + + # - name: Installing node + # uses: actions/setup-node@v3 + # with: + # node-version: 20 + + # - name: Install yarn + # run: npm install -g yarn + + # - name: 'Cleanup cache' + # continue-on-error: true + # run: | + # rm -rf ~/jan + # make clean + + # - name: Download code coverage report from base branch + # uses: actions/download-artifact@v4 + # with: + # name: ref-lcov.info + + # - name: Linter and test coverage + # run: | + # export DISPLAY=$(w -h | awk 'NR==1 {print $2}') + # echo -e "Display ID: $DISPLAY" + # make lint + # yarn build:test + # yarn test:coverage + + # - name: Generate Code Coverage report + # id: code-coverage + # uses: barecheck/code-coverage-action@v1 + # with: + # github-token: ${{ secrets.GITHUB_TOKEN }} + # lcov-file: './coverage/lcov.info' + # base-lcov-file: './lcov.info' + # send-summary-comment: true + # show-annotations: 'warning' diff --git a/.github/workflows/template-electron-build-linux-x64.yml b/.github/workflows/template-electron-build-linux-x64.yml deleted file mode 100644 index cef11cb0f..000000000 --- a/.github/workflows/template-electron-build-linux-x64.yml +++ /dev/null @@ -1,186 +0,0 @@ -name: build-linux-x64 -on: - workflow_call: - inputs: - ref: - required: true - type: string - default: 'refs/heads/main' - public_provider: - required: true - type: string - default: none - description: 'none: build only, github: build and publish to github, aws s3: build and publish to aws s3' - new_version: - required: true - type: string - default: '' - aws_s3_prefix: - required: false - type: string - default: '/latest/' - beta: - required: false - type: boolean - default: false - nightly: - required: false - type: boolean - default: false - cortex_api_port: - required: false - type: string - default: null - secrets: - DELTA_AWS_S3_BUCKET_NAME: - required: false - DELTA_AWS_ACCESS_KEY_ID: - required: false - DELTA_AWS_SECRET_ACCESS_KEY: - required: false - -jobs: - build-linux-x64: - if: inputs.public_provider == 'github' || inputs.public_provider == 'none' - runs-on: ubuntu-latest - permissions: - contents: write - steps: - - name: Getting the repo - uses: actions/checkout@v3 - with: - ref: ${{ inputs.ref }} - - - name: Replace Icons for Beta Build - if: inputs.beta == true && inputs.nightly != true - shell: bash - run: | - rm -rf electron/icons/* - - cp electron/icons_dev/jan-beta-512x512.png electron/icons/512x512.png - cp electron/icons_dev/jan-beta.ico electron/icons/icon.ico - cp electron/icons_dev/jan-beta.png electron/icons/icon.png - cp electron/icons_dev/jan-beta-tray@2x.png electron/icons/icon-tray@2x.png - cp electron/icons_dev/jan-beta-tray.png electron/icons/icon-tray.png - - - name: Replace Icons for Nightly Build - if: inputs.nightly == true && inputs.beta != true - shell: bash - run: | - rm -rf electron/icons/* - - cp electron/icons_dev/jan-nightly-512x512.png electron/icons/512x512.png - cp electron/icons_dev/jan-nightly.ico electron/icons/icon.ico - cp electron/icons_dev/jan-nightly.png electron/icons/icon.png - cp electron/icons_dev/jan-nightly-tray@2x.png electron/icons/icon-tray@2x.png - cp electron/icons_dev/jan-nightly-tray.png electron/icons/icon-tray.png - - - name: Installing node - uses: actions/setup-node@v1 - with: - node-version: 20 - - - name: Install jq - uses: dcarbone/install-jq-action@v2.0.1 - - - name: Update app version base public_provider - if: inputs.public_provider != 'github' - run: | - echo "Version: ${{ inputs.new_version }}" - # Update the version in electron/package.json - jq --arg version "${{ inputs.new_version }}" '.version = $version' electron/package.json > /tmp/package.json - mv /tmp/package.json electron/package.json - jq --arg version "${{ inputs.new_version }}" '.version = $version' web/package.json > /tmp/package.json - mv /tmp/package.json web/package.json - jq '.build.publish = [{"provider": "generic", "url": "https://delta.jan.ai/nightly", "channel": "latest"}, {"provider": "s3", "acl": null, "bucket": "${{ secrets.DELTA_AWS_S3_BUCKET_NAME }}", "region": "${{ secrets.DELTA_AWS_REGION}}", "path": "temp-nightly", "channel": "latest"}]' electron/package.json > /tmp/package.json - mv /tmp/package.json electron/package.json - cat electron/package.json - chmod +x .github/scripts/rename-app.sh - .github/scripts/rename-app.sh ./electron/package.json nightly - chmod +x .github/scripts/rename-workspace.sh - .github/scripts/rename-workspace.sh ./package.json nightly - echo "------------------------" - cat ./electron/package.json - echo "------------------------" - - - name: Change App Name for beta version - if: inputs.beta == true - shell: bash - run: | - chmod +x .github/scripts/rename-app.sh - .github/scripts/rename-app.sh ./electron/package.json beta - chmod +x .github/scripts/rename-workspace.sh - .github/scripts/rename-workspace.sh ./package.json beta - echo "------------------------" - cat ./electron/package.json - echo "------------------------" - cat ./package.json - jq '.build.publish = [{"provider": "generic", "url": "https://delta.jan.ai/beta", "channel": "beta"}, {"provider": "s3", "acl": null, "bucket": "${{ secrets.DELTA_AWS_S3_BUCKET_NAME }}", "region": "${{ secrets.DELTA_AWS_REGION}}", "path": "temp-beta", "channel": "beta"}]' electron/package.json > /tmp/package.json - mv /tmp/package.json electron/package.json - cat electron/package.json - - - name: Update app version base on tag - if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') && inputs.public_provider == 'github' - run: | - jq --arg version "${VERSION_TAG#v}" '.version = $version' electron/package.json > /tmp/package.json - mv /tmp/package.json electron/package.json - jq --arg version "${VERSION_TAG#v}" '.version = $version' web/package.json > /tmp/package.json - mv /tmp/package.json web/package.json - env: - VERSION_TAG: ${{ inputs.new_version }} - - - name: Build and publish app to aws s3 r2 or github artifactory - if: inputs.public_provider != 'github' - run: | - # check public_provider is true or not - echo "public_provider is ${{ inputs.public_provider }}" - if [ "${{ inputs.public_provider }}" == "none" ]; then - make build - else - make build-and-publish - fi - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - AWS_ACCESS_KEY_ID: ${{ secrets.DELTA_AWS_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.DELTA_AWS_SECRET_ACCESS_KEY }} - AWS_EC2_METADATA_DISABLED: 'true' - AWS_MAX_ATTEMPTS: '5' - POSTHOG_KEY: ${{ secrets.POSTHOG_KEY }} - POSTHOG_HOST: ${{ secrets.POSTHOG_HOST }} - CORTEX_API_PORT: ${{ inputs.cortex_api_port }} - - - name: Build and publish app to github - if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') && inputs.public_provider == 'github' && inputs.beta == false - run: | - make build-and-publish - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - POSTHOG_KEY: ${{ secrets.POSTHOG_KEY }} - POSTHOG_HOST: ${{ secrets.POSTHOG_HOST }} - - - name: Build and publish app to github - if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') && inputs.public_provider == 'github' && inputs.beta == true - run: | - make build-and-publish - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - AWS_ACCESS_KEY_ID: ${{ secrets.DELTA_AWS_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.DELTA_AWS_SECRET_ACCESS_KEY }} - AWS_EC2_METADATA_DISABLED: 'true' - AWS_MAX_ATTEMPTS: '5' - POSTHOG_KEY: ${{ secrets.POSTHOG_KEY }} - POSTHOG_HOST: ${{ secrets.POSTHOG_HOST }} - - - name: Upload Artifact .deb file - if: inputs.public_provider != 'github' - uses: actions/upload-artifact@v4 - with: - name: jan-electron-linux-amd64-${{ inputs.new_version }}-deb - path: ./electron/dist/*.deb - - - name: Upload Artifact .AppImage file - if: inputs.public_provider != 'github' - uses: actions/upload-artifact@v4 - with: - name: jan-electron-linux-amd64-${{ inputs.new_version }}-AppImage - path: ./electron/dist/*.AppImage diff --git a/.github/workflows/template-electron-build-macos.yml b/.github/workflows/template-electron-build-macos.yml deleted file mode 100644 index 8bcdcdf95..000000000 --- a/.github/workflows/template-electron-build-macos.yml +++ /dev/null @@ -1,233 +0,0 @@ -name: build-macos -on: - workflow_call: - inputs: - ref: - required: true - type: string - default: 'refs/heads/main' - public_provider: - required: true - type: string - default: none - description: 'none: build only, github: build and publish to github, aws s3: build and publish to aws s3' - new_version: - required: true - type: string - default: '' - aws_s3_prefix: - required: false - type: string - default: '/latest/' - beta: - required: false - type: boolean - default: false - nightly: - required: false - type: boolean - default: false - cortex_api_port: - required: false - type: string - default: null - secrets: - DELTA_AWS_S3_BUCKET_NAME: - required: false - DELTA_AWS_ACCESS_KEY_ID: - required: false - DELTA_AWS_SECRET_ACCESS_KEY: - required: false - CODE_SIGN_P12_BASE64: - required: false - CODE_SIGN_P12_PASSWORD: - required: false - APPLE_ID: - required: false - APPLE_APP_SPECIFIC_PASSWORD: - required: false - DEVELOPER_ID: - required: false - -jobs: - build-macos: - if: inputs.public_provider == 'github' || inputs.public_provider == 'none' - runs-on: macos-latest - permissions: - contents: write - steps: - - name: Getting the repo - uses: actions/checkout@v3 - with: - ref: ${{ inputs.ref }} - - - name: Replace Icons for Beta Build - if: inputs.beta == true && inputs.nightly != true - shell: bash - run: | - rm -rf electron/icons/* - - cp electron/icons_dev/jan-beta-512x512.png electron/icons/512x512.png - cp electron/icons_dev/jan-beta.ico electron/icons/icon.ico - cp electron/icons_dev/jan-beta.png electron/icons/icon.png - cp electron/icons_dev/jan-beta-tray@2x.png electron/icons/icon-tray@2x.png - cp electron/icons_dev/jan-beta-tray.png electron/icons/icon-tray.png - - - name: Replace Icons for Nightly Build - if: inputs.nightly == true && inputs.beta != true - shell: bash - run: | - rm -rf electron/icons/* - - cp electron/icons_dev/jan-nightly-512x512.png electron/icons/512x512.png - cp electron/icons_dev/jan-nightly.ico electron/icons/icon.ico - cp electron/icons_dev/jan-nightly.png electron/icons/icon.png - cp electron/icons_dev/jan-nightly-tray@2x.png electron/icons/icon-tray@2x.png - cp electron/icons_dev/jan-nightly-tray.png electron/icons/icon-tray.png - - - name: Installing node - uses: actions/setup-node@v1 - with: - node-version: 20 - - - name: Install jq - uses: dcarbone/install-jq-action@v2.0.1 - - - name: Update app version based on latest release tag with build number - if: inputs.public_provider != 'github' - run: | - echo "Version: ${{ inputs.new_version }}" - # Update the version in electron/package.json - jq --arg version "${{ inputs.new_version }}" '.version = $version' electron/package.json > /tmp/package.json - mv /tmp/package.json electron/package.json - - jq --arg version "${{ inputs.new_version }}" '.version = $version' web/package.json > /tmp/package.json - mv /tmp/package.json web/package.json - - jq '.build.publish = [{"provider": "generic", "url": "https://delta.jan.ai/nightly", "channel": "latest"}, {"provider": "s3", "acl": null, "bucket": "${{ secrets.DELTA_AWS_S3_BUCKET_NAME }}", "region": "${{ secrets.DELTA_AWS_REGION}}", "path": "temp-nightly", "channel": "latest"}]' electron/package.json > /tmp/package.json - mv /tmp/package.json electron/package.json - - jq --arg teamid "${{ secrets.APPLE_TEAM_ID }}" '.build.mac.notarize.teamId = $teamid' electron/package.json > /tmp/package.json - mv /tmp/package.json electron/package.json - - # cat electron/package.json - chmod +x .github/scripts/rename-app.sh - .github/scripts/rename-app.sh ./electron/package.json nightly - chmod +x .github/scripts/rename-workspace.sh - .github/scripts/rename-workspace.sh ./package.json nightly - echo "------------------------" - cat ./electron/package.json - echo "------------------------" - - - name: Change App Name for beta version - if: inputs.beta == true - shell: bash - run: | - chmod +x .github/scripts/rename-app.sh - .github/scripts/rename-app.sh ./electron/package.json beta - chmod +x .github/scripts/rename-workspace.sh - .github/scripts/rename-workspace.sh ./package.json beta - echo "------------------------" - cat ./electron/package.json - echo "------------------------" - cat ./package.json - jq '.build.publish = [{"provider": "generic", "url": "https://delta.jan.ai/beta", "channel": "beta"}, {"provider": "s3", "acl": null, "bucket": "${{ secrets.DELTA_AWS_S3_BUCKET_NAME }}", "region": "${{ secrets.DELTA_AWS_REGION}}", "path": "temp-beta", "channel": "beta"}]' electron/package.json > /tmp/package.json - mv /tmp/package.json electron/package.json - cat electron/package.json - - - name: Update app version base on tag - if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') && inputs.public_provider == 'github' - run: | - jq --arg version "${VERSION_TAG#v}" '.version = $version' electron/package.json > /tmp/package.json - mv /tmp/package.json electron/package.json - jq --arg version "${VERSION_TAG#v}" '.version = $version' web/package.json > /tmp/package.json - mv /tmp/package.json web/package.json - jq --arg teamid "${{ secrets.APPLE_TEAM_ID }}" '.build.mac.notarize.teamId = $teamid' electron/package.json > /tmp/package.json - mv /tmp/package.json electron/package.json - cat electron/package.json - env: - VERSION_TAG: ${{ inputs.new_version }} - - - name: Get Cer for code signing - run: base64 -d <<< "$CODE_SIGN_P12_BASE64" > /tmp/codesign.p12 - shell: bash - env: - CODE_SIGN_P12_BASE64: ${{ secrets.CODE_SIGN_P12_BASE64 }} - - - uses: apple-actions/import-codesign-certs@v2 - continue-on-error: true - with: - p12-file-base64: ${{ secrets.CODE_SIGN_P12_BASE64 }} - p12-password: ${{ secrets.CODE_SIGN_P12_PASSWORD }} - - - name: Build and publish app to aws s3 r2 or github artifactory - if: inputs.public_provider != 'github' - run: | - # check public_provider is true or not - echo "public_provider is ${{ inputs.public_provider }}" - if [ "${{ inputs.public_provider }}" == "none" ]; then - make build - else - make build-and-publish - fi - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - CSC_LINK: '/tmp/codesign.p12' - CSC_KEY_PASSWORD: ${{ secrets.CODE_SIGN_P12_PASSWORD }} - CSC_IDENTITY_AUTO_DISCOVERY: 'true' - APPLE_ID: ${{ secrets.APPLE_ID }} - APPLE_APP_SPECIFIC_PASSWORD: ${{ secrets.APPLE_APP_SPECIFIC_PASSWORD }} - APP_PATH: '.' - DEVELOPER_ID: ${{ secrets.DEVELOPER_ID }} - AWS_ACCESS_KEY_ID: ${{ secrets.DELTA_AWS_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.DELTA_AWS_SECRET_ACCESS_KEY }} - AWS_DEFAULT_REGION: auto - AWS_EC2_METADATA_DISABLED: 'true' - AWS_MAX_ATTEMPTS: '5' - POSTHOG_KEY: ${{ secrets.POSTHOG_KEY }} - POSTHOG_HOST: ${{ secrets.POSTHOG_HOST }} - CORTEX_API_PORT: ${{ inputs.cortex_api_port }} - - - name: Build and publish app to github - if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') && inputs.public_provider == 'github' && inputs.beta == false - run: | - make build-and-publish - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - CSC_LINK: '/tmp/codesign.p12' - CSC_KEY_PASSWORD: ${{ secrets.CODE_SIGN_P12_PASSWORD }} - CSC_IDENTITY_AUTO_DISCOVERY: 'true' - APPLE_ID: ${{ secrets.APPLE_ID }} - APPLE_APP_SPECIFIC_PASSWORD: ${{ secrets.APPLE_APP_SPECIFIC_PASSWORD }} - APP_PATH: '.' - DEVELOPER_ID: ${{ secrets.DEVELOPER_ID }} - POSTHOG_KEY: ${{ secrets.POSTHOG_KEY }} - POSTHOG_HOST: ${{ secrets.POSTHOG_HOST }} - - - name: Build and publish app to github - if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') && inputs.public_provider == 'github' && inputs.beta == true - run: | - make build-and-publish - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - CSC_LINK: '/tmp/codesign.p12' - CSC_KEY_PASSWORD: ${{ secrets.CODE_SIGN_P12_PASSWORD }} - CSC_IDENTITY_AUTO_DISCOVERY: 'true' - APPLE_ID: ${{ secrets.APPLE_ID }} - APPLE_APP_SPECIFIC_PASSWORD: ${{ secrets.APPLE_APP_SPECIFIC_PASSWORD }} - APP_PATH: '.' - DEVELOPER_ID: ${{ secrets.DEVELOPER_ID }} - AWS_ACCESS_KEY_ID: ${{ secrets.DELTA_AWS_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.DELTA_AWS_SECRET_ACCESS_KEY }} - AWS_DEFAULT_REGION: auto - AWS_EC2_METADATA_DISABLED: 'true' - AWS_MAX_ATTEMPTS: '5' - POSTHOG_KEY: ${{ secrets.POSTHOG_KEY }} - POSTHOG_HOST: ${{ secrets.POSTHOG_HOST }} - - - name: Upload Artifact - if: inputs.public_provider != 'github' - uses: actions/upload-artifact@v4 - with: - name: jan-electron-mac-universal-${{ inputs.new_version }} - path: ./electron/dist/*.dmg diff --git a/.github/workflows/template-electron-build-windows-x64.yml b/.github/workflows/template-electron-build-windows-x64.yml deleted file mode 100644 index 9f71dadb0..000000000 --- a/.github/workflows/template-electron-build-windows-x64.yml +++ /dev/null @@ -1,230 +0,0 @@ -name: build-windows-x64 -on: - workflow_call: - inputs: - ref: - required: true - type: string - default: 'refs/heads/main' - public_provider: - required: true - type: string - default: none - description: 'none: build only, github: build and publish to github, aws s3: build and publish to aws s3' - new_version: - required: true - type: string - default: '' - aws_s3_prefix: - required: false - type: string - default: '/latest/' - beta: - required: false - type: boolean - default: false - nightly: - required: false - type: boolean - default: false - cortex_api_port: - required: false - type: string - default: null - secrets: - DELTA_AWS_S3_BUCKET_NAME: - required: false - DELTA_AWS_ACCESS_KEY_ID: - required: false - DELTA_AWS_SECRET_ACCESS_KEY: - required: false - AZURE_KEY_VAULT_URI: - required: false - AZURE_CLIENT_ID: - required: false - AZURE_TENANT_ID: - required: false - AZURE_CLIENT_SECRET: - required: false - AZURE_CERT_NAME: - required: false - -jobs: - build-windows-x64: - if: inputs.public_provider == 'github' || inputs.public_provider == 'none' - runs-on: windows-latest - permissions: - contents: write - steps: - - name: Getting the repo - uses: actions/checkout@v3 - with: - ref: ${{ inputs.ref }} - - - name: Replace Icons for Beta Build - if: inputs.beta == true && inputs.nightly != true - shell: bash - run: | - rm -rf electron/icons/* - - cp electron/icons_dev/jan-beta-512x512.png electron/icons/512x512.png - cp electron/icons_dev/jan-beta.ico electron/icons/icon.ico - cp electron/icons_dev/jan-beta.png electron/icons/icon.png - cp electron/icons_dev/jan-beta-tray@2x.png electron/icons/icon-tray@2x.png - cp electron/icons_dev/jan-beta-tray.png electron/icons/icon-tray.png - - - name: Replace Icons for Nightly Build - if: inputs.nightly == true && inputs.beta != true - shell: bash - run: | - rm -rf electron/icons/* - - cp electron/icons_dev/jan-nightly-512x512.png electron/icons/512x512.png - cp electron/icons_dev/jan-nightly.ico electron/icons/icon.ico - cp electron/icons_dev/jan-nightly.png electron/icons/icon.png - cp electron/icons_dev/jan-nightly-tray@2x.png electron/icons/icon-tray@2x.png - cp electron/icons_dev/jan-nightly-tray.png electron/icons/icon-tray.png - - - name: Installing node - uses: actions/setup-node@v1 - with: - node-version: 20 - - - name: Install jq - uses: dcarbone/install-jq-action@v2.0.1 - - - name: Update app version base on tag - if: inputs.public_provider != 'github' - id: version_update - shell: bash - run: | - echo "Version: ${{ inputs.new_version }}" - # Update the version in electron/package.json - jq --arg version "${{ inputs.new_version }}" '.version = $version' electron/package.json > /tmp/package.json - mv /tmp/package.json electron/package.json - - jq --arg version "${{ inputs.new_version }}" '.version = $version' web/package.json > /tmp/package.json - mv /tmp/package.json web/package.json - - jq '.build.publish = [{"provider": "generic", "url": "https://delta.jan.ai/nightly", "channel": "latest"}, {"provider": "s3", "acl": null, "bucket": "${{ secrets.DELTA_AWS_S3_BUCKET_NAME }}", "region": "${{ secrets.DELTA_AWS_REGION}}", "path": "temp-nightly", "channel": "latest"}]' electron/package.json > /tmp/package.json - mv /tmp/package.json electron/package.json - - jq '.build.win.sign = "./sign.js"' electron/package.json > /tmp/package.json - mv /tmp/package.json electron/package.json - cat electron/package.json - - chmod +x .github/scripts/rename-app.sh - .github/scripts/rename-app.sh ./electron/package.json nightly - chmod +x .github/scripts/rename-workspace.sh - .github/scripts/rename-workspace.sh ./package.json nightly - chmod +x .github/scripts/rename-uninstaller.sh - .github/scripts/rename-uninstaller.sh nightly - echo "------------------------" - cat ./electron/package.json - echo "------------------------" - cat ./package.json - echo "------------------------" - - - name: Change App Name for beta version - if: inputs.beta == true - shell: bash - run: | - chmod +x .github/scripts/rename-app.sh - .github/scripts/rename-app.sh ./electron/package.json beta - chmod +x .github/scripts/rename-workspace.sh - .github/scripts/rename-workspace.sh ./package.json beta - chmod +x .github/scripts/rename-uninstaller.sh - .github/scripts/rename-uninstaller.sh beta - echo "------------------------" - cat ./electron/package.json - echo "------------------------" - cat ./package.json - echo "------------------------" - cat ./electron/scripts/uninstaller.nsh - jq '.build.publish = [{"provider": "generic", "url": "https://delta.jan.ai/beta", "channel": "beta"}, {"provider": "s3", "acl": null, "bucket": "${{ secrets.DELTA_AWS_S3_BUCKET_NAME }}", "region": "${{ secrets.DELTA_AWS_REGION}}", "path": "temp-beta", "channel": "beta"}]' electron/package.json > /tmp/package.json - mv /tmp/package.json electron/package.json - cat electron/package.json - - - name: Update app version base on tag - if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') && inputs.public_provider == 'github' - shell: bash - run: | - jq --arg version "${VERSION_TAG#v}" '.version = $version' electron/package.json > /tmp/package.json - mv /tmp/package.json electron/package.json - jq --arg version "${VERSION_TAG#v}" '.version = $version' web/package.json > /tmp/package.json - mv /tmp/package.json web/package.json - jq '.build.win.sign = "./sign.js"' electron/package.json > /tmp/package.json - mv /tmp/package.json electron/package.json - env: - VERSION_TAG: ${{ inputs.new_version }} - - - name: Install AzureSignTool - run: | - dotnet tool install --global AzureSignTool - - - name: Build and publish app to aws s3 r2 or github artifactory - shell: bash - if: inputs.public_provider != 'github' - run: | - # check public_provider is true or not - echo "public_provider is ${{ inputs.public_provider }}" - if [ "${{ inputs.public_provider }}" == "none" ]; then - make build - else - make build-and-publish - fi - env: - AZURE_KEY_VAULT_URI: ${{ secrets.AZURE_KEY_VAULT_URI }} - AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }} - AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }} - AZURE_CLIENT_SECRET: ${{ secrets.AZURE_CLIENT_SECRET }} - AZURE_CERT_NAME: homebrewltd - AWS_ACCESS_KEY_ID: ${{ secrets.DELTA_AWS_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.DELTA_AWS_SECRET_ACCESS_KEY }} - AWS_DEFAULT_REGION: auto - AWS_EC2_METADATA_DISABLED: 'true' - AWS_MAX_ATTEMPTS: '5' - POSTHOG_KEY: ${{ secrets.POSTHOG_KEY }} - POSTHOG_HOST: ${{ secrets.POSTHOG_HOST }} - CORTEX_API_PORT: ${{ inputs.cortex_api_port }} - - - name: Build app and publish app to github - if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') && inputs.public_provider == 'github' && inputs.beta == false - run: | - make build-and-publish - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - AZURE_KEY_VAULT_URI: ${{ secrets.AZURE_KEY_VAULT_URI }} - AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }} - AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }} - AZURE_CLIENT_SECRET: ${{ secrets.AZURE_CLIENT_SECRET }} - AZURE_CERT_NAME: homebrewltd - POSTHOG_KEY: ${{ secrets.POSTHOG_KEY }} - POSTHOG_HOST: ${{ secrets.POSTHOG_HOST }} - - - name: Build app and publish app to github - if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') && inputs.public_provider == 'github' && inputs.beta == true - run: | - make build-and-publish - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - AWS_ACCESS_KEY_ID: ${{ secrets.DELTA_AWS_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.DELTA_AWS_SECRET_ACCESS_KEY }} - AWS_DEFAULT_REGION: auto - AWS_EC2_METADATA_DISABLED: 'true' - AWS_MAX_ATTEMPTS: '5' - AZURE_KEY_VAULT_URI: ${{ secrets.AZURE_KEY_VAULT_URI }} - AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }} - AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }} - AZURE_CLIENT_SECRET: ${{ secrets.AZURE_CLIENT_SECRET }} - # AZURE_CERT_NAME: ${{ secrets.AZURE_CERT_NAME }} - AZURE_CERT_NAME: homebrewltd - POSTHOG_KEY: ${{ secrets.POSTHOG_KEY }} - POSTHOG_HOST: ${{ secrets.POSTHOG_HOST }} - - - name: Upload Artifact - if: inputs.public_provider != 'github' - uses: actions/upload-artifact@v4 - with: - name: jan-electron-win-x64-${{ inputs.new_version }} - path: ./electron/dist/*.exe \ No newline at end of file