* feat: integrating cortex * Temporary prevent crash Signed-off-by: James <namnh0122@gmail.com> * fix yarn lint Signed-off-by: James <namnh0122@gmail.com> * refactor: remove core node module - fs - extensions and so on (#3151) * add migration script for threads, messages and models Signed-off-by: James <namnh0122@gmail.com> * remove freq_penalty and presence_penalty if model not supported Signed-off-by: James <namnh0122@gmail.com> * add back models in my models Signed-off-by: James <namnh0122@gmail.com> * fix api-url for setup API key popup Signed-off-by: James <namnh0122@gmail.com> * fix using model name for dropdown model Signed-off-by: James <namnh0122@gmail.com> * fix can't click to hotkey Signed-off-by: James <namnh0122@gmail.com> * fix: disable some UIs Signed-off-by: James <namnh0122@gmail.com> * fix build Signed-off-by: James <namnh0122@gmail.com> * reduce calling HF api Signed-off-by: James <namnh0122@gmail.com> * some ui update Signed-off-by: James <namnh0122@gmail.com> * feat: modal migration UI (#3153) * feat: handle popup migration * chore: update loader * chore: integrate script migration * chore: cleanup import * chore: moving out spinner loader * chore: update check thread message success migrate * chore: add handle script into retry button * remove warning from joi Signed-off-by: James <namnh0122@gmail.com> * chore: fix duplicate children * fix: path after migrating model Signed-off-by: James <namnh0122@gmail.com> * chore: apply mutation for config * chore: prevent calling too many create assistant api Signed-off-by: James <namnh0122@gmail.com> * using cortexso Signed-off-by: James <namnh0122@gmail.com> * update download api Signed-off-by: James <namnh0122@gmail.com> * fix use on slider item Signed-off-by: James <namnh0122@gmail.com> * fix: ui no download model or simple onboarding (#3166) * fix download huggingface model match with slider item Signed-off-by: James <namnh0122@gmail.com> * update owner_logo to logo and author Signed-off-by: James <namnh0122@gmail.com> * update new cortexso Signed-off-by: James <namnh0122@gmail.com> * Add install python step for macos * add engine table Signed-off-by: James <namnh0122@gmail.com> * fix local icons Signed-off-by: James <namnh0122@gmail.com> * feat: add search feature for model hub Signed-off-by: James <namnh0122@gmail.com> * fix misalign switch Signed-off-by: James <namnh0122@gmail.com> * fix: delete thread not focus on other thread Signed-off-by: James <namnh0122@gmail.com> * add get model from hugging face Signed-off-by: James <namnh0122@gmail.com> * fix download from hugging face Signed-off-by: James <namnh0122@gmail.com> * small update Signed-off-by: James <namnh0122@gmail.com> * update Signed-off-by: James <namnh0122@gmail.com> * fix system monitor rounded only on the left Signed-off-by: James <namnh0122@gmail.com> * chore: update ui new hub screen (#3174) * chore: update ui new hub screen * chore: update layout centerpanel thread and hub screen * chore: update detail model by group * update cortexso 0.1.13 Signed-off-by: James <namnh0122@gmail.com> * chore: add file size Signed-off-by: James <namnh0122@gmail.com> * chore: put engine to experimental feature Signed-off-by: James <namnh0122@gmail.com> * chore: open cortex folder Signed-off-by: James <namnh0122@gmail.com> * chore: add back user avatar Signed-off-by: James <namnh0122@gmail.com> * chore: minor UI hub (#3182) * chore: add back right click thread list and update 3 dots are overlapping with the text * chore: update position dropdown list my models * chore: make on-device tab showing 6 items instead of 4 * chore: update style description modals detail model * chore: update isGeneration loader and author name on modal * feat: integrate cortex single executable Signed-off-by: James <namnh0122@gmail.com> * fix build Signed-off-by: James <namnh0122@gmail.com> * chore: added blank state * chore: update ui component blank state * bump cortex binary version * fix: logic show modal migration (#3165) * fix: logic show modal migration * chore: fixed logic * chore: read contain format gguf local models * chore: change return hasLocalModel * chore: intiial skipmigration state * chore: filter embedding model * fix: delete top thread not focus on any other thread * chore: added UI no result component search models group (#3188) * fix: remote model should show all when user config that engine Signed-off-by: James <namnh0122@gmail.com> * chore: set state thread and models migration using getOnInit (#3189) * chore: set state thread and models migration using getOnInit * chore: add state as dependecies hooks * chore: system monitor panel show engine model (#3192) * fix: remove config api, replace with engine Signed-off-by: James <namnh0122@gmail.com> * update Signed-off-by: James <namnh0122@gmail.com> * update reactquery Signed-off-by: James <namnh0122@gmail.com> * bump cortex 0.4.35 * feat: add waiting for cortex popup Signed-off-by: James <namnh0122@gmail.com> * chore: add loader detail model popup (#3195) * chore: model start loader (#3197) * chore: added model loader when user starting chat without model active * chore: update copies loader * fix: select min file size if recommended quant does not exist Signed-off-by: James <namnh0122@gmail.com> * chore: temporary hide gpu config * fix: tensorrt not shown Signed-off-by: James <namnh0122@gmail.com> * fix lint Signed-off-by: James <namnh0122@gmail.com> * fix tests Signed-off-by: James <namnh0122@gmail.com> * fix e2e tests (wip) Signed-off-by: James <namnh0122@gmail.com> * update Signed-off-by: James <namnh0122@gmail.com> * fix: adding element and correct test to adapt new UI * fix: temp skip unstable part * fix: only show models which can be supported Signed-off-by: James <namnh0122@gmail.com> * Update version.txt * update send message Signed-off-by: James <namnh0122@gmail.com> * fix: not allow user send message when is generating Signed-off-by: James <namnh0122@gmail.com> * chore: temp skip Playwright test due to env issue * chore: temp skip Playwright test due to env issue * update Signed-off-by: James <namnh0122@gmail.com> * chore: minor-ui-feedback (#3202) --------- Signed-off-by: James <namnh0122@gmail.com> Co-authored-by: Louis <louis@jan.ai> Co-authored-by: Faisal Amir <urmauur@gmail.com> Co-authored-by: Hien To <tominhhien97@gmail.com> Co-authored-by: Van Pham <64197333+Van-QA@users.noreply.github.com> Co-authored-by: Van-QA <van@jan.ai>
239 lines
9.3 KiB
TypeScript
239 lines
9.3 KiB
TypeScript
// /* eslint-disable @typescript-eslint/no-explicit-any */
|
|
// import React, { useState, useEffect, useRef } from 'react'
|
|
|
|
// import { LlmEngine } from '@janhq/core'
|
|
// import { Button, ScrollArea, Badge, Input } from '@janhq/joi'
|
|
// import { SearchIcon } from 'lucide-react'
|
|
|
|
// import Loader from '@/containers/Loader'
|
|
|
|
// import { formatExtensionsName } from '@/utils/converter'
|
|
|
|
// import { markdownParser } from '@/utils/markdown-parser'
|
|
|
|
// import { extensionManager } from '@/extension'
|
|
// import Extension from '@/extension/Extension'
|
|
|
|
// type EngineExtension = {
|
|
// provider: LlmEngine
|
|
// } & Extension
|
|
|
|
// const ExtensionCatalog = () => {
|
|
// const [coreActiveExtensions, setCoreActiveExtensions] = useState<Extension[]>(
|
|
// []
|
|
// )
|
|
// const [engineActiveExtensions, setEngineActiveExtensions] = useState<
|
|
// EngineExtension[]
|
|
// >([])
|
|
// const [searchText, setSearchText] = useState('')
|
|
// const [showLoading, setShowLoading] = useState(false)
|
|
// const fileInputRef = useRef<HTMLInputElement | null>(null)
|
|
|
|
// useEffect(() => {
|
|
// const getAllSettings = async () => {
|
|
// const extensionsMenu = []
|
|
// const engineMenu = []
|
|
// const extensions = extensionManager.getAll()
|
|
|
|
// for (const extension of extensions) {
|
|
// const settings = await extension.getSettings()
|
|
// if (
|
|
// typeof extension.getSettings === 'function' &&
|
|
// 'provider' in extension &&
|
|
// typeof extension.provider === 'string'
|
|
// ) {
|
|
// if (
|
|
// (settings && settings.length > 0) ||
|
|
// (await extension.installationState()) !== 'NotRequired'
|
|
// ) {
|
|
// engineMenu.push({
|
|
// ...extension,
|
|
// provider:
|
|
// 'provider' in extension &&
|
|
// typeof extension.provider === 'string'
|
|
// ? extension.provider
|
|
// : '',
|
|
// })
|
|
// }
|
|
// } else {
|
|
// extensionsMenu.push({
|
|
// ...extension,
|
|
// })
|
|
// }
|
|
// }
|
|
|
|
// setCoreActiveExtensions(extensionsMenu)
|
|
// setEngineActiveExtensions(engineMenu as any)
|
|
// }
|
|
// getAllSettings()
|
|
// }, [])
|
|
|
|
// /**
|
|
// * Installs a extension by calling the `extensions.install` function with the extension file path.
|
|
// * If the installation is successful, the application is relaunched using the `coreAPI.relaunch` function.
|
|
// * @param e - The event object.
|
|
// */
|
|
// const install = async (e: any) => {
|
|
// e.preventDefault()
|
|
// const extensionFile = e.target.files?.[0].path
|
|
|
|
// // Send the filename of the to be installed extension
|
|
// // to the main process for installation
|
|
// const installed = await extensionManager.install([extensionFile])
|
|
// if (installed) window.core?.api?.relaunch()
|
|
// }
|
|
|
|
// /**
|
|
// * Uninstalls a extension by calling the `extensions.uninstall` function with the extension name.
|
|
// * If the uninstallation is successful, the application is relaunched using the `coreAPI.relaunch` function.
|
|
// * @param name - The name of the extension to uninstall.
|
|
// */
|
|
// // eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
// const uninstall = async (name: string) => {
|
|
// // Send the filename of the to be uninstalled extension
|
|
// // to the main process for removal
|
|
// const res = await extensionManager.uninstall([name])
|
|
// if (res) window.core?.api?.relaunch()
|
|
// }
|
|
|
|
// /**
|
|
// * Handles the change event of the extension file input element by setting the file name state.
|
|
// * Its to be used to display the extension file name of the selected file.
|
|
// * @param event - The change event object.
|
|
// */
|
|
// const handleFileChange = (event: React.ChangeEvent<HTMLInputElement>) => {
|
|
// const file = event.target.files?.[0]
|
|
// if (file) {
|
|
// setShowLoading(true)
|
|
// install(event)
|
|
// }
|
|
// }
|
|
|
|
// return (
|
|
// <>
|
|
// <ScrollArea className="h-full w-full">
|
|
// <div className="flex w-full flex-col items-start justify-between gap-y-2 p-4 sm:flex-row">
|
|
// <div className="w-full sm:w-[300px]">
|
|
// <Input
|
|
// prefixIcon={<SearchIcon size={16} />}
|
|
// placeholder="Search"
|
|
// onChange={(e) => setSearchText(e.target.value)}
|
|
// />
|
|
// </div>
|
|
// <div>
|
|
// <input
|
|
// type="file"
|
|
// hidden
|
|
// ref={fileInputRef}
|
|
// onChange={handleFileChange}
|
|
// />
|
|
// <Button onClick={() => fileInputRef.current?.click()}>
|
|
// Install Extension
|
|
// </Button>
|
|
// </div>
|
|
// </div>
|
|
|
|
// <div className="block w-full px-4">
|
|
// {engineActiveExtensions.length !== 0 && (
|
|
// <div className="mb-3 mt-4 border-b border-[hsla(var(--app-border))] pb-4">
|
|
// <h6 className="text-base font-semibold text-[hsla(var(--text-primary))]">
|
|
// Model Providers
|
|
// </h6>
|
|
// </div>
|
|
// )}
|
|
// {engineActiveExtensions
|
|
// .filter((x) => x.name.includes(searchText.toLowerCase().trim()))
|
|
// .sort((a, b) => a.provider.localeCompare(b.provider))
|
|
// .map((item, i) => {
|
|
// return (
|
|
// <div
|
|
// key={i}
|
|
// className="flex w-full flex-col items-start justify-between py-3 sm:flex-row"
|
|
// >
|
|
// <div className="w-full flex-shrink-0 space-y-1.5">
|
|
// <div className="flex items-center justify-between gap-x-2">
|
|
// <div className="flex items-center gap-x-2">
|
|
// <h6 className="line-clamp-1 font-semibold">
|
|
// {item.productName?.replace('Inference Engine', '') ??
|
|
// formatExtensionsName(item.name)}
|
|
// </h6>
|
|
// <Badge variant="outline" theme="secondary">
|
|
// v{item.version}
|
|
// </Badge>
|
|
// <p>{item.provider}</p>
|
|
// </div>
|
|
// <div className="flex items-center gap-x-2">
|
|
// {/* {!inActiveEngineProvider.includes(item.provider) && (
|
|
// <SetupRemoteModel engine={item.provider} />
|
|
// )} */}
|
|
// {/* <Switch
|
|
// checked={
|
|
// !inActiveEngineProvider.includes(item.provider)
|
|
// }
|
|
// onChange={() => onSwitchChange(item.provider)}
|
|
// /> */}
|
|
// </div>
|
|
// </div>
|
|
// {
|
|
// <div
|
|
// className="w-full font-medium leading-relaxed text-[hsla(var(--text-secondary))] sm:w-4/5"
|
|
// dangerouslySetInnerHTML={{
|
|
// __html: markdownParser.parse(item.description ?? '', {
|
|
// async: false,
|
|
// }),
|
|
// }}
|
|
// />
|
|
// }
|
|
// </div>
|
|
// </div>
|
|
// )
|
|
// })}
|
|
|
|
// // {coreActiveExtensions.length > 0 && (
|
|
// // <div className="mb-3 mt-8 border-b border-[hsla(var(--app-border))] pb-4">
|
|
// // <h6 className="text-base font-semibold text-[hsla(var(--text-primary))]">
|
|
// // Core Extention
|
|
// // </h6>
|
|
// // </div>
|
|
// // )}
|
|
// // {coreActiveExtensions
|
|
// // .filter((x) => x.name.includes(searchText.toLowerCase().trim()))
|
|
// // .sort((a, b) => a.name.localeCompare(b.name))
|
|
// // .map((item, i) => {
|
|
// // return (
|
|
// // <div
|
|
// // key={i}
|
|
// // className="flex w-full flex-col items-start justify-between py-3 sm:flex-row"
|
|
// // >
|
|
// // <div className="w-full flex-shrink-0 space-y-1.5">
|
|
// // <div className="flex items-center gap-x-2">
|
|
// // <h6 className="line-clamp-1 font-semibold">
|
|
// // {item.productName ?? formatExtensionsName(item.name)}
|
|
// // </h6>
|
|
// // <Badge variant="outline" theme="secondary">
|
|
// // v{item.version}
|
|
// // </Badge>
|
|
// // </div>
|
|
// // {
|
|
// // <div
|
|
// // className="font-medium leading-relaxed text-[hsla(var(--text-secondary))]"
|
|
// // dangerouslySetInnerHTML={{
|
|
// // __html: markdownParser.parse(item.description ?? '', {
|
|
// // async: false,
|
|
// // }),
|
|
// // }}
|
|
// // />
|
|
// // }
|
|
// // </div>
|
|
// // </div>
|
|
// // )
|
|
// // })}
|
|
// // </div>
|
|
// // </ScrollArea>
|
|
// // {showLoading && <Loader description="Installing..." />}
|
|
// // </>
|
|
// // )
|
|
// // }
|
|
|
|
// // export default ExtensionCatalog
|