diff --git a/package.json b/package.json index 3b8756eff..8d96075e4 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ "serve:web-app": "yarn workspace @janhq/web-app serve:web", "build:serve:web-app": "yarn build:web-app && yarn serve:web-app", "dev:tauri": "yarn build:icon && yarn copy:assets:tauri && cross-env IS_CLEAN=true tauri dev", - "dev:ios": "yarn copy:assets:mobile && yarn tauri ios dev", + "dev:ios": "yarn copy:assets:mobile && RUSTC_WRAPPER= yarn tauri ios dev", "dev:android": "yarn copy:assets:mobile && yarn tauri android dev", "build:android": "yarn build && yarn copy:assets:mobile && yarn tauri android build --no-default-features --features mobile", "build:ios": "yarn build && yarn copy:assets:mobile && yarn tauri ios build --no-default-features --features mobile", diff --git a/src-tauri/.gitignore b/src-tauri/.gitignore index 40726cbe0..02bc782bf 100644 --- a/src-tauri/.gitignore +++ b/src-tauri/.gitignore @@ -2,6 +2,7 @@ # will have compiled files and executables /target/ /gen/schemas +/gen/android binaries !binaries/download.sh !binaries/download.bat \ No newline at end of file diff --git a/src-tauri/gen/android/.editorconfig b/src-tauri/gen/android/.editorconfig deleted file mode 100644 index ebe51d3bf..000000000 --- a/src-tauri/gen/android/.editorconfig +++ /dev/null @@ -1,12 +0,0 @@ -# EditorConfig is awesome: https://EditorConfig.org - -# top-most EditorConfig file -root = true - -[*] -indent_style = space -indent_size = 2 -end_of_line = lf -charset = utf-8 -trim_trailing_whitespace = false -insert_final_newline = false \ No newline at end of file diff --git a/src-tauri/gen/android/.gitignore b/src-tauri/gen/android/.gitignore deleted file mode 100644 index b24820317..000000000 --- a/src-tauri/gen/android/.gitignore +++ /dev/null @@ -1,19 +0,0 @@ -*.iml -.gradle -/local.properties -/.idea/caches -/.idea/libraries -/.idea/modules.xml -/.idea/workspace.xml -/.idea/navEditor.xml -/.idea/assetWizardSettings.xml -.DS_Store -build -/captures -.externalNativeBuild -.cxx -local.properties -key.properties - -/.tauri -/tauri.settings.gradle \ No newline at end of file diff --git a/src-tauri/gen/android/app/.gitignore b/src-tauri/gen/android/app/.gitignore deleted file mode 100644 index 9b7321b73..000000000 --- a/src-tauri/gen/android/app/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -/src/main/java/jan/ai/app/generated -/src/main/jniLibs/**/*.so -/src/main/assets/tauri.conf.json -/tauri.build.gradle.kts -/proguard-tauri.pro -/tauri.properties \ No newline at end of file diff --git a/src-tauri/gen/android/app/build.gradle.kts b/src-tauri/gen/android/app/build.gradle.kts deleted file mode 100644 index 858975307..000000000 --- a/src-tauri/gen/android/app/build.gradle.kts +++ /dev/null @@ -1,82 +0,0 @@ -import java.util.Properties - -plugins { - id("com.android.application") - id("org.jetbrains.kotlin.android") - id("rust") -} - -val tauriProperties = Properties().apply { - val propFile = file("tauri.properties") - if (propFile.exists()) { - propFile.inputStream().use { load(it) } - } -} - -android { - compileSdk = 36 - namespace = "jan.ai.app" - defaultConfig { - manifestPlaceholders["usesCleartextTraffic"] = "false" - applicationId = "jan.ai.app" - minSdk = 24 - targetSdk = 36 - versionCode = tauriProperties.getProperty("tauri.android.versionCode", "1").toInt() - versionName = tauriProperties.getProperty("tauri.android.versionName", "1.0") - } - buildTypes { - getByName("debug") { - manifestPlaceholders["usesCleartextTraffic"] = "true" - isDebuggable = true - isJniDebuggable = true - isMinifyEnabled = false - packaging { jniLibs.keepDebugSymbols.add("*/arm64-v8a/*.so") - jniLibs.keepDebugSymbols.add("*/armeabi-v7a/*.so") - jniLibs.keepDebugSymbols.add("*/x86/*.so") - jniLibs.keepDebugSymbols.add("*/x86_64/*.so") - } - } - getByName("release") { - isMinifyEnabled = true - isShrinkResources = true // Remove unused resources - // signingConfig = signingConfigs.getByName("release") // Disabled for development - proguardFiles( - *fileTree(".") { include("**/*.pro") } - .plus(getDefaultProguardFile("proguard-android-optimize.txt")) - .toList().toTypedArray() - ) - // Additional size optimizations - packaging { - resources.excludes.addAll(listOf( - "META-INF/LICENSE*", - "META-INF/NOTICE*", - "META-INF/*.RSA", - "META-INF/*.SF", - "META-INF/*.DSA" - )) - } - } - } - kotlinOptions { - jvmTarget = "1.8" - } - buildFeatures { - buildConfig = true - } -} - -rust { - rootDirRel = "../../../" -} - -dependencies { - implementation("androidx.webkit:webkit:1.14.0") - implementation("androidx.appcompat:appcompat:1.7.1") - implementation("androidx.activity:activity-ktx:1.10.1") - implementation("com.google.android.material:material:1.12.0") - testImplementation("junit:junit:4.13.2") - androidTestImplementation("androidx.test.ext:junit:1.1.4") - androidTestImplementation("androidx.test.espresso:espresso-core:3.5.0") -} - -apply(from = "tauri.build.gradle.kts") \ No newline at end of file diff --git a/src-tauri/gen/android/app/proguard-rules.pro b/src-tauri/gen/android/app/proguard-rules.pro deleted file mode 100644 index 481bb4348..000000000 --- a/src-tauri/gen/android/app/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/src-tauri/gen/android/app/src/main/AndroidManifest.xml b/src-tauri/gen/android/app/src/main/AndroidManifest.xml deleted file mode 100644 index 99735e52e..000000000 --- a/src-tauri/gen/android/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src-tauri/gen/android/app/src/main/assets/resources/LICENSE b/src-tauri/gen/android/app/src/main/assets/resources/LICENSE deleted file mode 100644 index d614b967f..000000000 --- a/src-tauri/gen/android/app/src/main/assets/resources/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Jan - -Copyright 2025 Menlo Research - -This product includes software developed by Menlo Research (https://menlo.ai). - -Licensed under the Apache License, Version 2.0 (the "License"); -You may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Attribution is requested in user-facing documentation and materials, where appropriate. \ No newline at end of file diff --git a/src-tauri/gen/android/app/src/main/java/jan/ai/app/MainActivity.kt b/src-tauri/gen/android/app/src/main/java/jan/ai/app/MainActivity.kt deleted file mode 100644 index 6e901401b..000000000 --- a/src-tauri/gen/android/app/src/main/java/jan/ai/app/MainActivity.kt +++ /dev/null @@ -1,11 +0,0 @@ -package jan.ai.app - -import android.os.Bundle -import androidx.activity.enableEdgeToEdge - -class MainActivity : TauriActivity() { - override fun onCreate(savedInstanceState: Bundle?) { - enableEdgeToEdge() - super.onCreate(savedInstanceState) - } -} diff --git a/src-tauri/gen/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/src-tauri/gen/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index 2b068d114..000000000 --- a/src-tauri/gen/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/src-tauri/gen/android/app/src/main/res/drawable/ic_launcher_background.xml b/src-tauri/gen/android/app/src/main/res/drawable/ic_launcher_background.xml deleted file mode 100644 index 07d5da9cb..000000000 --- a/src-tauri/gen/android/app/src/main/res/drawable/ic_launcher_background.xml +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src-tauri/gen/android/app/src/main/res/layout/activity_main.xml b/src-tauri/gen/android/app/src/main/res/layout/activity_main.xml deleted file mode 100644 index 4fc244418..000000000 --- a/src-tauri/gen/android/app/src/main/res/layout/activity_main.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index d3f09d92c..000000000 Binary files a/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher.png and /dev/null differ diff --git a/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png deleted file mode 100644 index 071c2b462..000000000 Binary files a/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png and /dev/null differ diff --git a/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png deleted file mode 100644 index d3f09d92c..000000000 Binary files a/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png and /dev/null differ diff --git a/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index a0ea8974b..000000000 Binary files a/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher.png and /dev/null differ diff --git a/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png deleted file mode 100644 index 20686a856..000000000 Binary files a/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png and /dev/null differ diff --git a/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png deleted file mode 100644 index a0ea8974b..000000000 Binary files a/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png and /dev/null differ diff --git a/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index b32fa2a8d..000000000 Binary files a/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ diff --git a/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png deleted file mode 100644 index 710cbb3cb..000000000 Binary files a/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png and /dev/null differ diff --git a/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png deleted file mode 100644 index b32fa2a8d..000000000 Binary files a/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png and /dev/null differ diff --git a/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index 011db6927..000000000 Binary files a/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ diff --git a/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png deleted file mode 100644 index e15df8867..000000000 Binary files a/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png and /dev/null differ diff --git a/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png deleted file mode 100644 index 011db6927..000000000 Binary files a/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png and /dev/null differ diff --git a/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index fea60701d..000000000 Binary files a/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ diff --git a/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png deleted file mode 100644 index 280c35150..000000000 Binary files a/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png and /dev/null differ diff --git a/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png deleted file mode 100644 index fea60701d..000000000 Binary files a/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png and /dev/null differ diff --git a/src-tauri/gen/android/app/src/main/res/values-night/themes.xml b/src-tauri/gen/android/app/src/main/res/values-night/themes.xml deleted file mode 100644 index ec53deffc..000000000 --- a/src-tauri/gen/android/app/src/main/res/values-night/themes.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - diff --git a/src-tauri/gen/android/app/src/main/res/values/colors.xml b/src-tauri/gen/android/app/src/main/res/values/colors.xml deleted file mode 100644 index f8c6127d3..000000000 --- a/src-tauri/gen/android/app/src/main/res/values/colors.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - #FFBB86FC - #FF6200EE - #FF3700B3 - #FF03DAC5 - #FF018786 - #FF000000 - #FFFFFFFF - \ No newline at end of file diff --git a/src-tauri/gen/android/app/src/main/res/values/strings.xml b/src-tauri/gen/android/app/src/main/res/values/strings.xml deleted file mode 100644 index 3656d73df..000000000 --- a/src-tauri/gen/android/app/src/main/res/values/strings.xml +++ /dev/null @@ -1,4 +0,0 @@ - - Jan - Jan - \ No newline at end of file diff --git a/src-tauri/gen/android/app/src/main/res/values/themes.xml b/src-tauri/gen/android/app/src/main/res/values/themes.xml deleted file mode 100644 index ec53deffc..000000000 --- a/src-tauri/gen/android/app/src/main/res/values/themes.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - diff --git a/src-tauri/gen/android/app/src/main/res/xml/file_paths.xml b/src-tauri/gen/android/app/src/main/res/xml/file_paths.xml deleted file mode 100644 index 782d63b99..000000000 --- a/src-tauri/gen/android/app/src/main/res/xml/file_paths.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/src-tauri/gen/android/build.gradle.kts b/src-tauri/gen/android/build.gradle.kts deleted file mode 100644 index 607240bc8..000000000 --- a/src-tauri/gen/android/build.gradle.kts +++ /dev/null @@ -1,22 +0,0 @@ -buildscript { - repositories { - google() - mavenCentral() - } - dependencies { - classpath("com.android.tools.build:gradle:8.11.0") - classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.9.25") - } -} - -allprojects { - repositories { - google() - mavenCentral() - } -} - -tasks.register("clean").configure { - delete("build") -} - diff --git a/src-tauri/gen/android/buildSrc/build.gradle.kts b/src-tauri/gen/android/buildSrc/build.gradle.kts deleted file mode 100644 index 5c55bba71..000000000 --- a/src-tauri/gen/android/buildSrc/build.gradle.kts +++ /dev/null @@ -1,23 +0,0 @@ -plugins { - `kotlin-dsl` -} - -gradlePlugin { - plugins { - create("pluginsForCoolKids") { - id = "rust" - implementationClass = "RustPlugin" - } - } -} - -repositories { - google() - mavenCentral() -} - -dependencies { - compileOnly(gradleApi()) - implementation("com.android.tools.build:gradle:8.11.0") -} - diff --git a/src-tauri/gen/android/buildSrc/src/main/java/jan/ai/app/kotlin/BuildTask.kt b/src-tauri/gen/android/buildSrc/src/main/java/jan/ai/app/kotlin/BuildTask.kt deleted file mode 100644 index 667d69029..000000000 --- a/src-tauri/gen/android/buildSrc/src/main/java/jan/ai/app/kotlin/BuildTask.kt +++ /dev/null @@ -1,52 +0,0 @@ -import java.io.File -import org.apache.tools.ant.taskdefs.condition.Os -import org.gradle.api.DefaultTask -import org.gradle.api.GradleException -import org.gradle.api.logging.LogLevel -import org.gradle.api.tasks.Input -import org.gradle.api.tasks.TaskAction - -open class BuildTask : DefaultTask() { - @Input - var rootDirRel: String? = null - @Input - var target: String? = null - @Input - var release: Boolean? = null - - @TaskAction - fun assemble() { - val executable = """yarn"""; - try { - runTauriCli(executable) - } catch (e: Exception) { - if (Os.isFamily(Os.FAMILY_WINDOWS)) { - runTauriCli("$executable.cmd") - } else { - throw e; - } - } - } - - fun runTauriCli(executable: String) { - val rootDirRel = rootDirRel ?: throw GradleException("rootDirRel cannot be null") - val target = target ?: throw GradleException("target cannot be null") - val release = release ?: throw GradleException("release cannot be null") - val args = listOf("tauri", "android", "android-studio-script"); - - project.exec { - workingDir(File(project.projectDir, rootDirRel)) - executable(executable) - args(args) - if (project.logger.isEnabled(LogLevel.DEBUG)) { - args("-vv") - } else if (project.logger.isEnabled(LogLevel.INFO)) { - args("-v") - } - if (release) { - args("--release") - } - args(listOf("--target", target)) - }.assertNormalExitValue() - } -} \ No newline at end of file diff --git a/src-tauri/gen/android/buildSrc/src/main/java/jan/ai/app/kotlin/RustPlugin.kt b/src-tauri/gen/android/buildSrc/src/main/java/jan/ai/app/kotlin/RustPlugin.kt deleted file mode 100644 index 4aa7fcaf6..000000000 --- a/src-tauri/gen/android/buildSrc/src/main/java/jan/ai/app/kotlin/RustPlugin.kt +++ /dev/null @@ -1,85 +0,0 @@ -import com.android.build.api.dsl.ApplicationExtension -import org.gradle.api.DefaultTask -import org.gradle.api.Plugin -import org.gradle.api.Project -import org.gradle.kotlin.dsl.configure -import org.gradle.kotlin.dsl.get - -const val TASK_GROUP = "rust" - -open class Config { - lateinit var rootDirRel: String -} - -open class RustPlugin : Plugin { - private lateinit var config: Config - - override fun apply(project: Project) = with(project) { - config = extensions.create("rust", Config::class.java) - - val defaultAbiList = listOf("arm64-v8a", "armeabi-v7a", "x86", "x86_64"); - val abiList = (findProperty("abiList") as? String)?.split(',') ?: defaultAbiList - - val defaultArchList = listOf("arm64", "arm", "x86", "x86_64"); - val archList = (findProperty("archList") as? String)?.split(',') ?: defaultArchList - - val targetsList = (findProperty("targetList") as? String)?.split(',') ?: listOf("aarch64", "armv7", "i686", "x86_64") - - extensions.configure { - @Suppress("UnstableApiUsage") - flavorDimensions.add("abi") - productFlavors { - create("universal") { - dimension = "abi" - ndk { - abiFilters += abiList - } - } - defaultArchList.forEachIndexed { index, arch -> - create(arch) { - dimension = "abi" - ndk { - abiFilters.add(defaultAbiList[index]) - } - } - } - } - } - - afterEvaluate { - for (profile in listOf("debug", "release")) { - val profileCapitalized = profile.replaceFirstChar { it.uppercase() } - val buildTask = tasks.maybeCreate( - "rustBuildUniversal$profileCapitalized", - DefaultTask::class.java - ).apply { - group = TASK_GROUP - description = "Build dynamic library in $profile mode for all targets" - } - - tasks["mergeUniversal${profileCapitalized}JniLibFolders"].dependsOn(buildTask) - - for (targetPair in targetsList.withIndex()) { - val targetName = targetPair.value - val targetArch = archList[targetPair.index] - val targetArchCapitalized = targetArch.replaceFirstChar { it.uppercase() } - val targetBuildTask = project.tasks.maybeCreate( - "rustBuild$targetArchCapitalized$profileCapitalized", - BuildTask::class.java - ).apply { - group = TASK_GROUP - description = "Build dynamic library in $profile mode for $targetArch" - rootDirRel = config.rootDirRel - target = targetName - release = profile == "release" - } - - buildTask.dependsOn(targetBuildTask) - tasks["merge$targetArchCapitalized${profileCapitalized}JniLibFolders"].dependsOn( - targetBuildTask - ) - } - } - } - } -} \ No newline at end of file diff --git a/src-tauri/gen/android/gradle.properties b/src-tauri/gen/android/gradle.properties deleted file mode 100644 index 2a7ec6959..000000000 --- a/src-tauri/gen/android/gradle.properties +++ /dev/null @@ -1,24 +0,0 @@ -# Project-wide Gradle settings. -# IDE (e.g. Android Studio) users: -# Gradle settings configured through the IDE *will override* -# any settings specified in this file. -# For more details on how to configure your build environment visit -# http://www.gradle.org/docs/current/userguide/build_environment.html -# Specifies the JVM arguments used for the daemon process. -# The setting is particularly useful for tweaking memory settings. -org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 -# When configured, Gradle will run in incubating parallel mode. -# This option should only be used with decoupled projects. More details, visit -# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects -# org.gradle.parallel=true -# AndroidX package structure to make it clearer which packages are bundled with the -# Android operating system, and which are packaged with your app"s APK -# https://developer.android.com/topic/libraries/support-library/androidx-rn -android.useAndroidX=true -# Kotlin code style for this project: "official" or "obsolete": -kotlin.code.style=official -# Enables namespacing of each library's R class so that its R class includes only the -# resources declared in the library itself and none from the library's dependencies, -# thereby reducing the size of the R class for that library -android.nonTransitiveRClass=true -android.nonFinalResIds=false \ No newline at end of file diff --git a/src-tauri/gen/android/gradle/wrapper/gradle-wrapper.jar b/src-tauri/gen/android/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index e708b1c02..000000000 Binary files a/src-tauri/gen/android/gradle/wrapper/gradle-wrapper.jar and /dev/null differ diff --git a/src-tauri/gen/android/gradle/wrapper/gradle-wrapper.properties b/src-tauri/gen/android/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index c5f9a53c2..000000000 --- a/src-tauri/gen/android/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,6 +0,0 @@ -#Tue May 10 19:22:52 CST 2022 -distributionBase=GRADLE_USER_HOME -distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip -distributionPath=wrapper/dists -zipStorePath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME diff --git a/src-tauri/gen/android/gradlew b/src-tauri/gen/android/gradlew deleted file mode 100755 index 4f906e0c8..000000000 --- a/src-tauri/gen/android/gradlew +++ /dev/null @@ -1,185 +0,0 @@ -#!/usr/bin/env sh - -# -# Copyright 2015 the original author or authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -############################################################################## -## -## Gradle start up script for UN*X -## -############################################################################## - -# Attempt to set APP_HOME -# Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null - -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" - -warn () { - echo "$*" -} - -die () { - echo - echo "$*" - echo - exit 1 -} - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; -esac - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD="java" - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi -fi - -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi - -# For Cygwin or MSYS, switch paths to Windows format before running java -if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi - # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" - fi - i=`expr $i + 1` - done - case $i in - 0) set -- ;; - 1) set -- "$args0" ;; - 2) set -- "$args0" "$args1" ;; - 3) set -- "$args0" "$args1" "$args2" ;; - 4) set -- "$args0" "$args1" "$args2" "$args3" ;; - 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac -fi - -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=`save "$@"` - -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" - -exec "$JAVACMD" "$@" diff --git a/src-tauri/gen/android/gradlew.bat b/src-tauri/gen/android/gradlew.bat deleted file mode 100644 index 107acd32c..000000000 --- a/src-tauri/gen/android/gradlew.bat +++ /dev/null @@ -1,89 +0,0 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/src-tauri/gen/android/settings.gradle b/src-tauri/gen/android/settings.gradle deleted file mode 100644 index 39391166f..000000000 --- a/src-tauri/gen/android/settings.gradle +++ /dev/null @@ -1,3 +0,0 @@ -include ':app' - -apply from: 'tauri.settings.gradle' diff --git a/src-tauri/tauri.ios.conf.json b/src-tauri/tauri.ios.conf.json index 5b9371385..fa201d467 100644 --- a/src-tauri/tauri.ios.conf.json +++ b/src-tauri/tauri.ios.conf.json @@ -9,6 +9,7 @@ } }, "bundle": { + "active": true, "iOS": { "developmentTeam": "" }, diff --git a/web-app/index.html b/web-app/index.html index fc264d096..f59835ecb 100644 --- a/web-app/index.html +++ b/web-app/index.html @@ -1,11 +1,24 @@ - + - - + + - + Jan diff --git a/web-app/src/containers/LeftPanel.tsx b/web-app/src/containers/LeftPanel.tsx index da596dd4a..a6a31218a 100644 --- a/web-app/src/containers/LeftPanel.tsx +++ b/web-app/src/containers/LeftPanel.tsx @@ -122,7 +122,7 @@ const LeftPanel = () => { ) { if (currentIsSmallScreen && open) { setLeftPanel(false) - } else if(!open) { + } else if (!open) { setLeftPanel(true) } prevScreenSizeRef.current = currentIsSmallScreen @@ -141,7 +141,7 @@ const LeftPanel = () => { return () => { window.removeEventListener('resize', handleResize) } - }, [setLeftPanel]) + }, [open, setLeftPanel]) const currentPath = useRouterState({ select: (state) => state.location.pathname, @@ -184,7 +184,7 @@ const LeftPanel = () => { return ( <> {/* Backdrop overlay for small screens */} - {isSmallScreen && open && ( + {isSmallScreen && open && !IS_IOS && !IS_ANDROID && (
{ @@ -207,7 +207,7 @@ const LeftPanel = () => { isResizableContext && 'h-full w-full', // Small screen context: fixed positioning and styling isSmallScreen && - 'fixed h-[calc(100%-16px)] bg-app z-50 rounded-sm border border-left-panel-fg/10 m-2 px-1 w-48', + 'fixed h-full pb-[calc(env(safe-area-inset-bottom)+env(safe-area-inset-top))] bg-main-view z-50 md:border border-left-panel-fg/10 px-1 w-full md:w-48', // Default context: original styling !isResizableContext && !isSmallScreen && @@ -266,7 +266,8 @@ const LeftPanel = () => {
0 || localDownloadingModels.size > 0 + Object.keys(downloads).length > 0 || + localDownloadingModels.size > 0 ? 'h-[calc(100%-200px)]' : 'h-[calc(100%-140px)]' )} @@ -379,7 +380,9 @@ const LeftPanel = () => { - +
diff --git a/web-app/src/containers/SettingsMenu.tsx b/web-app/src/containers/SettingsMenu.tsx index da0e94870..78389233d 100644 --- a/web-app/src/containers/SettingsMenu.tsx +++ b/web-app/src/containers/SettingsMenu.tsx @@ -30,12 +30,15 @@ const SettingsMenu = () => { // On web: exclude llamacpp provider as it's not available const activeProviders = providers.filter((provider) => { if (!provider.active) return false - + // On web version, hide llamacpp provider - if (!PlatformFeatures[PlatformFeature.LOCAL_INFERENCE] && provider.provider === 'llama.cpp') { + if ( + !PlatformFeatures[PlatformFeature.LOCAL_INFERENCE] && + provider.provider === 'llama.cpp' + ) { return false } - + return true }) @@ -92,7 +95,7 @@ const SettingsMenu = () => { title: 'common:keyboardShortcuts', route: route.settings.shortcuts, hasSubMenu: false, - isEnabled: true, + isEnabled: PlatformFeatures[PlatformFeature.SHORTCUT], }, { title: 'common:hardware', @@ -137,7 +140,7 @@ const SettingsMenu = () => { return ( <> - )} -
- +
+ +
+ + {t(menu.title)} + + {menu.hasSubMenu && ( + + )} +
+ - {/* Sub-menu for model providers */} - {menu.hasSubMenu && expandedProviders && ( -
- {activeProviders.map((provider) => { - const isActive = matches.some( - (match) => - match.routeId === '/settings/providers/$providerName' && - 'providerName' in match.params && - match.params.providerName === provider.provider - ) + {/* Sub-menu for model providers */} + {menu.hasSubMenu && expandedProviders && ( +
+ {activeProviders.map((provider) => { + const isActive = matches.some( + (match) => + match.routeId === + '/settings/providers/$providerName' && + 'providerName' in match.params && + match.params.providerName === provider.provider + ) - return ( -
- - )} -
+ ) + })} +
+ )} +
) })}
diff --git a/web-app/src/containers/SetupScreen.tsx b/web-app/src/containers/SetupScreen.tsx index 812ed6493..cdf0020d8 100644 --- a/web-app/src/containers/SetupScreen.tsx +++ b/web-app/src/containers/SetupScreen.tsx @@ -6,6 +6,8 @@ import HeaderPage from './HeaderPage' import { isProd } from '@/lib/version' import { useTranslation } from '@/i18n/react-i18next-compat' import { localStorageKey } from '@/constants/localStorage' +import { PlatformFeatures } from '@/lib/platform/const' +import { PlatformFeature } from '@/lib/platform' function SetupScreen() { const { t } = useTranslation() @@ -21,7 +23,7 @@ function SetupScreen() {
-
+

{t('setup:welcome')} @@ -31,22 +33,24 @@ function SetupScreen() {

- -
-

- {t('setup:localModel')} -

-
- - } - >
+ {PlatformFeatures[PlatformFeature.LOCAL_INFERENCE] && ( + +
+

+ {t('setup:localModel')} +

+
+ + } + /> + )} } - > + />
diff --git a/web-app/src/containers/analytics/PromptAnalytic.tsx b/web-app/src/containers/analytics/PromptAnalytic.tsx index 25e4e8d8c..425492a31 100644 --- a/web-app/src/containers/analytics/PromptAnalytic.tsx +++ b/web-app/src/containers/analytics/PromptAnalytic.tsx @@ -21,7 +21,7 @@ export function PromptAnalytic() { } return ( -
+

@@ -45,7 +45,9 @@ export function PromptAnalytic() { > {t('deny')} - +

) diff --git a/web-app/src/index.css b/web-app/src/index.css index d8ae284e9..38f741d21 100644 --- a/web-app/src/index.css +++ b/web-app/src/index.css @@ -56,6 +56,13 @@ @layer base { body { @apply overflow-hidden; + background-color: white; + min-height: 100vh; + min-height: -webkit-fill-available; + padding-top: env(safe-area-inset-top, 0px); + padding-bottom: env(safe-area-inset-bottom); + padding-left: env(safe-area-inset-left); + padding-right: env(safe-area-inset-right); ::-webkit-scrollbar { width: 6px; height: 6px; diff --git a/web-app/src/lib/platform/const.ts b/web-app/src/lib/platform/const.ts index ac623bd79..ee9632aab 100644 --- a/web-app/src/lib/platform/const.ts +++ b/web-app/src/lib/platform/const.ts @@ -4,7 +4,7 @@ */ import { PlatformFeature } from './types' -import { isPlatformTauri } from './utils' +import { isPlatformTauri, isPlatformIOS, isPlatformAndroid } from './utils' /** * Platform Features Configuration @@ -12,28 +12,35 @@ import { isPlatformTauri } from './utils' */ export const PlatformFeatures: Record = { // Hardware monitoring and GPU usage - [PlatformFeature.HARDWARE_MONITORING]: isPlatformTauri(), + [PlatformFeature.HARDWARE_MONITORING]: + isPlatformTauri() && !isPlatformIOS() && !isPlatformAndroid(), // Local model inference (llama.cpp) - [PlatformFeature.LOCAL_INFERENCE]: isPlatformTauri(), + [PlatformFeature.LOCAL_INFERENCE]: + isPlatformTauri() && !isPlatformIOS() && !isPlatformAndroid(), // Local API server - [PlatformFeature.LOCAL_API_SERVER]: isPlatformTauri(), + [PlatformFeature.LOCAL_API_SERVER]: + isPlatformTauri() && !isPlatformIOS() && !isPlatformAndroid(), // Hub/model downloads - [PlatformFeature.MODEL_HUB]: isPlatformTauri(), + [PlatformFeature.MODEL_HUB]: + isPlatformTauri() && !isPlatformIOS() && !isPlatformAndroid(), // System integrations (logs, file explorer, etc.) - [PlatformFeature.SYSTEM_INTEGRATIONS]: isPlatformTauri(), + [PlatformFeature.SYSTEM_INTEGRATIONS]: + isPlatformTauri() && !isPlatformIOS() && !isPlatformAndroid(), // HTTPS proxy - [PlatformFeature.HTTPS_PROXY]: isPlatformTauri(), - + [PlatformFeature.HTTPS_PROXY]: + isPlatformTauri() && !isPlatformIOS() && !isPlatformAndroid(), + // Default model providers (OpenAI, Anthropic, etc.) - disabled for web-only Jan builds [PlatformFeature.DEFAULT_PROVIDERS]: isPlatformTauri(), // Analytics and telemetry - disabled for web - [PlatformFeature.ANALYTICS]: isPlatformTauri(), + [PlatformFeature.ANALYTICS]: + isPlatformTauri() && !isPlatformIOS() && !isPlatformAndroid(), // Web-specific automatic model selection from jan provider - enabled for web only [PlatformFeature.WEB_AUTO_MODEL_SELECTION]: !isPlatformTauri(), @@ -45,10 +52,12 @@ export const PlatformFeatures: Record = { [PlatformFeature.MCP_AUTO_APPROVE_TOOLS]: !isPlatformTauri(), // MCP servers settings page - disabled for web - [PlatformFeature.MCP_SERVERS_SETTINGS]: isPlatformTauri(), + [PlatformFeature.MCP_SERVERS_SETTINGS]: + isPlatformTauri() && !isPlatformIOS() && !isPlatformAndroid(), // Extensions settings page - disabled for web - [PlatformFeature.EXTENSIONS_SETTINGS]: isPlatformTauri(), + [PlatformFeature.EXTENSIONS_SETTINGS]: + isPlatformTauri() && !isPlatformIOS() && !isPlatformAndroid(), // Assistant functionality - disabled for web [PlatformFeature.ASSISTANTS]: isPlatformTauri(), @@ -60,5 +69,9 @@ export const PlatformFeatures: Record = { [PlatformFeature.GOOGLE_ANALYTICS]: !isPlatformTauri(), // Alternate shortcut bindings - enabled for web only (to avoid browser conflicts) - [PlatformFeature.ALTERNATE_SHORTCUT_BINDINGS]: !isPlatformTauri(), -} \ No newline at end of file + [PlatformFeature.ALTERNATE_SHORTCUT_BINDINGS]: + !isPlatformTauri() && !isPlatformIOS() && !isPlatformAndroid(), + + // Shortcut + [PlatformFeature.SHORTCUT]: !isPlatformIOS() && !isPlatformAndroid(), +} diff --git a/web-app/src/lib/platform/types.ts b/web-app/src/lib/platform/types.ts index a644c09bd..1c1c4e5a6 100644 --- a/web-app/src/lib/platform/types.ts +++ b/web-app/src/lib/platform/types.ts @@ -6,7 +6,7 @@ /** * Supported platforms */ -export type Platform = 'tauri' | 'web' +export type Platform = 'tauri' | 'web' | 'ios' | 'android' /** * Platform Feature Enum @@ -16,6 +16,8 @@ export enum PlatformFeature { // Hardware monitoring and GPU usage HARDWARE_MONITORING = 'hardwareMonitoring', + SHORTCUT = 'shortcut', + // Local model inference (llama.cpp) LOCAL_INFERENCE = 'localInference', @@ -30,16 +32,16 @@ export enum PlatformFeature { // HTTPS proxy HTTPS_PROXY = 'httpsProxy', - + // Default model providers (OpenAI, Anthropic, etc.) DEFAULT_PROVIDERS = 'defaultProviders', - + // Analytics and telemetry ANALYTICS = 'analytics', - + // Web-specific automatic model selection from jan provider WEB_AUTO_MODEL_SELECTION = 'webAutoModelSelection', - + // Model provider settings page management MODEL_PROVIDER_SETTINGS = 'modelProviderSettings', diff --git a/web-app/src/lib/platform/utils.ts b/web-app/src/lib/platform/utils.ts index 9ef9183d9..ff083acf6 100644 --- a/web-app/src/lib/platform/utils.ts +++ b/web-app/src/lib/platform/utils.ts @@ -1,6 +1,8 @@ import { Platform, PlatformFeature } from './types' declare const IS_WEB_APP: boolean +declare const IS_IOS: boolean +declare const IS_ANDROID: boolean export const isPlatformTauri = (): boolean => { if (typeof IS_WEB_APP === 'undefined') { @@ -12,7 +14,21 @@ export const isPlatformTauri = (): boolean => { return true } +export const isPlatformIOS = (): boolean => { + return IS_IOS +} + +export const isPlatformAndroid = (): boolean => { + return IS_ANDROID +} + +export const isIOS = (): boolean => isPlatformIOS() + +export const isAndroid = (): boolean => isPlatformAndroid() + export const getCurrentPlatform = (): Platform => { + if (isPlatformIOS()) return 'ios' + if (isPlatformAndroid()) return 'android' return isPlatformTauri() ? 'tauri' : 'web' } diff --git a/web-app/src/routes/__root.tsx b/web-app/src/routes/__root.tsx index bc4422b84..f7e61c152 100644 --- a/web-app/src/routes/__root.tsx +++ b/web-app/src/routes/__root.tsx @@ -111,13 +111,17 @@ const AppLayout = () => { return ( - {PlatformFeatures[PlatformFeature.GOOGLE_ANALYTICS] && } + {PlatformFeatures[PlatformFeature.GOOGLE_ANALYTICS] && ( + + )}
{/* Fake absolute panel top to enable window drag */}
- {PlatformFeatures[PlatformFeature.LOCAL_INFERENCE] && } + {PlatformFeatures[PlatformFeature.LOCAL_INFERENCE] && ( + + )} {/* Use ResizablePanelGroup only on larger screens */} {!isSmallScreen && isLeftPanelOpen ? ( @@ -158,11 +162,11 @@ const AppLayout = () => { {/* Main content panel */}
-
+
diff --git a/web-app/src/routes/index.tsx b/web-app/src/routes/index.tsx index b3e7862e5..61669a503 100644 --- a/web-app/src/routes/index.tsx +++ b/web-app/src/routes/index.tsx @@ -57,35 +57,45 @@ function Index() { } return ( -
+
{PlatformFeatures[PlatformFeature.ASSISTANTS] && } -
-
-
-

+
+
+
+

{t('chat:welcome')}

-

+

{t('chat:description')}

diff --git a/web-app/src/routes/settings/appearance.tsx b/web-app/src/routes/settings/appearance.tsx index 3cba3eed5..ab4bd9768 100644 --- a/web-app/src/routes/settings/appearance.tsx +++ b/web-app/src/routes/settings/appearance.tsx @@ -31,7 +31,7 @@ function Appareances() { const { resetCodeBlockStyle } = useCodeblock() return ( -
+

{t('common:settings')}

diff --git a/web-app/src/routes/settings/general.tsx b/web-app/src/routes/settings/general.tsx index 687709710..c13d928e8 100644 --- a/web-app/src/routes/settings/general.tsx +++ b/web-app/src/routes/settings/general.tsx @@ -161,7 +161,7 @@ function General() { }, [t, checkForUpdate]) return ( -
+

{t('common:settings')}

@@ -181,28 +181,29 @@ function General() { } /> )} - {!AUTO_UPDATER_DISABLED && PlatformFeatures[PlatformFeature.SYSTEM_INTEGRATIONS] && ( - -
- {isCheckingUpdate - ? t('settings:general.checkingForUpdates') - : t('settings:general.checkForUpdates')} -
- - } - /> - )} + {!AUTO_UPDATER_DISABLED && + PlatformFeatures[PlatformFeature.SYSTEM_INTEGRATIONS] && ( + +
+ {isCheckingUpdate + ? t('settings:general.checkingForUpdates') + : t('settings:general.checkForUpdates')} +
+ + } + /> + )} } @@ -211,165 +212,173 @@ function General() { {/* Data folder - Desktop only */} {PlatformFeatures[PlatformFeature.SYSTEM_INTEGRATIONS] && ( - - - - {t('settings:dataFolder.appDataDesc', { - ns: 'settings', - })} -   - -
-
- + + + {t('settings:dataFolder.appDataDesc', { + ns: 'settings', + })} +   + +
+
+ + {janDataFolder} + +
+
- -
- - } - actions={ - <> - - {selectedNewPath && ( - { - setIsDialogOpen(open) - if (!open) { - setSelectedNewPath(null) + {t('settings:general.changeLocation')} +
+ + {selectedNewPath && ( + { + setIsDialogOpen(open) + if (!open) { + setSelectedNewPath(null) + } + }} + > +
+ + )} + + } + /> + + + - -
- } - /> -
+
+ + {openFileTitle()} +
+ +
+ } + /> + )} {/* Advanced - Desktop only */} {PlatformFeatures[PlatformFeature.SYSTEM_INTEGRATIONS] && ( - - - - - } - /> - + + + + + } + /> + )} {/* Other */} diff --git a/web-app/src/routes/settings/providers/$providerName.tsx b/web-app/src/routes/settings/providers/$providerName.tsx index efba6233c..f220ff24f 100644 --- a/web-app/src/routes/settings/providers/$providerName.tsx +++ b/web-app/src/routes/settings/providers/$providerName.tsx @@ -443,7 +443,7 @@ function ProviderDetail() { return ( <> -
+

{t('common:settings')}

diff --git a/web-app/src/routes/threads/$threadId.tsx b/web-app/src/routes/threads/$threadId.tsx index dfb2e6f47..8941bdf6c 100644 --- a/web-app/src/routes/threads/$threadId.tsx +++ b/web-app/src/routes/threads/$threadId.tsx @@ -124,7 +124,7 @@ function ThreadDetail() { if (!messages || !threadModel) return null return ( -
+
{PlatformFeatures[PlatformFeature.ASSISTANTS] && (