* chore: upgrade marked-katex-extension (#3049) * fix: handle long word without space to avoid right panel disappears (#3048) * add time weighted retrieval (#2908) * add time weighted retrieval * add missing configuration for timeWeightedVectorStore * resolving conflict * add missing configuration for timeWeightedVectorStore * resolving conflict * fix linting issues * fix build failed due to requirement for useTimeWeightedRetriever in AssistantTool * update web packages complying the new structure --------- Co-authored-by: thu <thu@treehouse.finance> * fix: model dropdown search by configured model (#3047) * bump version (#3082) (#3083) Co-authored-by: Hoang Ha <64120343+hahuyhoang411@users.noreply.github.com> * Update cortex cpp nightly to version 0.4.18 (#3072) * Update cortex cpp nightly to version 0.4.17 * update linux downloadnitro * cortex 0.4.18 --------- Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> Co-authored-by: Van Pham <64197333+Van-QA@users.noreply.github.com> * chore: update download.ts (#3088) infomation -> information * chore: cortex version update (#3098) * fix: handle words without space (#3101) * fix: handle long thread title without space (#3107) * fix: handle long thread title without space, and make searchbar autofocus inside model dropdown * feat: enable right click to show setting on thread items (#3108) * chore: Bump-cortex-0.4.17 (#3111) * Update cortex cpp nightly to version 0.4.18 (#3114) * Update cortex cpp nightly to version 0.4.18 * cortex 0.4.19 --------- Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> Co-authored-by: Van Pham <64197333+Van-QA@users.noreply.github.com> * Chore: Add stop token for Gemma 2b (#3125) * add stop token * Bump version * fix: set specific version for terminate (#3126) Signed-off-by: James <namnh0122@gmail.com> * feat: add claude 3.5 sonnet (#3129) Signed-off-by: James <namnh0122@gmail.com> * feat: add options config spell check for chat input (#3131) * fixed grammar nits (#3132) * Update cortex cpp nightly to version 0.4.20 * fix: toggle button for expand log section on modal troubleshoot (#3130) * fix: add tooltip messages toolbar (#3138) * fix: handle error message when apikey is not setup (#3149) * fix: title thread not updated on input edit title (#3148) * merge dev * fix move jan folder * Update electron/preload.ts * refactor * Update electron/preload.ts * fix wrong param * use correct method * chore: fix lint --------- Signed-off-by: James <namnh0122@gmail.com> Co-authored-by: Faisal Amir <urmauur@gmail.com> Co-authored-by: Nathan <thu.nhuanh99@gmail.com> Co-authored-by: thu <thu@treehouse.finance> Co-authored-by: Van Pham <64197333+Van-QA@users.noreply.github.com> Co-authored-by: Hoang Ha <64120343+hahuyhoang411@users.noreply.github.com> Co-authored-by: jan-service-account <136811300+jan-service-account@users.noreply.github.com> Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> Co-authored-by: Ikko Eltociear Ashimine <eltociear@gmail.com> Co-authored-by: NamH <NamNh0122@gmail.com> Co-authored-by: Saurabh <saurabhrai1717@gmail.com> Co-authored-by: Louis <louis@jan.ai>
202 lines
7.0 KiB
TypeScript
202 lines
7.0 KiB
TypeScript
import { Fragment, useEffect, useState } from 'react'
|
|
|
|
import { Progress } from '@janhq/joi'
|
|
import { useClickOutside } from '@janhq/joi'
|
|
import { useAtom, useAtomValue } from 'jotai'
|
|
import {
|
|
MonitorIcon,
|
|
XIcon,
|
|
ChevronDown,
|
|
ChevronUp,
|
|
FolderOpenIcon,
|
|
} from 'lucide-react'
|
|
|
|
import { twMerge } from 'tailwind-merge'
|
|
|
|
import useGetSystemResources from '@/hooks/useGetSystemResources'
|
|
|
|
import { usePath } from '@/hooks/usePath'
|
|
|
|
import { toGibibytes } from '@/utils/converter'
|
|
|
|
import TableActiveModel from './TableActiveModel'
|
|
|
|
import { showSystemMonitorPanelAtom } from '@/helpers/atoms/App.atom'
|
|
import { reduceTransparentAtom } from '@/helpers/atoms/Setting.atom'
|
|
import {
|
|
cpuUsageAtom,
|
|
gpusAtom,
|
|
ramUtilitizedAtom,
|
|
totalRamAtom,
|
|
usedRamAtom,
|
|
} from '@/helpers/atoms/SystemBar.atom'
|
|
|
|
const SystemMonitor = () => {
|
|
const totalRam = useAtomValue(totalRamAtom)
|
|
const usedRam = useAtomValue(usedRamAtom)
|
|
const cpuUsage = useAtomValue(cpuUsageAtom)
|
|
const gpus = useAtomValue(gpusAtom)
|
|
const { onRevealInFinder } = usePath()
|
|
const [showFullScreen, setShowFullScreen] = useState(false)
|
|
const ramUtilitized = useAtomValue(ramUtilitizedAtom)
|
|
const [showSystemMonitorPanel, setShowSystemMonitorPanel] = useAtom(
|
|
showSystemMonitorPanelAtom
|
|
)
|
|
const [control, setControl] = useState<HTMLDivElement | null>(null)
|
|
const [elementExpand, setElementExpand] = useState<HTMLDivElement | null>(
|
|
null
|
|
)
|
|
const reduceTransparent = useAtomValue(reduceTransparentAtom)
|
|
|
|
const { watch, stopWatching } = useGetSystemResources()
|
|
useClickOutside(
|
|
() => {
|
|
setShowSystemMonitorPanel(false)
|
|
setShowFullScreen(false)
|
|
},
|
|
null,
|
|
[control, elementExpand]
|
|
)
|
|
|
|
useEffect(() => {
|
|
// Watch for resource update
|
|
watch()
|
|
|
|
return () => {
|
|
stopWatching()
|
|
}
|
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
}, [])
|
|
|
|
return (
|
|
<Fragment>
|
|
<div
|
|
ref={setControl}
|
|
className={twMerge(
|
|
'flex cursor-pointer items-center gap-x-1 rounded px-1 py-0.5 hover:bg-[hsla(var(--secondary-bg))]',
|
|
showSystemMonitorPanel && 'bg-[hsla(var(--secondary-bg))]'
|
|
)}
|
|
onClick={() => {
|
|
setShowSystemMonitorPanel(!showSystemMonitorPanel)
|
|
setShowFullScreen(false)
|
|
}}
|
|
>
|
|
<MonitorIcon size={12} className="text-[hsla(var(--text-primary))]" />
|
|
<span className="font-medium">System Monitor</span>
|
|
</div>
|
|
{showSystemMonitorPanel && (
|
|
<div
|
|
ref={setElementExpand}
|
|
className={twMerge(
|
|
'fixed bottom-9 left-[49px] z-50 flex w-[calc(100%-48px-8px)] flex-shrink-0 flex-col rounded-lg rounded-b-none border-t border-[hsla(var(--app-border))] bg-[hsla(var(--app-bg))]',
|
|
showFullScreen && 'h-[calc(100%-63px)]',
|
|
reduceTransparent && 'w-[calc(100%-48px)] rounded-none'
|
|
)}
|
|
>
|
|
<div className="flex h-8 flex-shrink-0 items-center justify-between border-b border-[hsla(var(--app-border))] px-4">
|
|
<h6 className="font-medium text-[hsla(var(--text-primary))]">
|
|
Running Models
|
|
</h6>
|
|
<div className="unset-drag flex cursor-pointer items-center gap-x-2">
|
|
<div
|
|
className="flex cursor-pointer items-center gap-x-1 rounded px-1 py-0.5 hover:bg-[hsla(var(--secondary-bg))]"
|
|
onClick={() => onRevealInFinder('Logs')}
|
|
>
|
|
<FolderOpenIcon size={12} /> App Log
|
|
</div>
|
|
{showFullScreen ? (
|
|
<ChevronDown
|
|
size={20}
|
|
className="text-[hsla(var(--text-secondary))]"
|
|
onClick={() => setShowFullScreen(!showFullScreen)}
|
|
/>
|
|
) : (
|
|
<ChevronUp
|
|
size={20}
|
|
className="text-[hsla(var(--text-secondary))]"
|
|
onClick={() => setShowFullScreen(!showFullScreen)}
|
|
/>
|
|
)}
|
|
<XIcon
|
|
size={16}
|
|
className="text-[hsla(var(--text-secondary))]"
|
|
onClick={() => {
|
|
setShowSystemMonitorPanel(false)
|
|
setShowFullScreen(false)
|
|
}}
|
|
/>
|
|
</div>
|
|
</div>
|
|
|
|
<div className="flex h-full gap-4">
|
|
<TableActiveModel />
|
|
|
|
<div className="w-1/2 border-l border-[hsla(var(--app-border))] p-4">
|
|
<div className="mb-4 border-b border-[hsla(var(--app-border))] pb-4">
|
|
<h6 className="font-bold">CPU</h6>
|
|
<div className="flex items-center gap-x-4">
|
|
<Progress value={cpuUsage} className="w-full" size="small" />
|
|
<span className="flex-shrink-0 ">{cpuUsage}%</span>
|
|
</div>
|
|
</div>
|
|
<div className="mb-4 border-b border-[hsla(var(--app-border))] pb-4">
|
|
<div className="flex items-center justify-between gap-2">
|
|
<h6 className="font-bold">Memory</h6>
|
|
<span>
|
|
{toGibibytes(usedRam, { hideUnit: true })}/
|
|
{toGibibytes(totalRam, { hideUnit: true })} GB
|
|
</span>
|
|
</div>
|
|
<div className="flex items-center gap-x-4">
|
|
<Progress
|
|
value={Math.round((usedRam / totalRam) * 100)}
|
|
className="w-full"
|
|
size="small"
|
|
/>
|
|
<span className="flex-shrink-0 ">{ramUtilitized}%</span>
|
|
</div>
|
|
</div>
|
|
|
|
{gpus.length > 0 && (
|
|
<div className="mb-4 border-b border-[hsla(var(--app-border))] pb-4 last:border-none">
|
|
{gpus.map((gpu, index) => (
|
|
<div key={index} className="mt-4 flex flex-col gap-x-2">
|
|
<div className="flex w-full items-start justify-between">
|
|
<span className="line-clamp-1 w-1/2 font-bold">
|
|
{gpu.name}
|
|
</span>
|
|
<div className="flex gap-x-2">
|
|
<div className="">
|
|
<span>
|
|
{gpu.memoryTotal - gpu.memoryFree}/
|
|
{gpu.memoryTotal}
|
|
</span>
|
|
<span> MB</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div className="flex items-center gap-x-4">
|
|
<Progress
|
|
value={gpu.utilization}
|
|
className="w-full"
|
|
size="small"
|
|
/>
|
|
<span className="flex-shrink-0 ">
|
|
{gpu.utilization}%
|
|
</span>
|
|
</div>
|
|
</div>
|
|
))}
|
|
</div>
|
|
)}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
)}
|
|
</Fragment>
|
|
)
|
|
}
|
|
|
|
export default SystemMonitor
|