vansangpfiev 8fefe6e167
chore: tauri codesign and CI/CD (#4961)
* chore: build tauri

* chore: codesign tauri app

* chore: test update from electron to tauri

* chore: test update from electron to tauri

* chore: update csp config and cors

* chore: nightly to 1317

* fix: correct pre_install_path

* chore: jan-nightly to 1320

* chore: self sign tauri

* chore: CI/CD for Windows, Linux

commit 4897b2bcf7f044080fce81bd725515e62fc4eb29
Author: vansangpfiev <vansangpfiev@gmail.com>
Date:   Fri Apr 25 15:32:37 2025 +0700

    chore: cleanup tauri config

commit 66c5676ec146b25c89cccb570ede7c070dbc5853
Author: vansangpfiev <vansangpfiev@gmail.com>
Date:   Fri Apr 25 14:37:04 2025 +0700

    fix: store path

commit bc6560c576873e55f84c4b21764bedbdd9dbd5a8
Author: vansangpfiev <vansangpfiev@gmail.com>
Date:   Thu Apr 24 09:39:50 2025 +0700

    chore: Linux CI

commit b036275dc9f1df7614aaca3b358b9c6493082512
Author: vansangpfiev <vansangpfiev@gmail.com>
Date:   Wed Apr 23 16:41:22 2025 +0700

    chore: updater windows

commit e91b543dbdd82bd4a44db7550ffb993897b56081
Merge: dea80a83 4a54a378
Author: vansangpfiev <vansangpfiev@gmail.com>
Date:   Wed Apr 23 16:39:24 2025 +0700

    Merge branch 'chore/tauri-cicd' of https://github.com/menloresearch/jan into chore/tauri-cicd-windows

commit dea80a83966113b108137c385a3c28920d2adda4
Author: Minh141120 <minh.itptit@gmail.com>
Date:   Wed Apr 23 11:47:04 2025 +0700

    chore: update azuresigntool install method

commit 2ec2234082be57e53887192153fa982a134ea535
Author: Minh141120 <minh.itptit@gmail.com>
Date:   Wed Apr 23 11:01:31 2025 +0700

    chore: add verbose option build tauri and targets app and dmg for macos build

commit 42c7592cc89641130545551d4d864268cde3d5b0
Author: Minh141120 <minh.itptit@gmail.com>
Date:   Wed Apr 23 10:35:27 2025 +0700

    chore: update targets build

commit 4c8ba44ff60cdef8b639fa189f5729dc69c5aff6
Author: Minh141120 <minh.itptit@gmail.com>
Date:   Wed Apr 23 09:53:21 2025 +0700

    refactor: remove debug step and upload electron build artifact

commit 158c08b465e18823e0f2b9a30fd5ecd589d08934
Author: Minh141120 <minh.itptit@gmail.com>
Date:   Wed Apr 23 09:21:08 2025 +0700

    chore: add script codesign on windows

commit 4545b2bcd852029472298e530176494992dd0950
Author: vansangpfiev <vansangpfiev@gmail.com>
Date:   Tue Apr 22 13:39:49 2025 +0700

    chore: update csp setting

commit f64a1e1ca958e3c1c685485a06d45956ddcf14a0
Author: Minh141120 <minh.itptit@gmail.com>
Date:   Tue Apr 22 10:15:14 2025 +0700

    chore: update azuresigntool installation

commit 1f4b9d18b332d5205685a6fe68f5dfaf973d273c
Author: Minh141120 <minh.itptit@gmail.com>
Date:   Tue Apr 22 09:49:42 2025 +0700

    chore: update signcommand

commit 911a3ab3540f872f6fe906c8e2135440d39f108c
Author: Minh141120 <minh.itptit@gmail.com>
Date:   Mon Apr 21 19:19:23 2025 +0700

    chore: update codesign tauri windows

commit fba15c4c2de43b4cb87308ef998cdd8dc88b1ce6
Author: Minh141120 <minh.itptit@gmail.com>
Date:   Mon Apr 21 19:04:29 2025 +0700

    chore: update path azuresigntool

commit 8b8c950b56f5aa42baf76aba064fc99b50758150
Author: Minh141120 <minh.itptit@gmail.com>
Date:   Mon Apr 21 18:38:56 2025 +0700

    chore: update azuresigntool path

commit bd67a2b7908b5f3a126c634a840e0b941373a3c6
Author: Minh141120 <minh.itptit@gmail.com>
Date:   Mon Apr 21 17:47:33 2025 +0700

    chore: update azuresigntool url

commit f70effca7c09cd2fe9b5866b4f194b64a13294b9
Author: Minh141120 <minh.itptit@gmail.com>
Date:   Mon Apr 21 17:33:32 2025 +0700

    chore: update azuretoolsign download

commit 667910772f30369b9afa554ad06e4378f93d0b1a
Author: Minh141120 <minh.itptit@gmail.com>
Date:   Mon Apr 21 16:56:25 2025 +0700

    chore: update path azuresigntool

commit f1610bfd80dfa996db4a777bb58475f2e6d02cc6
Author: Minh141120 <minh.itptit@gmail.com>
Date:   Mon Apr 21 16:52:36 2025 +0700

    chore: update azuresigntool path

commit 0873d56fb88fb66c884eff31d3f63aa99858f038
Author: Minh141120 <minh.itptit@gmail.com>
Date:   Mon Apr 21 16:19:46 2025 +0700

    chore: add debug step

commit 88e0b1a697ed478375429686eb1c03ae71a3b447
Author: Minh141120 <minh.itptit@gmail.com>
Date:   Mon Apr 21 15:58:39 2025 +0700

    ci(windows): download AzureSignTool to src-tauri for Tauri code signing

commit 47f94e86589826c3941a3d602298f188d6480980
Author: Minh141120 <minh.itptit@gmail.com>
Date:   Mon Apr 21 15:21:20 2025 +0700

    fix: AzureSignTool signcommand Path

commit dc014a7905fd0b49b5972e24b4d5773c5dc29ea5
Author: Minh141120 <minh.itptit@gmail.com>
Date:   Mon Apr 21 15:00:02 2025 +0700

    chore: add debug step azuresigntool tauri windows

commit ee7b6163a8419604dfba7dc2f967026be4884da4
Author: Minh141120 <minh.itptit@gmail.com>
Date:   Mon Apr 21 14:33:33 2025 +0700

    chore: tauri windows codesign

commit 6607090857120531d8a096f45ff556c3f2553e53
Author: vansangpfiev <vansangpfiev@gmail.com>
Date:   Thu Apr 17 10:29:50 2025 +0700

    chore: add windows download script

commit 4b1a5cc29c77eecca75978a1ab3126d2c710e738
Author: Nguyen Ngoc Minh <kuuhakuu@Nguyens-MacBook-Air.local>
Date:   Mon Apr 21 13:44:34 2025 +0700

    chore: tauri codesign windows

* chore: workflows for tauri

* chore: test tauri manual build

* chore: hide windows install detail

* chore: upload artifacts

* feat: run mcp with bundled bun and uv

* chore: clean up

* chore: update cicd

* chore: remove deprecated workflows

* chore: update allowed origins

* chore: pull binaries windows, linux (#4963)

* fix: get bun and uv from execution path

* fix: macos

* fix: typo

* fix: remove old Jan binaries on windows

* chore: build bun and uv universal

* fix: appimage bundle bun issue

* chore: libfuse2 for linux CI

* feat: tauri cicd preview (#4975)

* feat: tauri cicd preview

* chore: add suffix preview for tauri build

* chore: update condition for s3 upload nightly channel

* chore: add debug step for tauri macos preview

* chore: update aws s3 macos tauri build

* refactor: remove debug code

* chore: update artifact name tauri macos build

* chore: add tauri build step for electron beta and stable

* chore: update preview

* chore: bump llama.cpp engine to b5351

* chore: bump engine version

* fix: cors windows

---------

Co-authored-by: vansangpfiev <sang@jan.ai>
Co-authored-by: Service Account <service@jan.ai>
Co-authored-by: Louis <louis@jan.ai>
Co-authored-by: hiento09 <tominhhien97@gmail.com>
Co-authored-by: Nguyen Ngoc Minh <91668012+Minh141120@users.noreply.github.com>
2025-05-15 17:11:19 +07:00

233 lines
9.4 KiB
TypeScript

import Image from 'next/image'
import { ModelSource } from '@janhq/core'
import { Badge, Button, ScrollArea } from '@janhq/joi'
import { useAtomValue, useSetAtom } from 'jotai'
import {
ArrowLeftIcon,
DownloadIcon,
FileJson,
SettingsIcon,
} from 'lucide-react'
import ModelDownloadButton from '@/containers/ModelDownloadButton'
import ModelLabel from '@/containers/ModelLabel'
import { MainViewState } from '@/constants/screens'
import { MarkdownTextMessage } from '@/screens/Thread/ThreadCenterPanel/TextMessage/MarkdownTextMessage'
import { toGigabytes } from '@/utils/converter'
import { extractModelName, removeYamlFrontMatter } from '@/utils/modelSource'
import RemoteModelRefresh from './RemoteModelRefresh'
import { mainViewStateAtom } from '@/helpers/atoms/App.atom'
import {
selectedSettingAtom,
showScrollBarAtom,
} from '@/helpers/atoms/Setting.atom'
type Props = {
model: ModelSource
onGoBack: () => void
}
const ModelPage = ({ model, onGoBack }: Props) => {
const setSelectedSetting = useSetAtom(selectedSettingAtom)
const setMainViewState = useSetAtom(mainViewStateAtom)
const showScrollBar = useAtomValue(showScrollBarAtom)
return (
<ScrollArea
type={showScrollBar ? 'always' : 'scroll'}
data-testid="hub-container-test-id"
className="h-full w-full"
>
<div className="flex h-full w-full justify-center">
<div className="flex w-full max-w-[800px] flex-col ">
<div className="sticky top-0 z-10 flex h-12 items-center bg-[hsla(var(--app-bg))] px-4">
<div className="flex items-center gap-2">
<button
onClick={onGoBack}
className="flex items-center gap-1 text-sm text-[hsla(var(--text-secondary))] hover:text-[hsla(var(--text-primary))]"
>
<ArrowLeftIcon size={16} />
<span>Back</span>
</button>
</div>
</div>
<div className="p-4">
{/* Header */}
<div className="flex items-center justify-between py-2">
<span className="line-clamp-1 text-base font-medium capitalize group-hover:text-blue-500 group-hover:underline">
{model.type !== 'cloud'
? extractModelName(model.metadata.id)
: model.metadata.id}
</span>
<div className="inline-flex items-center space-x-2">
{model.type === 'cloud' && (
<>
{!model.metadata?.apiKey?.length ? (
<Button
onClick={() => {
setSelectedSetting(model.id)
setMainViewState(MainViewState.Settings)
}}
>
Set Up
</Button>
) : (
<Button
theme="ghost"
variant="outline"
className="w-8 p-0"
onClick={() => {
setSelectedSetting(model.id)
setMainViewState(MainViewState.Settings)
}}
>
<SettingsIcon
size={18}
className="text-[hsla(var(--text-secondary))]"
/>
</Button>
)}
</>
)}
</div>
</div>
<div className="mb-6 flex flex-row divide-x">
{(model?.author ?? model?.metadata?.author) && (
<p
className="font-regular mt-3 line-clamp-1 flex flex-row pr-4 capitalize text-[hsla(var(--text-secondary))]"
title={model?.author ?? model?.metadata?.author}
>
{model.id?.includes('huggingface.co') && (
<>
<Image
src={'icons/huggingFace.svg'}
width={16}
height={16}
className="mr-2"
alt=""
/>{' '}
</>
)}
{model?.author ?? model?.metadata?.author}
</p>
)}
{model.models?.length > 0 && (
<p className="font-regular mt-3 line-clamp-1 flex flex-row items-center pl-4 pr-4 text-[hsla(var(--text-secondary))] first:pl-0">
<FileJson size={16} className="mr-2" />
{model.models?.length}{' '}
{model.type === 'cloud' ? 'models' : 'versions'}
</p>
)}
{model.metadata?.downloads > 0 && (
<p className="font-regular mt-3 line-clamp-1 flex flex-row items-center px-4 text-[hsla(var(--text-secondary))]">
<DownloadIcon size={16} className="mr-2" />
{model.metadata?.downloads}
</p>
)}
</div>
{/* Table of versions */}
<div className="mt-8 flex w-full flex-col items-start justify-between sm:flex-row">
<div className="w-full flex-shrink-0 overflow-x-auto rounded-lg border border-[hsla(var(--app-border))] text-[hsla(var(--text-secondary))]">
<table className="w-full table-auto p-4">
<thead className="bg-[hsla(var(--tertiary-bg))]">
<tr>
<th className="flex flex-1 flex-row items-center justify-between px-6 py-3 text-left text-sm font-semibold">
{model.type !== 'cloud' ? 'Version' : 'Models'}
</th>
{model.type !== 'cloud' && (
<>
<th></th>
<th className="max-w-32 hidden px-6 py-3 text-left text-sm font-semibold sm:table-cell">
Format
</th>
<th className="max-w-32 hidden px-6 py-3 text-left text-sm font-semibold sm:table-cell">
Size
</th>
</>
)}
<th className="w-[120px]">
{model.type === 'cloud' && (
<RemoteModelRefresh engine={model.id} />
)}
</th>
</tr>
</thead>
<tbody>
{model.models?.map((item, i) => {
return (
<tr
key={item.id}
className="border-t border-[hsla(var(--app-border))] font-medium text-[hsla(var(--text-secondary))]"
>
<td className="flex items-center space-x-4 px-6 py-4">
<span className="line-clamp-1">
{model.type === 'cloud'
? item.id
: item.id?.split(':')?.pop()}
</span>
{i === 0 && model.type !== 'cloud' && (
<Badge
theme="secondary"
className="inline-flex w-[60px] items-center font-medium"
>
<span>Default</span>
</Badge>
)}
</td>
{model.type !== 'cloud' && (
<>
<td>
<ModelLabel size={item.size} compact />
</td>
<td className="hidden px-6 py-4 sm:table-cell">
GGUF
</td>
<td className="hidden px-6 py-4 text-[hsla(var(--text-secondary))] sm:table-cell">
{toGigabytes(item.size)}
</td>
</>
)}
<td className="pr-4 text-right">
{(model.type !== 'cloud' ||
(model.metadata?.apiKey?.length ?? 0) > 0) && (
<ModelDownloadButton
id={item.id}
theme={i === 0 ? 'primary' : 'ghost'}
className={
i !== 0
? '!bg-[hsla(var(--secondary-bg))]'
: ''
}
/>
)}
</td>
</tr>
)
})}
</tbody>
</table>
</div>
</div>
{/* README */}
<div className="mt-8 flex w-full flex-col items-start justify-between sm:flex-row">
<MarkdownTextMessage
text={removeYamlFrontMatter(model.metadata?.description ?? '')}
className="h-full w-full text-[hsla(var(--text-secondary))]"
/>
</div>
</div>
</div>
</div>
</ScrollArea>
)
}
export default ModelPage