diff --git a/.github/workflows/build-and-deploy.yml b/.github/workflows/build-and-deploy.yml index 178f2bd..5dbf5d5 100644 --- a/.github/workflows/build-and-deploy.yml +++ b/.github/workflows/build-and-deploy.yml @@ -3,13 +3,16 @@ name: Build and Deploy # Trigger the workflow on push to the specified branch on: + pull_request: + branches: + - main push: branches: - main # Define the jobs to be run jobs: - # Define the build job + # Define the build job for macOS build: # Specify the runner environment runs-on: macos-latest @@ -64,11 +67,10 @@ jobs: uses: actions/upload-artifact@v3 with: name: macos-silicon - # The current path is very specific and might need adjustments with any changes in the file name or structure. A more generalized path (e.g., src-tauri/target/release/bundle/dmg/*.dmg) would be preferable as it's more flexible and resilient to such changes. path: src-tauri/target/aarch64-apple-darwin/release/bundle/dmg/*.dmg - if-no-files-found: error # or 'warn' or 'ignore' + if-no-files-found: error - # Pre command for intell build + # Pre command for Intel build - name: rustup command run: rustup target add x86_64-apple-darwin @@ -81,9 +83,8 @@ jobs: uses: actions/upload-artifact@v3 with: name: macos-intel - # The current path is very specific and might need adjustments with any changes in the file name or structure. A more generalized path (e.g., src-tauri/target/release/bundle/dmg/*.dmg) would be preferable as it's more flexible and resilient to such changes. path: src-tauri/target/x86_64-apple-darwin/release/bundle/dmg/*.dmg - if-no-files-found: error # or 'warn' or 'ignore' + if-no-files-found: error # Build the project for MacOS Universal (both Silicon and Intel) - name: Build for MacOS Universal @@ -94,77 +95,82 @@ jobs: uses: actions/upload-artifact@v3 with: name: macos-universal - # The current path is very specific and might need adjustments with any changes in the file name or structure. A more generalized path (e.g., src-tauri/target/release/bundle/dmg/*.dmg) would be preferable as it's more flexible and resilient to such changes. path: src-tauri/target/universal-apple-darwin/release/bundle/dmg/*.dmg - if-no-files-found: error # or 'warn' or 'ignore' + if-no-files-found: error - # Placeholder steps for future implementation for Windows - # Build the project for Windows OS + # Define the build job for Windows + windows-build: + # Specify the runner environment + runs-on: windows-latest - - name: Pre windows script + # Define the steps to be performed in the Windows build job + steps: + # Add the target architecture for building Windows apps + - name: Add target architecture run: rustup target add x86_64-pc-windows-msvc - - + + # Check out the repository code to the runner + - name: Checkout code + uses: actions/checkout@v4 + + # Set up the required Node.js version + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version: "20.x" + + # Set up the Rust toolchain + - name: Setup Rust + uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: stable + override: true + + # Install pnpm (a fast, disk space efficient package manager) + - name: Install pnpm + run: npm install -g pnpm + + # Install project dependencies + - name: Install dependencies + run: pnpm i + + # Build the project for Windows - name: Build for Windows run: pnpm build:app:windows + # Archive Windows build artifacts - name: Archive Windows artifacts uses: actions/upload-artifact@v3 with: name: windows path: src-tauri/target/x86_64-pc-windows-msvc/release/bundle/nsis/*.exe - # Placeholder steps for future implementation for Linux - # Build the project for Linux OS - # - name: Build for Linux - # run: pnpm build:app:linux - - # - name: Archive Linux artifacts - # uses: actions/upload-artifact@v3 - # with: - # name: linux - # path: src-tauri/target/release/bundle/linux/* # Adjust this path if necessary - - # # List the contents of the build directory - # # For Debugging purposes - # - name: List files in the build directory - # run: | - # echo "Listing contents of macos-silicon directory" - # ls -la src-tauri/target/aarch64-apple-darwin/release/bundle/dmg/ - # echo "Listing contents of macos-intel directory" - # ls -la src-tauri/target/x86_64-apple-darwin/release/bundle/dmg/ - # echo "Listing contents of macos-universal directory" - # ls -la src-tauri/target/universal-apple-darwin/release/bundle/dmg/ - - # Define the release job which depends on the build job + # Define the release job which depends on both the macOS and Windows build jobs release: - # Specify that this job needs the build job to complete successfully - needs: build + # Specify that this job needs the build and windows-build jobs to complete successfully + needs: [build, windows-build] # Specify the runner environment runs-on: ubuntu-latest # Define the steps to be performed in the release job steps: # Download the build artifacts from the build job - - name: Download artifacts + - name: Download macOS artifacts + uses: actions/download-artifact@v3 + with: + name: macos-silicon + + - name: Download Windows artifacts uses: actions/download-artifact@v3 + with: + name: windows - # # List the contents of the directories - # # For debugging purposes - # - name: List contents of directories - # run: | - # echo "Listing contents of macos-silicon directory" - # ls -la /home/runner/work/Ollama-Gui/Ollama-Gui/macos-silicon - # echo "Listing contents of macos-intel directory" - # ls -la /home/runner/work/Ollama-Gui/Ollama-Gui/macos-intel - # echo "Listing contents of macos-universal directory" - # ls -la /home/runner/work/Ollama-Gui/Ollama-Gui/macos-universal - - # Needs to be updated to use an adequate generated tag # Generate the tag - name: Generate tag id: generate_tag run: echo "::set-output name=tag::release-$(date +'%Y%m%d%H%M%S')" + # Create a new GitHub release with the generated tag - name: Create GitHub Release id: create_release @@ -180,7 +186,7 @@ jobs: # Get the file name and assign it to an object - name: Get Silicon file name id: get_filename_silicon - run: echo "::set-output name=filename::$(ls /home/runner/work/Ollama-Gui/Ollama-Gui/macos-silicon/*.dmg)" + run: echo "::set-output name=filename::$(ls src-tauri/target/aarch64-apple-darwin/release/bundle/dmg/*.dmg)" # Print the file name - name: Echo the Silicon file name @@ -200,7 +206,7 @@ jobs: # Get the file name and assign it to an object - name: Get Intel file name id: get_filename_intel - run: echo "::set-output name=filename::$(ls /home/runner/work/Ollama-Gui/Ollama-Gui/macos-intel/*.dmg)" + run: echo "::set-output name=filename::$(ls src-tauri/target/x86_64-apple-darwin/release/bundle/dmg/*.dmg)" # Print the file name - name: Echo the Intel file name @@ -220,19 +226,10 @@ jobs: # Get the file name and assign it to an object - name: Get Universal file name id: get_filename_universal - run: echo "::set-output name=filename::$(ls /home/runner/work/Ollama-Gui/Ollama-Gui/macos-universal/*.dmg)" + run: echo "::set-output name=filename::$(ls src-tauri/target/universal-apple-darwin/release/bundle/dmg/*.dmg)" # Print the file name - name: Echo the Universal file name run: echo "The Universal file name is ${{ steps.get_filename_universal.outputs.filename }}" - # Upload the MacOS Universal build artifact to the GitHub release - - name: Upload Release Asset (MacOS Universal) - uses: actions/upload-release-asset@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: ${{ steps.get_filename_universal.outputs.filename }} # adjusted path - asset_name: Ollama-Gui-MacOS-Universal.dmg - asset_content_type: application/octet-stream + diff --git a/src/app/index.tsx b/src/app/index.tsx index 815fc16..66e56c5 100644 --- a/src/app/index.tsx +++ b/src/app/index.tsx @@ -1,23 +1,42 @@ -import { useEffect } from "react"; -import { actions, core, syncModels } from "@/core"; +import { useCallback, useEffect } from "react"; +import { actions, core, serverStatusCheck, syncModels } from "@/core"; import { loadDB } from "@/core/local-database"; import { Sidebar } from "@/app/parts/sidebar"; import { ChatWindow } from "./parts/chat-window"; import { SettingsWrapper } from "./parts/settings-wrapper"; +import { Command } from "@tauri-apps/plugin-shell"; +import { useSimple } from "simple-core-state"; +import Axios from 'axios'; // Load the database on the app frame loadDB(); +let intervalID: NodeJS.Timeout; + export const AppFrame = () => { - // async function startServer() { - // let result = await Command.create("ollama-server", [ - // "-c", - // "OLLAMA_ORIGINS=* OLLAMA_HOST=127.0.0.1:11434 ollama serve", - // ]).execute(); - // console.log(result); - // } + const host = useSimple(core.server_host); + const startServer = useCallback(async () => { + console.log(host); + + let result = await Command.create("ollama-server", [ + "-c", + `OLLAMA_ORIGINS=* OLLAMA_HOST=${host} ollama serve`, + ]).execute(); + console.log(result); + }, [host]); + + + + const heartbeatCheck = async () => { + intervalID = setInterval(async () => { + serverStatusCheck(); + }, 5000) + } const loadAppData = async () => { + // Create the tables if not exists + await actions.prepareDatabase(); + // Load available models syncModels(); @@ -27,8 +46,20 @@ export const AppFrame = () => { }; useEffect(() => { - // Load app data in order for functionality - loadAppData(); + startServer(); + serverStatusCheck(); + heartbeatCheck(); + setTimeout(() => { + + setTimeout(() => { + // Load app data in order for functionality + loadAppData(); + }, 50); + }, 200); + + return () => { + clearInterval(intervalID); + } }, []); return ( diff --git a/src/app/parts/chat-window.tsx b/src/app/parts/chat-window.tsx index 1bd3dbf..46e51cf 100644 --- a/src/app/parts/chat-window.tsx +++ b/src/app/parts/chat-window.tsx @@ -36,15 +36,6 @@ export const ChatWindow = () => { return messages; }, [messages, conv_id]); - // TODO: We need to move this function to a life cycle for auto restart feature - // async function startServer() { - // let result = await Command.create("ollama-server", [ - // "-c", - // "OLLAMA_ORIGINS=* OLLAMA_HOST=127.0.0.1:11434 ollama serve", - // ]).execute(); - // console.log(result); - // } - const changeModel = (model_name: string) => { // Update last used core.last_used_model.set(model_name); diff --git a/src/app/parts/settings-wrapper.tsx b/src/app/parts/settings-wrapper.tsx index 17f6048..61a263a 100644 --- a/src/app/parts/settings-wrapper.tsx +++ b/src/app/parts/settings-wrapper.tsx @@ -22,7 +22,10 @@ export const SettingsWrapper = ({ children }: { children: ReactNode }) => { handleSubmit, formState: { isDirty }, } = useForm({ values: { host: host_url } }); - const onSubmit: SubmitHandler = (data) => console.log(data); + + const onSubmit: SubmitHandler = (data) => { + console.log("1223m", data); + }; const clearDatabase = async () => { await actions.flushDatbase(); @@ -35,7 +38,7 @@ export const SettingsWrapper = ({ children }: { children: ReactNode }) => { return (
{open && ( -
+

Settings

@@ -51,7 +54,13 @@ export const SettingsWrapper = ({ children }: { children: ReactNode }) => {
{isDirty && (
-

Build by:

- +
+

window.open("https://x.com/twanluttik")} + > + Twan Luttik - x.com +

- +

+ window.open( + "https://github.com/ollama-interface/Ollama-Gui" + ) + } + > + code - github.com +

+
diff --git a/src/app/parts/sidebar.tsx b/src/app/parts/sidebar.tsx index a40485f..3280f2b 100644 --- a/src/app/parts/sidebar.tsx +++ b/src/app/parts/sidebar.tsx @@ -11,6 +11,8 @@ export const Sidebar = () => { const convs = useSimple(core.conversations); const focused_conv_id = useSimple(core.focused_conv_id); const last_used_model = useSimple(core.last_used_model); + const server_connected = useSimple(core.server_connected); + const server_host = useSimple(core.server_host); const newConversation = () => { const v = { @@ -19,6 +21,7 @@ export const Sidebar = () => { model: last_used_model, title: "Conversation " + generateIdNumber(2), }; + actions.createConversation(v); core.conversations.set( @@ -45,6 +48,20 @@ export const Sidebar = () => { return (
+
+
+

Status:

+

+ {server_connected ? "Connected" : "Disconnected"} +

+
+

{server_host}

+