Compare commits

...

4 Commits

Author SHA1 Message Date
Bruce MacDonald
6e08c68661 Update app.tsx 2024-03-19 09:48:34 +01:00
Bruce MacDonald
f15312c52b Update index.ts 2024-03-19 09:43:16 +01:00
Bruce MacDonald
44c05abd22 skip to finish cli step if cli is already available 2024-03-19 09:29:28 +01:00
Bruce MacDonald
a467bd3f6c do not prompt the user to move to applications if ollama in path 2024-03-18 16:17:23 +01:00
3 changed files with 66 additions and 42 deletions

View File

@ -16,7 +16,10 @@ enum Step {
}
export default function () {
const [step, setStep] = useState<Step>(Step.WELCOME)
const urlParams = new URLSearchParams(window.location.search);
const stepParam = urlParams.get('step');
const initialStep = stepParam ? Number(stepParam) : Step.WELCOME;
const [step, setStep] = useState<Step>(initialStep);
const [commandCopied, setCommandCopied] = useState<boolean>(false)
const command = 'ollama run llama2'

View File

@ -32,7 +32,7 @@ const logger = winston.createLogger({
format: winston.format.printf(info => info.message),
})
app.on('ready', () => {
app.on('ready', async () => {
const gotTheLock = app.requestSingleInstanceLock()
if (!gotTheLock) {
app.exit(0)
@ -54,10 +54,10 @@ app.on('ready', () => {
app.focus({ steal: true })
init()
await init()
})
function firstRunWindow() {
function firstRunWindow(isInstalled: boolean) {
// Create the browser window.
welcomeWindow = new BrowserWindow({
width: 400,
@ -75,7 +75,11 @@ function firstRunWindow() {
require('@electron/remote/main').enable(welcomeWindow.webContents)
welcomeWindow.loadURL(MAIN_WINDOW_WEBPACK_ENTRY)
let url = MAIN_WINDOW_WEBPACK_ENTRY
if (isInstalled) {
url += '?step=2' // set the window to the finish screen
}
welcomeWindow.loadURL(url);
welcomeWindow.on('ready-to-show', () => welcomeWindow.show())
welcomeWindow.on('closed', () => {
if (process.platform === 'darwin') {
@ -207,7 +211,7 @@ async function checkUpdate() {
}
}
function init() {
async function init() {
if (app.isPackaged) {
checkUpdate()
setInterval(() => {
@ -217,44 +221,42 @@ function init() {
updateTray()
if (process.platform === 'darwin') {
if (app.isPackaged) {
if (!app.isInApplicationsFolder()) {
const chosen = dialog.showMessageBoxSync({
type: 'question',
buttons: ['Move to Applications', 'Do Not Move'],
message: 'Ollama works best when run from the Applications directory.',
defaultId: 0,
cancelId: 1,
})
const isInstalled = await installed();
if (chosen === 0) {
try {
app.moveToApplicationsFolder({
conflictHandler: conflictType => {
if (conflictType === 'existsAndRunning') {
dialog.showMessageBoxSync({
type: 'info',
message: 'Cannot move to Applications directory',
detail:
'Another version of Ollama is currently running from your Applications directory. Close it first and try again.',
})
}
return true
},
})
return
} catch (e) {
logger.error(`[Move to Applications] Failed to move to applications folder - ${e.message}}`)
}
}
if (process.platform === 'darwin' && app.isPackaged && !app.isInApplicationsFolder() && !isInstalled) {
const chosen = dialog.showMessageBoxSync({
type: 'question',
buttons: ['Move to Applications', 'Do Not Move'],
message: 'Ollama works best when run from the Applications directory.',
defaultId: 0,
cancelId: 1,
})
if (chosen === 0) {
try {
app.moveToApplicationsFolder({
conflictHandler: conflictType => {
if (conflictType === 'existsAndRunning') {
dialog.showMessageBoxSync({
type: 'info',
message: 'Cannot move to Applications directory',
detail:
'Another version of Ollama is currently running from your Applications directory. Close it first and try again.',
})
}
return true
},
})
return
} catch (e) {
logger.error(`[Move to Applications] Failed to move to applications folder - ${e.message}}`)
}
}
}
server()
if (store.get('first-time-run') && installed()) {
if (store.get('first-time-run') && isInstalled) {
if (process.platform === 'darwin') {
app.dock.hide()
}
@ -265,7 +267,7 @@ function init() {
// This is the first run or the CLI is no longer installed
app.setLoginItemSettings({ openAtLogin: true })
firstRunWindow()
firstRunWindow(isInstalled)
}
// Quit when all windows are closed, except on macOS. There, it's common

View File

@ -1,5 +1,4 @@
import * as fs from 'fs'
import { exec as cbExec } from 'child_process'
import { exec as cbExec, spawn } from 'child_process'
import * as path from 'path'
import { promisify } from 'util'
@ -8,8 +7,28 @@ const ollama = app.isPackaged ? path.join(process.resourcesPath, 'ollama') : pat
const exec = promisify(cbExec)
const symlinkPath = '/usr/local/bin/ollama'
export function installed() {
return fs.existsSync(symlinkPath) && fs.readlinkSync(symlinkPath) === ollama
export async function installed() {
const shells = ['/bin/zsh', '/bin/bash', '/usr/local/bin/fish'];
const checks = shells.map(shell =>
new Promise(resolve => {
const proc = spawn(shell, ['-l', '-c', `which ollama`]);
proc.on('error', () => {
resolve(false); // if the shell isn't found, this will resolve false here
});
proc.on('close', code => {
if (code === 0) {
resolve(true); // ollama found, resolve true immediately
} else {
resolve(false);
}
});
})
);
const results = await Promise.allSettled(checks)
return results.some(result => result.status === 'fulfilled' && result.value === true)
}
export async function install() {