fix: correct app version display (#452)
This commit is contained in:
parent
c0da5d0026
commit
9903b033b0
@ -67,7 +67,7 @@ function requestInference(
|
||||
}
|
||||
subscriber.complete();
|
||||
})
|
||||
.catch(subscriber.error);
|
||||
.catch((err) => subscriber.error(err));
|
||||
});
|
||||
}
|
||||
|
||||
@ -143,7 +143,8 @@ async function handleMessageRequest(data: NewMessageRequest) {
|
||||
},
|
||||
error: async (err) => {
|
||||
message.message =
|
||||
message.message.trim() + "\n" + "Error occurred: " + err;
|
||||
message.message.trim() + "\n" + "Error occurred: " + err.message;
|
||||
events.emit(EventName.OnMessageResponseUpdate, message);
|
||||
// TODO: Common collections should be able to access via core functions instead of store
|
||||
await store.updateOne("messages", message._id, message);
|
||||
},
|
||||
|
||||
@ -14,53 +14,49 @@ const initModel = (fileName) => {
|
||||
if (!fileName) {
|
||||
reject("Model not found, please download again.");
|
||||
}
|
||||
if (subprocess) {
|
||||
console.error("A subprocess is already running. Attempt to kill then reinit.");
|
||||
killSubprocess();
|
||||
}
|
||||
resolve(fileName);
|
||||
})
|
||||
// Kill port process if it is already in use
|
||||
.then((fileName) =>
|
||||
tcpPortUsed
|
||||
.waitUntilFree(PORT, 200, 3000)
|
||||
.catch(() => killPortProcess(PORT))
|
||||
.then(() => fileName)
|
||||
)
|
||||
// Spawn Nitro subprocess to load model
|
||||
.then(() => {
|
||||
let binaryFolder = path.join(__dirname, "nitro"); // Current directory by default
|
||||
let binaryName;
|
||||
return tcpPortUsed.check(PORT, "127.0.0.1").then((inUse) => {
|
||||
if (!inUse) {
|
||||
let binaryFolder = path.join(__dirname, "nitro"); // Current directory by default
|
||||
let binaryName;
|
||||
|
||||
if (process.platform === "win32") {
|
||||
// Todo: Need to check for CUDA support to switch between CUDA and non-CUDA binaries
|
||||
binaryName = "nitro_start_windows.bat";
|
||||
} else if (process.platform === "darwin") {
|
||||
// Mac OS platform
|
||||
binaryName = process.arch === "arm64" ? "nitro_mac_arm64" : "nitro_mac_intel";
|
||||
} else {
|
||||
// Linux
|
||||
// Todo: Need to check for CUDA support to switch between CUDA and non-CUDA binaries
|
||||
binaryName = "nitro_start_linux.sh"; // For other platforms
|
||||
}
|
||||
if (process.platform === "win32") {
|
||||
// Todo: Need to check for CUDA support to switch between CUDA and non-CUDA binaries
|
||||
binaryName = "nitro_start_windows.bat";
|
||||
} else if (process.platform === "darwin") {
|
||||
// Mac OS platform
|
||||
binaryName =
|
||||
process.arch === "arm64"
|
||||
? "nitro_mac_arm64"
|
||||
: "nitro_mac_intel";
|
||||
} else {
|
||||
// Linux
|
||||
// Todo: Need to check for CUDA support to switch between CUDA and non-CUDA binaries
|
||||
binaryName = "nitro_start_linux.sh"; // For other platforms
|
||||
}
|
||||
|
||||
const binaryPath = path.join(binaryFolder, binaryName);
|
||||
const binaryPath = path.join(binaryFolder, binaryName);
|
||||
|
||||
// Execute the binary
|
||||
subprocess = spawn(binaryPath, { cwd: binaryFolder });
|
||||
// Execute the binary
|
||||
subprocess = spawn(binaryPath, { cwd: binaryFolder });
|
||||
|
||||
// Handle subprocess output
|
||||
subprocess.stdout.on("data", (data) => {
|
||||
console.log(`stdout: ${data}`);
|
||||
});
|
||||
// Handle subprocess output
|
||||
subprocess.stdout.on("data", (data) => {
|
||||
console.log(`stdout: ${data}`);
|
||||
});
|
||||
|
||||
subprocess.stderr.on("data", (data) => {
|
||||
console.error(`stderr: ${data}`);
|
||||
});
|
||||
subprocess.stderr.on("data", (data) => {
|
||||
console.error(`stderr: ${data}`);
|
||||
});
|
||||
|
||||
subprocess.on("close", (code) => {
|
||||
console.log(`child process exited with code ${code}`);
|
||||
subprocess = null;
|
||||
subprocess.on("close", (code) => {
|
||||
console.log(`child process exited with code ${code}`);
|
||||
subprocess = null;
|
||||
});
|
||||
}
|
||||
});
|
||||
})
|
||||
.then(() => tcpPortUsed.waitUntilUsed(PORT, 300, 30000))
|
||||
|
||||
@ -14,7 +14,7 @@ const ConversationalList: React.FC<Props> = ({ models }) => (
|
||||
</span>
|
||||
</div>
|
||||
<div className="scroll mt-2 flex w-full gap-2 overflow-hidden overflow-x-scroll pl-6">
|
||||
{models.map((item) => (
|
||||
{models?.map((item) => (
|
||||
<ConversationalCard key={item._id} model={item} />
|
||||
))}
|
||||
</div>
|
||||
|
||||
@ -13,15 +13,14 @@ import DraggableProgressBar from '../DraggableProgressBar'
|
||||
import { useSetAtom } from 'jotai'
|
||||
import { activeBotAtom } from '@helpers/atoms/Bot.atom'
|
||||
import {
|
||||
leftSideBarExpandStateAtom,
|
||||
rightSideBarExpandStateAtom,
|
||||
} from '@helpers/atoms/SideBarExpand.atom'
|
||||
import {
|
||||
MainViewState,
|
||||
setMainViewStateAtom,
|
||||
} from '@helpers/atoms/MainView.atom'
|
||||
import { executeSerial } from '../../../../electron/core/plugin-manager/execution/extension-manager'
|
||||
import { DataService } from '@janhq/core'
|
||||
import { executeSerial } from '@services/pluginService'
|
||||
|
||||
const CreateBotContainer: React.FC = () => {
|
||||
const { downloadedModels } = useGetDownloadedModels()
|
||||
|
||||
@ -1,7 +1,6 @@
|
||||
import React from 'react'
|
||||
import { useAtomValue, useSetAtom } from 'jotai'
|
||||
import { ModelManagementService } from '@janhq/core'
|
||||
import { executeSerial } from '../../../../electron/core/plugin-manager/execution/extension-manager'
|
||||
import {
|
||||
getActiveConvoIdAtom,
|
||||
setActiveConvoIdAtom,
|
||||
@ -13,6 +12,7 @@ import {
|
||||
} from '@helpers/atoms/MainView.atom'
|
||||
import { displayDate } from '@utils/datetime'
|
||||
import { twMerge } from 'tailwind-merge'
|
||||
import { executeSerial } from '@services/pluginService'
|
||||
|
||||
type Props = {
|
||||
conversation: Conversation
|
||||
|
||||
@ -59,7 +59,7 @@ const LeftRibbonNav: React.FC = () => {
|
||||
|
||||
const onBotListClick = async () => {
|
||||
const bots = await getAllBots()
|
||||
if (bots.length === 0) {
|
||||
if (bots?.length === 0) {
|
||||
alert('You have no bot')
|
||||
return
|
||||
}
|
||||
|
||||
@ -20,7 +20,7 @@ const ModelTable: React.FC<Props> = ({ models }) => (
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{models.map((model) => (
|
||||
{models?.map((model) => (
|
||||
<ModelRow key={model._id} model={model} />
|
||||
))}
|
||||
</tbody>
|
||||
|
||||
@ -5,12 +5,14 @@ import { useAtomValue } from 'jotai'
|
||||
import { modelDownloadStateAtom } from '@helpers/atoms/DownloadState.atom'
|
||||
import { formatDownloadPercentage } from '@utils/converter'
|
||||
import { activeAssistantModelAtom, stateModel } from '@helpers/atoms/Model.atom'
|
||||
import useGetAppVersion from '@hooks/useGetAppVersion'
|
||||
|
||||
const BottomBar = () => {
|
||||
const activeModel = useAtomValue(activeAssistantModelAtom)
|
||||
const stateModelStartStop = useAtomValue(stateModel)
|
||||
const { ram, cpu } = useGetSystemResources()
|
||||
const modelDownloadStates = useAtomValue(modelDownloadStateAtom)
|
||||
const appVersion = useGetAppVersion()
|
||||
|
||||
const downloadStates: DownloadState[] = []
|
||||
for (const [, value] of Object.entries(modelDownloadStates)) {
|
||||
@ -51,7 +53,7 @@ const BottomBar = () => {
|
||||
<div className="flex gap-x-2">
|
||||
<SystemItem name="CPU:" value={`${cpu}%`} />
|
||||
<SystemItem name="Mem:" value={`${ram}%`} />
|
||||
<p className="text-xs font-semibold">Jan v0.2.0</p>
|
||||
<p className="text-xs font-semibold">Jan {appVersion?.version ?? ''}</p>
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
|
||||
@ -13,13 +13,9 @@ import {
|
||||
activationPoints,
|
||||
extensionPoints,
|
||||
} from '../../../electron/core/plugin-manager/execution/index'
|
||||
import {
|
||||
isCorePluginInstalled,
|
||||
setupBasePlugins,
|
||||
} from '@services/pluginService'
|
||||
import EventListenerWrapper from '@helpers/EventListenerWrapper'
|
||||
import { setupCoreServices } from '@services/coreService'
|
||||
import { executeSerial } from '../../../electron/core/plugin-manager/execution/extension-manager'
|
||||
import { executeSerial, isCorePluginInstalled, setupBasePlugins } from '@services/pluginService'
|
||||
|
||||
const Providers = (props: PropsWithChildren) => {
|
||||
const [setupCore, setSetupCore] = useState(false)
|
||||
|
||||
@ -36,8 +36,8 @@ export const SidebarLeft = () => {
|
||||
|
||||
const onBotListClick = async () => {
|
||||
const bots = await getAllBots()
|
||||
if (bots.length === 0) {
|
||||
alert('You have no bot')
|
||||
if (!bots || bots?.length === 0) {
|
||||
alert('You have not created any bot')
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
@ -3,7 +3,6 @@
|
||||
import { useSetAtom } from 'jotai'
|
||||
import { ReactNode, useEffect } from 'react'
|
||||
import { appDownloadProgress } from './JotaiWrapper'
|
||||
import { executeSerial } from '../../electron/core/plugin-manager/execution/extension-manager'
|
||||
import { ModelManagementService } from '@janhq/core'
|
||||
import {
|
||||
setDownloadStateAtom,
|
||||
@ -12,6 +11,7 @@ import {
|
||||
import { getDownloadedModels } from '../hooks/useGetDownloadedModels'
|
||||
import { downloadedModelAtom } from './atoms/DownloadedModel.atom'
|
||||
import EventHandler from './EventHandler'
|
||||
import { executeSerial } from '@services/pluginService'
|
||||
|
||||
type Props = {
|
||||
children: ReactNode
|
||||
|
||||
@ -1,9 +1,10 @@
|
||||
import { executeSerial } from '../../electron/core/plugin-manager/execution/extension-manager'
|
||||
import { DataService } from '@janhq/core'
|
||||
import { executeSerial } from '@services/pluginService'
|
||||
|
||||
export default function useCreateBot() {
|
||||
const createBot = async (bot: Bot) => {
|
||||
try {
|
||||
await executeSerial('createBot', bot)
|
||||
await executeSerial(DataService.CreateBot, bot)
|
||||
} catch (err) {
|
||||
alert(err)
|
||||
console.error(err)
|
||||
|
||||
@ -1,7 +1,8 @@
|
||||
import { useSetAtom } from 'jotai'
|
||||
import { executeSerial } from '../../electron/core/plugin-manager/execution/extension-manager'
|
||||
import { activeBotAtom } from '@helpers/atoms/Bot.atom'
|
||||
import { rightSideBarExpandStateAtom } from '@helpers/atoms/SideBarExpand.atom'
|
||||
import { executeSerial } from '@services/pluginService'
|
||||
import { DataService } from '@janhq/core'
|
||||
|
||||
export default function useDeleteBot() {
|
||||
const setActiveBot = useSetAtom(activeBotAtom)
|
||||
@ -9,7 +10,7 @@ export default function useDeleteBot() {
|
||||
|
||||
const deleteBot = async (botId: string): Promise<'success' | 'failed'> => {
|
||||
try {
|
||||
await executeSerial('deleteBot', botId)
|
||||
await executeSerial(DataService.DeleteBot, botId)
|
||||
setRightPanelVisibility(false)
|
||||
setActiveBot(undefined)
|
||||
return 'success'
|
||||
|
||||
@ -8,7 +8,7 @@ export default function useGetAppVersion() {
|
||||
}, [])
|
||||
|
||||
const getAppVersion = () => {
|
||||
window.electronAPI.appVersion().then((version: string | undefined) => {
|
||||
window.coreAPI?.appVersion().then((version: string | undefined) => {
|
||||
setVersion(version ?? '')
|
||||
})
|
||||
}
|
||||
|
||||
@ -1,9 +1,10 @@
|
||||
import { executeSerial } from '../../electron/core/plugin-manager/execution/extension-manager'
|
||||
import { DataService } from '@janhq/core'
|
||||
import { executeSerial } from '@services/pluginService'
|
||||
|
||||
export default function useGetBots() {
|
||||
const getAllBots = async (): Promise<Bot[]> => {
|
||||
try {
|
||||
const bots = await executeSerial('getBots')
|
||||
const bots = await executeSerial(DataService.GetBots)
|
||||
return bots
|
||||
} catch (err) {
|
||||
alert(`Failed to get bots: ${err}`)
|
||||
@ -14,7 +15,7 @@ export default function useGetBots() {
|
||||
|
||||
const getBotById = async (botId: string): Promise<Bot | undefined> => {
|
||||
try {
|
||||
const bot: Bot = await executeSerial('getBotById', botId)
|
||||
const bot: Bot = await executeSerial(DataService.GetBotById, botId)
|
||||
return bot
|
||||
} catch (err) {
|
||||
alert(`Failed to get bot ${botId}: ${err}`)
|
||||
|
||||
@ -1,8 +1,9 @@
|
||||
import { useEffect } from 'react'
|
||||
import { executeSerial } from '../../electron/core/plugin-manager/execution/extension-manager'
|
||||
import { ModelManagementService } from '@janhq/core'
|
||||
import { useAtom } from 'jotai'
|
||||
import { downloadedModelAtom } from '@helpers/atoms/DownloadedModel.atom'
|
||||
import { extensionPoints } from '../../electron/core/plugin-manager/execution'
|
||||
import { executeSerial } from '@services/pluginService'
|
||||
|
||||
export function useGetDownloadedModels() {
|
||||
const [downloadedModels, setDownloadedModels] = useAtom(downloadedModelAtom)
|
||||
@ -17,6 +18,9 @@ export function useGetDownloadedModels() {
|
||||
}
|
||||
|
||||
export async function getDownloadedModels(): Promise<AssistantModel[]> {
|
||||
if (!extensionPoints.get(ModelManagementService.GetFinishedDownloadModels)) {
|
||||
return []
|
||||
}
|
||||
const downloadedModels: AssistantModel[] = await executeSerial(
|
||||
ModelManagementService.GetFinishedDownloadModels
|
||||
)
|
||||
|
||||
@ -1,9 +1,9 @@
|
||||
import { useEffect, useState } from 'react'
|
||||
import { executeSerial } from '../../electron/core/plugin-manager/execution/extension-manager'
|
||||
import { extensionPoints } from '../../electron/core/plugin-manager/execution'
|
||||
import { SystemMonitoringService } from '@janhq/core'
|
||||
import { useSetAtom } from 'jotai'
|
||||
import { totalRamAtom } from '@helpers/atoms/SystemBar.atom'
|
||||
import { executeSerial } from '@services/pluginService'
|
||||
export default function useGetSystemResources() {
|
||||
const [ram, setRam] = useState<number>(0)
|
||||
const [cpu, setCPU] = useState<number>(0)
|
||||
|
||||
@ -1,4 +1,5 @@
|
||||
import { executeSerial } from '../../electron/core/plugin-manager/execution/extension-manager'
|
||||
import { DataService } from '@janhq/core'
|
||||
import { executeSerial } from '@services/pluginService'
|
||||
|
||||
export default function useUpdateBot() {
|
||||
const updateBot = async (
|
||||
@ -15,7 +16,7 @@ export default function useUpdateBot() {
|
||||
}
|
||||
}
|
||||
|
||||
await executeSerial('updateBot', bot)
|
||||
await executeSerial(DataService.UpdateBot, bot)
|
||||
console.debug('Bot updated', JSON.stringify(bot, null, 2))
|
||||
} catch (err) {
|
||||
alert(`Update bot error: ${err}`)
|
||||
|
||||
@ -21,7 +21,14 @@ const nextConfig = {
|
||||
// do some stuff here
|
||||
config.optimization.minimize = false
|
||||
config.optimization.minimizer = []
|
||||
config.plugins = [...config.plugins, new webpack.DefinePlugin({})]
|
||||
config.plugins = [
|
||||
...config.plugins,
|
||||
new webpack.DefinePlugin({
|
||||
PLUGIN_CATALOG: JSON.stringify(
|
||||
'https://cdn.jsdelivr.net/npm/@janhq/plugin-catalog@latest/dist/index.js'
|
||||
),
|
||||
}),
|
||||
]
|
||||
return config
|
||||
},
|
||||
}
|
||||
|
||||
@ -12,7 +12,7 @@ const ExploreModelList: React.FC = () => {
|
||||
|
||||
return (
|
||||
<div className="relative h-full w-full flex-shrink-0">
|
||||
{models.map((item) => (
|
||||
{models?.map((item) => (
|
||||
<ExploreModelItem key={item._id} model={item} />
|
||||
))}
|
||||
</div>
|
||||
|
||||
@ -25,9 +25,17 @@ const PluginCatalog = () => {
|
||||
* Loads the plugin catalog module from a CDN and sets it as the plugin catalog state.
|
||||
*/
|
||||
useEffect(() => {
|
||||
executeSerial(DataService.GetPluginManifest).then((data) => {
|
||||
setPluginCatalog(data)
|
||||
})
|
||||
// Load plugin manifest from plugin if any
|
||||
if (extensionPoints.get(DataService.GetPluginManifest)) {
|
||||
executeSerial(DataService.GetPluginManifest).then((data) => {
|
||||
setPluginCatalog(data)
|
||||
})
|
||||
} else {
|
||||
// Fallback to app default manifest
|
||||
import(
|
||||
/* webpackIgnore: true */ PLUGIN_CATALOG + `?t=${Date.now()}`
|
||||
).then((data) => setPluginCatalog(data.default))
|
||||
}
|
||||
}, [])
|
||||
|
||||
/**
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
import React, { Children } from 'react'
|
||||
import React from 'react'
|
||||
import { execute } from '../../../../../electron/core/plugin-manager/execution/extension-manager'
|
||||
|
||||
type Props = {
|
||||
|
||||
@ -8,10 +8,11 @@ import {
|
||||
DataService,
|
||||
InferenceService,
|
||||
ModelManagementService,
|
||||
StoreService,
|
||||
} from '@janhq/core'
|
||||
|
||||
export const isCorePluginInstalled = () => {
|
||||
if (!extensionPoints.get(DataService.GetConversations)) {
|
||||
if (!extensionPoints.get(StoreService.CreateCollection)) {
|
||||
return false
|
||||
}
|
||||
if (!extensionPoints.get(InferenceService.InitModel)) {
|
||||
@ -32,7 +33,7 @@ export const setupBasePlugins = async () => {
|
||||
const basePlugins = await window.electronAPI.basePlugins()
|
||||
|
||||
if (
|
||||
!extensionPoints.get(DataService.GetConversations) ||
|
||||
!extensionPoints.get(StoreService.CreateCollection) ||
|
||||
!extensionPoints.get(InferenceService.InitModel) ||
|
||||
!extensionPoints.get(ModelManagementService.DownloadModel)
|
||||
) {
|
||||
@ -45,7 +46,7 @@ export const setupBasePlugins = async () => {
|
||||
|
||||
export const execute = (name: CoreService, args?: any) => {
|
||||
if (!extensionPoints.get(name)) {
|
||||
alert('Missing extension for function: ' + name)
|
||||
// alert('Missing extension for function: ' + name)
|
||||
return undefined
|
||||
}
|
||||
return extensionPoints.execute(name, args)
|
||||
@ -53,7 +54,7 @@ export const execute = (name: CoreService, args?: any) => {
|
||||
|
||||
export const executeSerial = (name: CoreService, args?: any) => {
|
||||
if (!extensionPoints.get(name)) {
|
||||
alert('Missing extension for function: ' + name)
|
||||
// alert('Missing extension for function: ' + name)
|
||||
return Promise.resolve(undefined)
|
||||
}
|
||||
return extensionPoints.executeSerial(name, args)
|
||||
|
||||
2
web/types/index.d.ts
vendored
2
web/types/index.d.ts
vendored
@ -1,7 +1,7 @@
|
||||
export {}
|
||||
|
||||
declare const PLUGIN_CATALOGS: string[]
|
||||
declare global {
|
||||
declare const PLUGIN_CATALOG: string
|
||||
interface Window {
|
||||
electronAPI?: any | undefined
|
||||
corePlugin?: any | undefined
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user