Merge branch 'dev' into docs-pena-team
This commit is contained in:
commit
532abd0d1e
@ -78,6 +78,10 @@ jobs:
|
|||||||
|
|
||||||
jq '.build.publish = [{"provider": "generic", "url": "${{ secrets.CLOUDFLARE_R2_PUBLIC_URL }}", "channel": "latest"}, {"provider": "s3", "bucket": "${{ secrets.CLOUDFLARE_R2_BUCKET_NAME }}", "region": "auto", "endpoint": "https://${{ secrets.CLOUDFLARE_ACCOUNT_ID }}.r2.cloudflarestorage.com", "path": "${{ inputs.cloudflare_r2_path }}", "channel": "latest"}]' electron/package.json > /tmp/package.json
|
jq '.build.publish = [{"provider": "generic", "url": "${{ secrets.CLOUDFLARE_R2_PUBLIC_URL }}", "channel": "latest"}, {"provider": "s3", "bucket": "${{ secrets.CLOUDFLARE_R2_BUCKET_NAME }}", "region": "auto", "endpoint": "https://${{ secrets.CLOUDFLARE_ACCOUNT_ID }}.r2.cloudflarestorage.com", "path": "${{ inputs.cloudflare_r2_path }}", "channel": "latest"}]' electron/package.json > /tmp/package.json
|
||||||
mv /tmp/package.json electron/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
|
cat electron/package.json
|
||||||
|
|
||||||
- name: Update app version base on tag
|
- name: Update app version base on tag
|
||||||
@ -91,6 +95,9 @@ jobs:
|
|||||||
mv /tmp/package.json electron/package.json
|
mv /tmp/package.json electron/package.json
|
||||||
jq --arg version "${VERSION_TAG#v}" '.version = $version' web/package.json > /tmp/package.json
|
jq --arg version "${VERSION_TAG#v}" '.version = $version' web/package.json > /tmp/package.json
|
||||||
mv /tmp/package.json web/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:
|
env:
|
||||||
VERSION_TAG: ${{ inputs.new_version }}
|
VERSION_TAG: ${{ inputs.new_version }}
|
||||||
|
|
||||||
|
|||||||
@ -72,6 +72,10 @@ jobs:
|
|||||||
|
|
||||||
jq '.build.publish = [{"provider": "generic", "url": "${{ secrets.CLOUDFLARE_R2_PUBLIC_URL }}", "channel": "latest"}, {"provider": "s3", "bucket": "${{ secrets.CLOUDFLARE_R2_BUCKET_NAME }}", "region": "auto", "endpoint": "https://${{ secrets.CLOUDFLARE_ACCOUNT_ID }}.r2.cloudflarestorage.com", "path": "${{ inputs.cloudflare_r2_path }}", "channel": "latest"}]' electron/package.json > /tmp/package.json
|
jq '.build.publish = [{"provider": "generic", "url": "${{ secrets.CLOUDFLARE_R2_PUBLIC_URL }}", "channel": "latest"}, {"provider": "s3", "bucket": "${{ secrets.CLOUDFLARE_R2_BUCKET_NAME }}", "region": "auto", "endpoint": "https://${{ secrets.CLOUDFLARE_ACCOUNT_ID }}.r2.cloudflarestorage.com", "path": "${{ inputs.cloudflare_r2_path }}", "channel": "latest"}]' electron/package.json > /tmp/package.json
|
||||||
mv /tmp/package.json electron/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
|
cat electron/package.json
|
||||||
|
|
||||||
- name: Update app version base on tag
|
- name: Update app version base on tag
|
||||||
@ -85,6 +89,9 @@ jobs:
|
|||||||
mv /tmp/package.json electron/package.json
|
mv /tmp/package.json electron/package.json
|
||||||
jq --arg version "${VERSION_TAG#v}" '.version = $version' web/package.json > /tmp/package.json
|
jq --arg version "${VERSION_TAG#v}" '.version = $version' web/package.json > /tmp/package.json
|
||||||
mv /tmp/package.json web/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:
|
env:
|
||||||
VERSION_TAG: ${{ inputs.new_version }}
|
VERSION_TAG: ${{ inputs.new_version }}
|
||||||
|
|
||||||
|
|||||||
10
README.md
10
README.md
@ -76,31 +76,31 @@ Jan is an open-source ChatGPT alternative that runs 100% offline on your compute
|
|||||||
<tr style="text-align:center">
|
<tr style="text-align:center">
|
||||||
<td style="text-align:center"><b>Experimental (Nightly Build)</b></td>
|
<td style="text-align:center"><b>Experimental (Nightly Build)</b></td>
|
||||||
<td style="text-align:center">
|
<td style="text-align:center">
|
||||||
<a href='https://delta.jan.ai/latest/jan-win-x64-0.4.7-300.exe'>
|
<a href='https://delta.jan.ai/latest/jan-win-x64-0.4.7-304.exe'>
|
||||||
<img src='./docs/static/img/windows.png' style="height:14px; width: 14px" />
|
<img src='./docs/static/img/windows.png' style="height:14px; width: 14px" />
|
||||||
<b>jan.exe</b>
|
<b>jan.exe</b>
|
||||||
</a>
|
</a>
|
||||||
</td>
|
</td>
|
||||||
<td style="text-align:center">
|
<td style="text-align:center">
|
||||||
<a href='https://delta.jan.ai/latest/jan-mac-x64-0.4.7-300.dmg'>
|
<a href='https://delta.jan.ai/latest/jan-mac-x64-0.4.7-304.dmg'>
|
||||||
<img src='./docs/static/img/mac.png' style="height:15px; width: 15px" />
|
<img src='./docs/static/img/mac.png' style="height:15px; width: 15px" />
|
||||||
<b>Intel</b>
|
<b>Intel</b>
|
||||||
</a>
|
</a>
|
||||||
</td>
|
</td>
|
||||||
<td style="text-align:center">
|
<td style="text-align:center">
|
||||||
<a href='https://delta.jan.ai/latest/jan-mac-arm64-0.4.7-300.dmg'>
|
<a href='https://delta.jan.ai/latest/jan-mac-arm64-0.4.7-304.dmg'>
|
||||||
<img src='./docs/static/img/mac.png' style="height:15px; width: 15px" />
|
<img src='./docs/static/img/mac.png' style="height:15px; width: 15px" />
|
||||||
<b>M1/M2</b>
|
<b>M1/M2</b>
|
||||||
</a>
|
</a>
|
||||||
</td>
|
</td>
|
||||||
<td style="text-align:center">
|
<td style="text-align:center">
|
||||||
<a href='https://delta.jan.ai/latest/jan-linux-amd64-0.4.7-300.deb'>
|
<a href='https://delta.jan.ai/latest/jan-linux-amd64-0.4.7-304.deb'>
|
||||||
<img src='./docs/static/img/linux.png' style="height:14px; width: 14px" />
|
<img src='./docs/static/img/linux.png' style="height:14px; width: 14px" />
|
||||||
<b>jan.deb</b>
|
<b>jan.deb</b>
|
||||||
</a>
|
</a>
|
||||||
</td>
|
</td>
|
||||||
<td style="text-align:center">
|
<td style="text-align:center">
|
||||||
<a href='https://delta.jan.ai/latest/jan-linux-x86_64-0.4.7-300.AppImage'>
|
<a href='https://delta.jan.ai/latest/jan-linux-x86_64-0.4.7-304.AppImage'>
|
||||||
<img src='./docs/static/img/linux.png' style="height:14px; width: 14px" />
|
<img src='./docs/static/img/linux.png' style="height:14px; width: 14px" />
|
||||||
<b>jan.AppImage</b>
|
<b>jan.AppImage</b>
|
||||||
</a>
|
</a>
|
||||||
|
|||||||
@ -123,7 +123,7 @@ const config = {
|
|||||||
docs: {
|
docs: {
|
||||||
routeBasePath: "/",
|
routeBasePath: "/",
|
||||||
sidebarPath: require.resolve("./sidebars.js"),
|
sidebarPath: require.resolve("./sidebars.js"),
|
||||||
editUrl: "https://github.com/janhq/jan/tree/main/docs",
|
editUrl: "https://github.com/janhq/jan/tree/dev/docs",
|
||||||
showLastUpdateAuthor: true,
|
showLastUpdateAuthor: true,
|
||||||
showLastUpdateTime: true,
|
showLastUpdateTime: true,
|
||||||
},
|
},
|
||||||
|
|||||||
@ -3,6 +3,8 @@ import { WindowManager } from './../managers/window'
|
|||||||
import { autoUpdater } from 'electron-updater'
|
import { autoUpdater } from 'electron-updater'
|
||||||
import { AppEvent } from '@janhq/core'
|
import { AppEvent } from '@janhq/core'
|
||||||
|
|
||||||
|
export let waitingToInstallVersion: string | undefined = undefined
|
||||||
|
|
||||||
export function handleAppUpdates() {
|
export function handleAppUpdates() {
|
||||||
/* Should not check for update during development */
|
/* Should not check for update during development */
|
||||||
if (!app.isPackaged) {
|
if (!app.isPackaged) {
|
||||||
@ -29,6 +31,7 @@ export function handleAppUpdates() {
|
|||||||
buttons: ['Restart', 'Later'],
|
buttons: ['Restart', 'Later'],
|
||||||
})
|
})
|
||||||
if (action.response === 0) {
|
if (action.response === 0) {
|
||||||
|
waitingToInstallVersion = _info?.version
|
||||||
autoUpdater.quitAndInstall()
|
autoUpdater.quitAndInstall()
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@ -37,7 +40,7 @@ export function handleAppUpdates() {
|
|||||||
autoUpdater.on('error', (info: any) => {
|
autoUpdater.on('error', (info: any) => {
|
||||||
WindowManager.instance.currentWindow?.webContents.send(
|
WindowManager.instance.currentWindow?.webContents.send(
|
||||||
AppEvent.onAppUpdateDownloadError,
|
AppEvent.onAppUpdateDownloadError,
|
||||||
info
|
{ failedToInstallVersion: waitingToInstallVersion, info }
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
69
web/containers/Layout/BottomBar/UpdateFailedModal/index.tsx
Normal file
69
web/containers/Layout/BottomBar/UpdateFailedModal/index.tsx
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
import React from 'react'
|
||||||
|
|
||||||
|
import {
|
||||||
|
Modal,
|
||||||
|
ModalPortal,
|
||||||
|
ModalContent,
|
||||||
|
ModalHeader,
|
||||||
|
ModalTitle,
|
||||||
|
ModalFooter,
|
||||||
|
ModalClose,
|
||||||
|
Button,
|
||||||
|
} from '@janhq/uikit'
|
||||||
|
import { Share2Icon } from '@radix-ui/react-icons'
|
||||||
|
import { useAtom } from 'jotai'
|
||||||
|
|
||||||
|
import { updateVersionError } from '@/containers/Providers/Jotai'
|
||||||
|
|
||||||
|
const UpdatedFailedModal = () => {
|
||||||
|
const [error, setError] = useAtom(updateVersionError)
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Modal open={!!error} onOpenChange={() => setError(undefined)}>
|
||||||
|
<ModalPortal />
|
||||||
|
<ModalContent>
|
||||||
|
<ModalHeader>
|
||||||
|
<ModalTitle>Unable to Install Update</ModalTitle>
|
||||||
|
</ModalHeader>
|
||||||
|
<p className="text-muted-foreground">
|
||||||
|
An error occurred while installing Jan{' '}
|
||||||
|
<span className="font-medium text-foreground">{error}</span>. We
|
||||||
|
appreciate your help with{' '}
|
||||||
|
<a
|
||||||
|
href="https://github.com/janhq/jan#download"
|
||||||
|
target="_blank"
|
||||||
|
className="font-medium text-foreground"
|
||||||
|
>
|
||||||
|
manual downloading and installation.
|
||||||
|
</a>
|
||||||
|
</p>
|
||||||
|
<ModalFooter>
|
||||||
|
<div className="flex gap-x-2">
|
||||||
|
<ModalClose asChild onClick={() => setError(undefined)}>
|
||||||
|
<Button themes="outline">Remind me later</Button>
|
||||||
|
</ModalClose>
|
||||||
|
<ModalClose
|
||||||
|
asChild
|
||||||
|
onClick={() => {
|
||||||
|
window.open('https://github.com/janhq/jan#download', '_blank')
|
||||||
|
setError(undefined)
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<Button themes="primary" autoFocus>
|
||||||
|
Download now{' '}
|
||||||
|
<Share2Icon
|
||||||
|
width={16}
|
||||||
|
height={16}
|
||||||
|
className="ml-2"
|
||||||
|
color="white"
|
||||||
|
/>
|
||||||
|
</Button>
|
||||||
|
</ModalClose>
|
||||||
|
</div>
|
||||||
|
</ModalFooter>
|
||||||
|
</ModalContent>
|
||||||
|
</Modal>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default UpdatedFailedModal
|
||||||
@ -17,6 +17,7 @@ import { appDownloadProgress } from '@/containers/Providers/Jotai'
|
|||||||
|
|
||||||
import ImportingModelState from './ImportingModelState'
|
import ImportingModelState from './ImportingModelState'
|
||||||
import SystemMonitor from './SystemMonitor'
|
import SystemMonitor from './SystemMonitor'
|
||||||
|
import UpdatedFailedModal from './UpdateFailedModal'
|
||||||
|
|
||||||
const menuLinks = [
|
const menuLinks = [
|
||||||
{
|
{
|
||||||
@ -44,6 +45,7 @@ const BottomBar = () => {
|
|||||||
</div>
|
</div>
|
||||||
<ImportingModelState />
|
<ImportingModelState />
|
||||||
<DownloadingState />
|
<DownloadingState />
|
||||||
|
<UpdatedFailedModal />
|
||||||
</div>
|
</div>
|
||||||
<div className="flex items-center gap-x-3">
|
<div className="flex items-center gap-x-3">
|
||||||
<SystemMonitor />
|
<SystemMonitor />
|
||||||
|
|||||||
@ -3,10 +3,11 @@ import { Fragment, PropsWithChildren, useEffect } from 'react'
|
|||||||
|
|
||||||
import { useSetAtom } from 'jotai'
|
import { useSetAtom } from 'jotai'
|
||||||
|
|
||||||
import { appDownloadProgress } from './Jotai'
|
import { appDownloadProgress, updateVersionError } from './Jotai'
|
||||||
|
|
||||||
const AppUpdateListener = ({ children }: PropsWithChildren) => {
|
const AppUpdateListener = ({ children }: PropsWithChildren) => {
|
||||||
const setProgress = useSetAtom(appDownloadProgress)
|
const setProgress = useSetAtom(appDownloadProgress)
|
||||||
|
const setUpdateVersionError = useSetAtom(updateVersionError)
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (window && window.electronAPI) {
|
if (window && window.electronAPI) {
|
||||||
@ -18,9 +19,13 @@ const AppUpdateListener = ({ children }: PropsWithChildren) => {
|
|||||||
)
|
)
|
||||||
|
|
||||||
window.electronAPI.onAppUpdateDownloadError(
|
window.electronAPI.onAppUpdateDownloadError(
|
||||||
(_event: string, callback: any) => {
|
(_event: string, error: any) => {
|
||||||
console.error('Download error', callback)
|
console.error('Download error: ', error)
|
||||||
setProgress(-1)
|
setProgress(-1)
|
||||||
|
|
||||||
|
// Can not install update
|
||||||
|
// Prompt user to download the update manually
|
||||||
|
setUpdateVersionError(error.failedToInstallVersion)
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@ -12,6 +12,7 @@ export const editPromptAtom = atom<string>('')
|
|||||||
export const currentPromptAtom = atom<string>('')
|
export const currentPromptAtom = atom<string>('')
|
||||||
export const fileUploadAtom = atom<FileInfo[]>([])
|
export const fileUploadAtom = atom<FileInfo[]>([])
|
||||||
export const appDownloadProgress = atom<number>(-1)
|
export const appDownloadProgress = atom<number>(-1)
|
||||||
|
export const updateVersionError = atom<string | undefined>(undefined)
|
||||||
export const searchAtom = atom<string>('')
|
export const searchAtom = atom<string>('')
|
||||||
|
|
||||||
export default function JotaiWrapper({ children }: Props) {
|
export default function JotaiWrapper({ children }: Props) {
|
||||||
|
|||||||
@ -20,7 +20,6 @@ import { setImportModelStageAtom } from '@/hooks/useImportModel'
|
|||||||
import ExploreModelList from './ExploreModelList'
|
import ExploreModelList from './ExploreModelList'
|
||||||
import { HuggingFaceModal } from './HuggingFaceModal'
|
import { HuggingFaceModal } from './HuggingFaceModal'
|
||||||
|
|
||||||
import { experimentalFeatureEnabledAtom } from '@/helpers/atoms/AppConfig.atom'
|
|
||||||
import {
|
import {
|
||||||
configuredModelsAtom,
|
configuredModelsAtom,
|
||||||
downloadedModelsAtom,
|
downloadedModelsAtom,
|
||||||
@ -37,8 +36,6 @@ const ExploreModelsScreen = () => {
|
|||||||
const [showHuggingFaceModal, setShowHuggingFaceModal] = useState(false)
|
const [showHuggingFaceModal, setShowHuggingFaceModal] = useState(false)
|
||||||
const setImportModelStage = useSetAtom(setImportModelStageAtom)
|
const setImportModelStage = useSetAtom(setImportModelStageAtom)
|
||||||
|
|
||||||
const experimentalFeature = useAtomValue(experimentalFeatureEnabledAtom)
|
|
||||||
|
|
||||||
const filteredModels = configuredModels.filter((x) => {
|
const filteredModels = configuredModels.filter((x) => {
|
||||||
if (sortSelected === 'Downloaded') {
|
if (sortSelected === 'Downloaded') {
|
||||||
return (
|
return (
|
||||||
@ -59,10 +56,6 @@ const ExploreModelsScreen = () => {
|
|||||||
setImportModelStage('SELECTING_MODEL')
|
setImportModelStage('SELECTING_MODEL')
|
||||||
}, [setImportModelStage])
|
}, [setImportModelStage])
|
||||||
|
|
||||||
const onHuggingFaceConverterClick = () => {
|
|
||||||
setShowHuggingFaceModal(true)
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
className="flex h-full w-full overflow-y-auto bg-background"
|
className="flex h-full w-full overflow-y-auto bg-background"
|
||||||
@ -103,7 +96,7 @@ const ExploreModelsScreen = () => {
|
|||||||
Import Model
|
Import Model
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
{experimentalFeature && (
|
{/* {experimentalFeature && (
|
||||||
<div className="text-center">
|
<div className="text-center">
|
||||||
<p
|
<p
|
||||||
onClick={onHuggingFaceConverterClick}
|
onClick={onHuggingFaceConverterClick}
|
||||||
@ -112,7 +105,7 @@ const ExploreModelsScreen = () => {
|
|||||||
Convert from Hugging Face
|
Convert from Hugging Face
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)} */}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="mx-auto w-4/5 py-6">
|
<div className="mx-auto w-4/5 py-6">
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user