From cd6bfb3f694675246a67dc0466d7603a37833586 Mon Sep 17 00:00:00 2001 From: Brendan Allan Date: Sat, 6 Dec 2025 04:39:49 +0800 Subject: OpenCode Desktop app (#5044) Co-authored-by: Adam <2363879+adamdotdevin@users.noreply.github.com> --- packages/desktop/package.json | 4 + packages/desktop/src/pages/layout.tsx | 5 +- packages/desktop/vite.config.ts | 14 +- packages/desktop/vite.js | 26 + packages/tauri/index.html | 51 +- packages/tauri/package.json | 14 +- packages/tauri/scripts/copy-bundles.ts | 12 + packages/tauri/scripts/predev.ts | 17 + packages/tauri/scripts/prepare.ts | 20 + packages/tauri/scripts/utils.ts | 43 ++ packages/tauri/src-tauri/.gitignore | 2 + packages/tauri/src-tauri/Cargo.lock | 649 ++++++++++++++++++++- packages/tauri/src-tauri/Cargo.toml | 13 +- packages/tauri/src-tauri/capabilities/default.json | 9 +- packages/tauri/src-tauri/icons/128x128.png | Bin 3512 -> 793 bytes packages/tauri/src-tauri/icons/128x128@2x.png | Bin 7012 -> 1161 bytes packages/tauri/src-tauri/icons/32x32.png | Bin 974 -> 486 bytes packages/tauri/src-tauri/icons/64x64.png | Bin 0 -> 540 bytes .../tauri/src-tauri/icons/Square107x107Logo.png | Bin 2863 -> 745 bytes .../tauri/src-tauri/icons/Square142x142Logo.png | Bin 3858 -> 940 bytes .../tauri/src-tauri/icons/Square150x150Logo.png | Bin 3966 -> 952 bytes .../tauri/src-tauri/icons/Square284x284Logo.png | Bin 7737 -> 1557 bytes packages/tauri/src-tauri/icons/Square30x30Logo.png | Bin 903 -> 588 bytes .../tauri/src-tauri/icons/Square310x310Logo.png | Bin 8591 -> 1724 bytes packages/tauri/src-tauri/icons/Square44x44Logo.png | Bin 1299 -> 614 bytes packages/tauri/src-tauri/icons/Square71x71Logo.png | Bin 2011 -> 691 bytes packages/tauri/src-tauri/icons/Square89x89Logo.png | Bin 2468 -> 751 bytes packages/tauri/src-tauri/icons/StoreLogo.png | Bin 1523 -> 702 bytes .../android/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../icons/android/mipmap-hdpi/ic_launcher.png | Bin 0 -> 817 bytes .../android/mipmap-hdpi/ic_launcher_foreground.png | Bin 0 -> 1022 bytes .../android/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 944 bytes .../icons/android/mipmap-mdpi/ic_launcher.png | Bin 0 -> 735 bytes .../android/mipmap-mdpi/ic_launcher_foreground.png | Bin 0 -> 891 bytes .../android/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 797 bytes .../icons/android/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 821 bytes .../mipmap-xhdpi/ic_launcher_foreground.png | Bin 0 -> 1286 bytes .../android/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 1069 bytes .../icons/android/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 1188 bytes .../mipmap-xxhdpi/ic_launcher_foreground.png | Bin 0 -> 1667 bytes .../android/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 1471 bytes .../icons/android/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 1154 bytes .../mipmap-xxxhdpi/ic_launcher_foreground.png | Bin 0 -> 1641 bytes .../android/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 1524 bytes .../android/values/ic_launcher_background.xml | 4 + packages/tauri/src-tauri/icons/icon.icns | Bin 98451 -> 18738 bytes packages/tauri/src-tauri/icons/icon.ico | Bin 86642 -> 4669 bytes packages/tauri/src-tauri/icons/icon.png | Bin 14183 -> 1862 bytes .../tauri/src-tauri/icons/ios/AppIcon-20x20@1x.png | Bin 0 -> 420 bytes .../src-tauri/icons/ios/AppIcon-20x20@2x-1.png | Bin 0 -> 606 bytes .../tauri/src-tauri/icons/ios/AppIcon-20x20@2x.png | Bin 0 -> 606 bytes .../tauri/src-tauri/icons/ios/AppIcon-20x20@3x.png | Bin 0 -> 657 bytes .../tauri/src-tauri/icons/ios/AppIcon-29x29@1x.png | Bin 0 -> 481 bytes .../src-tauri/icons/ios/AppIcon-29x29@2x-1.png | Bin 0 -> 595 bytes .../tauri/src-tauri/icons/ios/AppIcon-29x29@2x.png | Bin 0 -> 595 bytes .../tauri/src-tauri/icons/ios/AppIcon-29x29@3x.png | Bin 0 -> 747 bytes .../tauri/src-tauri/icons/ios/AppIcon-40x40@1x.png | Bin 0 -> 606 bytes .../src-tauri/icons/ios/AppIcon-40x40@2x-1.png | Bin 0 -> 570 bytes .../tauri/src-tauri/icons/ios/AppIcon-40x40@2x.png | Bin 0 -> 570 bytes .../tauri/src-tauri/icons/ios/AppIcon-40x40@3x.png | Bin 0 -> 855 bytes .../tauri/src-tauri/icons/ios/AppIcon-512@2x.png | Bin 0 -> 7412 bytes .../tauri/src-tauri/icons/ios/AppIcon-60x60@2x.png | Bin 0 -> 855 bytes .../tauri/src-tauri/icons/ios/AppIcon-60x60@3x.png | Bin 0 -> 1085 bytes .../tauri/src-tauri/icons/ios/AppIcon-76x76@1x.png | Bin 0 -> 729 bytes .../tauri/src-tauri/icons/ios/AppIcon-76x76@2x.png | Bin 0 -> 1016 bytes .../src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png | Bin 0 -> 976 bytes packages/tauri/src-tauri/src/lib.rs | 271 ++++++++- packages/tauri/src-tauri/tauri.conf.json | 30 +- packages/tauri/src/assets/tauri.svg | 6 - packages/tauri/src/assets/typescript.svg | 25 - packages/tauri/src/assets/vite.svg | 1 - packages/tauri/src/index.ts | 1 + packages/tauri/src/main.ts | 22 - packages/tauri/src/styles.css | 116 ---- packages/tauri/vite.config.ts | 7 +- packages/ui/src/styles/tailwind/index.css | 3 +- 76 files changed, 1120 insertions(+), 250 deletions(-) create mode 100644 packages/desktop/vite.js create mode 100644 packages/tauri/scripts/copy-bundles.ts create mode 100644 packages/tauri/scripts/predev.ts create mode 100755 packages/tauri/scripts/prepare.ts create mode 100644 packages/tauri/scripts/utils.ts create mode 100644 packages/tauri/src-tauri/icons/64x64.png create mode 100644 packages/tauri/src-tauri/icons/android/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 packages/tauri/src-tauri/icons/android/mipmap-hdpi/ic_launcher.png create mode 100644 packages/tauri/src-tauri/icons/android/mipmap-hdpi/ic_launcher_foreground.png create mode 100644 packages/tauri/src-tauri/icons/android/mipmap-hdpi/ic_launcher_round.png create mode 100644 packages/tauri/src-tauri/icons/android/mipmap-mdpi/ic_launcher.png create mode 100644 packages/tauri/src-tauri/icons/android/mipmap-mdpi/ic_launcher_foreground.png create mode 100644 packages/tauri/src-tauri/icons/android/mipmap-mdpi/ic_launcher_round.png create mode 100644 packages/tauri/src-tauri/icons/android/mipmap-xhdpi/ic_launcher.png create mode 100644 packages/tauri/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_foreground.png create mode 100644 packages/tauri/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_round.png create mode 100644 packages/tauri/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher.png create mode 100644 packages/tauri/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png create mode 100644 packages/tauri/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 packages/tauri/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher.png create mode 100644 packages/tauri/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png create mode 100644 packages/tauri/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 packages/tauri/src-tauri/icons/android/values/ic_launcher_background.xml create mode 100644 packages/tauri/src-tauri/icons/ios/AppIcon-20x20@1x.png create mode 100644 packages/tauri/src-tauri/icons/ios/AppIcon-20x20@2x-1.png create mode 100644 packages/tauri/src-tauri/icons/ios/AppIcon-20x20@2x.png create mode 100644 packages/tauri/src-tauri/icons/ios/AppIcon-20x20@3x.png create mode 100644 packages/tauri/src-tauri/icons/ios/AppIcon-29x29@1x.png create mode 100644 packages/tauri/src-tauri/icons/ios/AppIcon-29x29@2x-1.png create mode 100644 packages/tauri/src-tauri/icons/ios/AppIcon-29x29@2x.png create mode 100644 packages/tauri/src-tauri/icons/ios/AppIcon-29x29@3x.png create mode 100644 packages/tauri/src-tauri/icons/ios/AppIcon-40x40@1x.png create mode 100644 packages/tauri/src-tauri/icons/ios/AppIcon-40x40@2x-1.png create mode 100644 packages/tauri/src-tauri/icons/ios/AppIcon-40x40@2x.png create mode 100644 packages/tauri/src-tauri/icons/ios/AppIcon-40x40@3x.png create mode 100644 packages/tauri/src-tauri/icons/ios/AppIcon-512@2x.png create mode 100644 packages/tauri/src-tauri/icons/ios/AppIcon-60x60@2x.png create mode 100644 packages/tauri/src-tauri/icons/ios/AppIcon-60x60@3x.png create mode 100644 packages/tauri/src-tauri/icons/ios/AppIcon-76x76@1x.png create mode 100644 packages/tauri/src-tauri/icons/ios/AppIcon-76x76@2x.png create mode 100644 packages/tauri/src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png delete mode 100644 packages/tauri/src/assets/tauri.svg delete mode 100644 packages/tauri/src/assets/typescript.svg delete mode 100644 packages/tauri/src/assets/vite.svg create mode 100644 packages/tauri/src/index.ts delete mode 100644 packages/tauri/src/main.ts delete mode 100644 packages/tauri/src/styles.css (limited to 'packages') diff --git a/packages/desktop/package.json b/packages/desktop/package.json index 089bd5687..7d345aa7a 100644 --- a/packages/desktop/package.json +++ b/packages/desktop/package.json @@ -3,6 +3,10 @@ "version": "1.0.133", "description": "", "type": "module", + "exports": { + ".": "./src/index.tsx", + "./vite": "./vite.js" + }, "scripts": { "typecheck": "tsgo --noEmit", "start": "vite", diff --git a/packages/desktop/src/pages/layout.tsx b/packages/desktop/src/pages/layout.tsx index 658ad4bcb..29083cf6c 100644 --- a/packages/desktop/src/pages/layout.tsx +++ b/packages/desktop/src/pages/layout.tsx @@ -35,7 +35,7 @@ export default function Layout(props: ParentProps) { return (
-
+
@@ -215,7 +216,7 @@ export default function Layout(props: ParentProps) { >
- - - - Tauri App - + + + OpenCode + + + + + + + + + - - -
-

Welcome to Tauri

- - -

Click on the Tauri logo to learn more about the framework

- -
- - -
-

-
+ + + +
+ diff --git a/packages/tauri/package.json b/packages/tauri/package.json index 9c3964dba..ebeb587ec 100644 --- a/packages/tauri/package.json +++ b/packages/tauri/package.json @@ -4,18 +4,26 @@ "version": "1.0.133", "type": "module", "scripts": { + "predev": "bun ./scripts/predev.ts", "dev": "vite", "build": "tsc && vite build", "preview": "vite preview", "tauri": "tauri" }, "dependencies": { + "@opencode-ai/desktop": "workspace:*", "@tauri-apps/api": "^2", - "@tauri-apps/plugin-opener": "^2" + "@tauri-apps/plugin-dialog": "~2", + "@tauri-apps/plugin-opener": "^2", + "@tauri-apps/plugin-shell": "~2", + "@tauri-apps/plugin-updater": "~2", + "solid-js": "catalog:" }, "devDependencies": { + "@actions/artifact": "4.0.0", "@tauri-apps/cli": "^2", - "vite": "^6.0.3", - "typescript": "~5.6.2" + "@types/bun": "catalog:", + "typescript": "~5.6.2", + "vite": "catalog:" } } diff --git a/packages/tauri/scripts/copy-bundles.ts b/packages/tauri/scripts/copy-bundles.ts new file mode 100644 index 000000000..3fde1c190 --- /dev/null +++ b/packages/tauri/scripts/copy-bundles.ts @@ -0,0 +1,12 @@ +import { $ } from "bun" +import * as path from "node:path" + +import { RUST_TARGET } from "./utils" + +if (!RUST_TARGET) throw new Error("RUST_TARGET not defined") + +const BUNDLE_DIR = `src-tauri/target/${RUST_TARGET}/release/bundle` +const BUNDLES_OUT_DIR = path.join(process.cwd(), `src-tauri/target/bundles`) + +await $`mkdir -p ${BUNDLES_OUT_DIR}` +await $`cp -r ${BUNDLE_DIR}/*/OpenCode* ${BUNDLES_OUT_DIR}` diff --git a/packages/tauri/scripts/predev.ts b/packages/tauri/scripts/predev.ts new file mode 100644 index 000000000..bd9320a4a --- /dev/null +++ b/packages/tauri/scripts/predev.ts @@ -0,0 +1,17 @@ +import * as fs from "node:fs/promises" +import { $ } from "bun" + +import { copyBinaryToSidecarFolder, getCurrentSidecar } from "./utils" + +const RUST_TARGET = Bun.env.TAURI_ENV_TARGET_TRIPLE + +const sidecarConfig = getCurrentSidecar(RUST_TARGET) + +const binaryPath = `../opencode/dist/${sidecarConfig.ocBinary}/bin/opencode` + +if (!(await fs.exists(binaryPath))) { + console.log("opencode binary not found, building...") + await $`cd ../opencode && bun run build --single` +} + +await copyBinaryToSidecarFolder(binaryPath, RUST_TARGET) diff --git a/packages/tauri/scripts/prepare.ts b/packages/tauri/scripts/prepare.ts new file mode 100755 index 000000000..c49758432 --- /dev/null +++ b/packages/tauri/scripts/prepare.ts @@ -0,0 +1,20 @@ +#!/usr/bin/env bun + +import { $ } from "bun" + +import { copyBinaryToSidecarFolder, getCurrentSidecar } from "./utils" + +const sidecarConfig = getCurrentSidecar() + +const dir = "src-tauri/target/opencode-binaries" + +await $`mkdir -p ${dir}` +await $`gh release download --pattern ${sidecarConfig.ocBinary}.${sidecarConfig.assetExt} --repo sst/opencode --skip-existing --dir ${dir}` + +if (sidecarConfig.assetExt === "tar.gz") { + await $`tar -xvzf ${dir}/${sidecarConfig.ocBinary}.${sidecarConfig.assetExt} -C ${dir}` +} else { + await $`unzip -o ${dir}/${sidecarConfig.ocBinary}.${sidecarConfig.assetExt} -d ${dir}` +} + +await copyBinaryToSidecarFolder(`${dir}/opencode${process.platform === "win32" ? ".exe" : ""}`) diff --git a/packages/tauri/scripts/utils.ts b/packages/tauri/scripts/utils.ts new file mode 100644 index 000000000..b2885d00a --- /dev/null +++ b/packages/tauri/scripts/utils.ts @@ -0,0 +1,43 @@ +import { $ } from "bun" + +export const SIDECAR_BINARIES: Array<{ rustTarget: string; ocBinary: string; assetExt: string }> = [ + { + rustTarget: "aarch64-apple-darwin", + ocBinary: "opencode-darwin-arm64", + assetExt: "zip", + }, + { + rustTarget: "x86_64-apple-darwin", + ocBinary: "opencode-darwin-x64", + assetExt: "zip", + }, + { + rustTarget: "x86_64-pc-windows-msvc", + ocBinary: "opencode-windows-x64", + assetExt: "zip", + }, + { + rustTarget: "x86_64-unknown-linux-gnu", + ocBinary: "opencode-linux-x64", + assetExt: "tar.gz", + }, +] + +export const RUST_TARGET = Bun.env.RUST_TARGET + +export function getCurrentSidecar(target = RUST_TARGET) { + if (!target && !RUST_TARGET) throw new Error("RUST_TARGET not set") + + const binaryConfig = SIDECAR_BINARIES.find((b) => b.rustTarget === target) + if (!binaryConfig) throw new Error(`Sidecar configuration not available for Rust target '${RUST_TARGET}'`) + + return binaryConfig +} + +export async function copyBinaryToSidecarFolder(source: string, target = RUST_TARGET) { + await $`mkdir -p src-tauri/sidecars` + const dest = `src-tauri/sidecars/opencode-${target}${process.platform === "win32" ? ".exe" : ""}` + await $`cp ${source} ${dest}` + + console.log(`Copied ${source} to ${dest}`) +} diff --git a/packages/tauri/src-tauri/.gitignore b/packages/tauri/src-tauri/.gitignore index b21bd681d..67554e174 100644 --- a/packages/tauri/src-tauri/.gitignore +++ b/packages/tauri/src-tauri/.gitignore @@ -5,3 +5,5 @@ # Generated by Tauri # will have schema files for capabilities auto-completion /gen/schemas + +sidecars diff --git a/packages/tauri/src-tauri/Cargo.lock b/packages/tauri/src-tauri/Cargo.lock index 6fc6d04b9..aaa7429eb 100644 --- a/packages/tauri/src-tauri/Cargo.lock +++ b/packages/tauri/src-tauri/Cargo.lock @@ -47,6 +47,36 @@ version = "1.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" +[[package]] +name = "arbitrary" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" +dependencies = [ + "derive_arbitrary", +] + +[[package]] +name = "ashpd" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6cbdf310d77fd3aaee6ea2093db7011dc2d35d2eb3481e5607f1f8d942ed99df" +dependencies = [ + "enumflags2", + "futures-channel", + "futures-util", + "rand 0.9.2", + "raw-window-handle", + "serde", + "serde_repr", + "tokio", + "url", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "zbus", +] + [[package]] name = "async-broadcast" version = "0.7.2" @@ -656,6 +686,17 @@ dependencies = [ "serde_core", ] +[[package]] +name = "derive_arbitrary" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.110", +] + [[package]] name = "derive_more" version = "0.99.20" @@ -713,6 +754,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" dependencies = [ "bitflags 2.10.0", + "block2 0.6.2", + "libc", "objc2 0.6.3", ] @@ -727,6 +770,15 @@ dependencies = [ "syn 2.0.110", ] +[[package]] +name = "dlib" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" +dependencies = [ + "libloading", +] + [[package]] name = "dlopen2" version = "0.8.0" @@ -750,6 +802,12 @@ dependencies = [ "syn 2.0.110", ] +[[package]] +name = "downcast-rs" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" + [[package]] name = "dpi" version = "0.1.2" @@ -806,6 +864,15 @@ version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7" +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + [[package]] name = "endi" version = "1.1.0" @@ -906,6 +973,18 @@ dependencies = [ "rustc_version", ] +[[package]] +name = "filetime" +version = "0.2.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc0505cd1b6fa6580283f6bdf70a73fcf4aba1184038c90902b92b3dd0df63ed" +dependencies = [ + "cfg-if", + "libc", + "libredox", + "windows-sys 0.60.2", +] + [[package]] name = "find-msvc-tools" version = "0.1.5" @@ -1195,8 +1274,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" dependencies = [ "cfg-if", + "js-sys", "libc", "wasi 0.11.1+wasi-snapshot-preview1", + "wasm-bindgen", ] [[package]] @@ -1206,9 +1287,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" dependencies = [ "cfg-if", + "js-sys", "libc", "r-efi", "wasip2", + "wasm-bindgen", ] [[package]] @@ -1468,6 +1551,23 @@ dependencies = [ "want", ] +[[package]] +name = "hyper-rustls" +version = "0.27.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" +dependencies = [ + "http", + "hyper", + "hyper-util", + "rustls", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tower-service", + "webpki-roots", +] + [[package]] name = "hyper-util" version = "0.1.18" @@ -1861,6 +1961,7 @@ checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" dependencies = [ "bitflags 2.10.0", "libc", + "redox_syscall", ] [[package]] @@ -1869,6 +1970,17 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" +[[package]] +name = "listeners" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "557f908c6cb431dd2496687aa9ea326507110ee4780517a42ade2df25d31126c" +dependencies = [ + "byteorder", + "rustix", + "windows", +] + [[package]] name = "litemap" version = "0.8.1" @@ -1890,6 +2002,12 @@ version = "0.4.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" +[[package]] +name = "lru-slab" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" + [[package]] name = "mac" version = "0.1.1" @@ -1948,6 +2066,12 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" +[[package]] +name = "minisign-verify" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e856fdd13623a2f5f2f54676a4ee49502a96a80ef4a62bcedd23d52427c44d43" + [[package]] name = "miniz_oxide" version = "0.8.9" @@ -2283,6 +2407,18 @@ dependencies = [ "objc2-foundation 0.2.2", ] +[[package]] +name = "objc2-osa-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f112d1746737b0da274ef79a23aac283376f335f4095a083a267a082f21db0c0" +dependencies = [ + "bitflags 2.10.0", + "objc2 0.6.3", + "objc2-app-kit", + "objc2-foundation 0.3.2", +] + [[package]] name = "objc2-quartz-core" version = "0.2.2" @@ -2365,14 +2501,19 @@ dependencies = [ ] [[package]] -name = "opencode" -version = "0.1.0" +name = "opencode-desktop" +version = "0.0.0" dependencies = [ + "listeners", "serde", "serde_json", "tauri", "tauri-build", + "tauri-plugin-dialog", "tauri-plugin-opener", + "tauri-plugin-shell", + "tauri-plugin-updater", + "tokio", ] [[package]] @@ -2391,6 +2532,30 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "os_pipe" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d8fae84b431384b68627d0f9b3b1245fcf9f46f6c0e3dc902e9dce64edd1967" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "osakit" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "732c71caeaa72c065bb69d7ea08717bd3f4863a4f451402fc9513e29dbd5261b" +dependencies = [ + "objc2 0.6.3", + "objc2-foundation 0.3.2", + "objc2-osa-kit", + "serde", + "serde_json", + "thiserror 2.0.17", +] + [[package]] name = "pango" version = "0.18.3" @@ -2628,7 +2793,7 @@ checksum = "740ebea15c5d1428f910cd1a5f52cebf8d25006245ed8ade92702f4943d91e07" dependencies = [ "base64 0.22.1", "indexmap 2.12.1", - "quick-xml", + "quick-xml 0.38.4", "serde", "time", ] @@ -2758,6 +2923,15 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "quick-xml" +version = "0.37.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "331e97a1af0bf59823e6eadffe373d7b27f485be8748f71471c662c1f269b7fb" +dependencies = [ + "memchr", +] + [[package]] name = "quick-xml" version = "0.38.4" @@ -2767,6 +2941,61 @@ dependencies = [ "memchr", ] +[[package]] +name = "quinn" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" +dependencies = [ + "bytes", + "cfg_aliases", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls", + "socket2", + "thiserror 2.0.17", + "tokio", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-proto" +version = "0.11.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" +dependencies = [ + "bytes", + "getrandom 0.3.4", + "lru-slab", + "rand 0.9.2", + "ring", + "rustc-hash", + "rustls", + "rustls-pki-types", + "slab", + "thiserror 2.0.17", + "tinyvec", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-udp" +version = "0.5.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" +dependencies = [ + "cfg_aliases", + "libc", + "once_cell", + "socket2", + "tracing", + "windows-sys 0.60.2", +] + [[package]] name = "quote" version = "1.0.42" @@ -2807,6 +3036,16 @@ dependencies = [ "rand_core 0.6.4", ] +[[package]] +name = "rand" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.3", +] + [[package]] name = "rand_chacha" version = "0.2.2" @@ -2827,6 +3066,16 @@ dependencies = [ "rand_core 0.6.4", ] +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.3", +] + [[package]] name = "rand_core" version = "0.5.1" @@ -2845,6 +3094,15 @@ dependencies = [ "getrandom 0.2.16", ] +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom 0.3.4", +] + [[package]] name = "rand_hc" version = "0.2.0" @@ -2952,16 +3210,21 @@ dependencies = [ "http-body", "http-body-util", "hyper", + "hyper-rustls", "hyper-util", "js-sys", "log", "percent-encoding", "pin-project-lite", + "quinn", + "rustls", + "rustls-pki-types", "serde", "serde_json", "serde_urlencoded", "sync_wrapper", "tokio", + "tokio-rustls", "tokio-util", "tower", "tower-http", @@ -2971,8 +3234,54 @@ dependencies = [ "wasm-bindgen-futures", "wasm-streams", "web-sys", + "webpki-roots", +] + +[[package]] +name = "rfd" +version = "0.15.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef2bee61e6cffa4635c72d7d81a84294e28f0930db0ddcb0f66d10244674ebed" +dependencies = [ + "ashpd", + "block2 0.6.2", + "dispatch2", + "glib-sys", + "gobject-sys", + "gtk-sys", + "js-sys", + "log", + "objc2 0.6.3", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation 0.3.2", + "raw-window-handle", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "windows-sys 0.59.0", ] +[[package]] +name = "ring" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.16", + "libc", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustc-hash" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" + [[package]] name = "rustc_version" version = "0.4.1" @@ -2995,6 +3304,41 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "rustls" +version = "0.23.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "533f54bc6a7d4f647e46ad909549eda97bf5afc1585190ef692b4286b198bd8f" +dependencies = [ + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-pki-types" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "708c0f9d5f54ba0272468c1d306a52c495b31fa155e91bc25371e6df7996908c" +dependencies = [ + "web-time", + "zeroize", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ffdfa2f5286e2247234e03f680868ac2815974dc39e00ea15adc445d0aafe52" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + [[package]] name = "rustversion" version = "1.0.22" @@ -3067,6 +3411,12 @@ dependencies = [ "syn 2.0.110", ] +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + [[package]] name = "scopeguard" version = "1.2.0" @@ -3282,12 +3632,44 @@ dependencies = [ "digest", ] +[[package]] +name = "shared_child" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e362d9935bc50f019969e2f9ecd66786612daae13e8f277be7bfb66e8bed3f7" +dependencies = [ + "libc", + "sigchld", + "windows-sys 0.60.2", +] + [[package]] name = "shlex" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +[[package]] +name = "sigchld" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47106eded3c154e70176fc83df9737335c94ce22f821c32d17ed1db1f83badb1" +dependencies = [ + "libc", + "os_pipe", + "signal-hook", +] + +[[package]] +name = "signal-hook" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d881a16cf4426aa584979d30bd82cb33429027e42122b169753d6ef1085ed6e2" +dependencies = [ + "libc", + "signal-hook-registry", +] + [[package]] name = "signal-hook-registry" version = "1.4.6" @@ -3428,6 +3810,12 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + [[package]] name = "swift-rs" version = "1.0.7" @@ -3545,6 +3933,17 @@ dependencies = [ "syn 2.0.110", ] +[[package]] +name = "tar" +version = "0.4.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d863878d212c87a19c1a610eb53bb01fe12951c0501cf5a0d65f724914a667a" +dependencies = [ + "filetime", + "libc", + "xattr", +] + [[package]] name = "target-lexicon" version = "0.12.16" @@ -3682,6 +4081,46 @@ dependencies = [ "walkdir", ] +[[package]] +name = "tauri-plugin-dialog" +version = "2.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "313f8138692ddc4a2127c4c9607d616a46f5c042e77b3722450866da0aad2f19" +dependencies = [ + "log", + "raw-window-handle", + "rfd", + "serde", + "serde_json", + "tauri", + "tauri-plugin", + "tauri-plugin-fs", + "thiserror 2.0.17", + "url", +] + +[[package]] +name = "tauri-plugin-fs" +version = "2.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47df422695255ecbe7bac7012440eddaeefd026656171eac9559f5243d3230d9" +dependencies = [ + "anyhow", + "dunce", + "glob", + "percent-encoding", + "schemars 0.8.22", + "serde", + "serde_json", + "serde_repr", + "tauri", + "tauri-plugin", + "tauri-utils", + "thiserror 2.0.17", + "toml 0.9.8", + "url", +] + [[package]] name = "tauri-plugin-opener" version = "2.5.2" @@ -3704,6 +4143,59 @@ dependencies = [ "zbus", ] +[[package]] +name = "tauri-plugin-shell" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c374b6db45f2a8a304f0273a15080d98c70cde86178855fc24653ba657a1144c" +dependencies = [ + "encoding_rs", + "log", + "open", + "os_pipe", + "regex", + "schemars 0.8.22", + "serde", + "serde_json", + "shared_child", + "tauri", + "tauri-plugin", + "thiserror 2.0.17", + "tokio", +] + +[[package]] +name = "tauri-plugin-updater" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27cbc31740f4d507712550694749572ec0e43bdd66992db7599b89fbfd6b167b" +dependencies = [ + "base64 0.22.1", + "dirs", + "flate2", + "futures-util", + "http", + "infer", + "log", + "minisign-verify", + "osakit", + "percent-encoding", + "reqwest", + "semver", + "serde", + "serde_json", + "tar", + "tauri", + "tauri-plugin", + "tempfile", + "thiserror 2.0.17", + "time", + "tokio", + "url", + "windows-sys 0.60.2", + "zip", +] + [[package]] name = "tauri-runtime" version = "2.9.1" @@ -3910,6 +4402,21 @@ dependencies = [ "zerovec", ] +[[package]] +name = "tinyvec" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + [[package]] name = "tokio" version = "1.48.0" @@ -3920,10 +4427,22 @@ dependencies = [ "libc", "mio", "pin-project-lite", + "signal-hook-registry", "socket2", + "tracing", "windows-sys 0.61.2", ] +[[package]] +name = "tokio-rustls" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" +dependencies = [ + "rustls", + "tokio", +] + [[package]] name = "tokio-util" version = "0.7.17" @@ -4213,6 +4732,12 @@ version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + [[package]] name = "url" version = "2.5.7" @@ -4404,6 +4929,66 @@ dependencies = [ "web-sys", ] +[[package]] +name = "wayland-backend" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "673a33c33048a5ade91a6b139580fa174e19fb0d23f396dca9fa15f2e1e49b35" +dependencies = [ + "cc", + "downcast-rs", + "rustix", + "scoped-tls", + "smallvec", + "wayland-sys", +] + +[[package]] +name = "wayland-client" +version = "0.31.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c66a47e840dc20793f2264eb4b3e4ecb4b75d91c0dd4af04b456128e0bdd449d" +dependencies = [ + "bitflags 2.10.0", + "rustix", + "wayland-backend", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols" +version = "0.32.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efa790ed75fbfd71283bd2521a1cfdc022aabcc28bdcff00851f9e4ae88d9901" +dependencies = [ + "bitflags 2.10.0", + "wayland-backend", + "wayland-client", + "wayland-scanner", +] + +[[package]] +name = "wayland-scanner" +version = "0.31.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54cb1e9dc49da91950bdfd8b848c49330536d9d1fb03d4bfec8cae50caa50ae3" +dependencies = [ + "proc-macro2", + "quick-xml 0.37.5", + "quote", +] + +[[package]] +name = "wayland-sys" +version = "0.31.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34949b42822155826b41db8e5d0c1be3a2bd296c747577a43a3e6daefc296142" +dependencies = [ + "dlib", + "log", + "pkg-config", +] + [[package]] name = "web-sys" version = "0.3.82" @@ -4414,6 +4999,16 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + [[package]] name = "webkit2gtk" version = "2.0.1" @@ -4458,6 +5053,15 @@ dependencies = [ "system-deps", ] +[[package]] +name = "webpki-roots" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2878ef029c47c6e8cf779119f20fcf52bde7ad42a731b2a304bc221df17571e" +dependencies = [ + "rustls-pki-types", +] + [[package]] name = "webview2-com" version = "0.38.0" @@ -4688,6 +5292,15 @@ dependencies = [ "windows-targets 0.42.2", ] +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + [[package]] name = "windows-sys" version = "0.59.0" @@ -5025,6 +5638,16 @@ dependencies = [ "pkg-config", ] +[[package]] +name = "xattr" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32e45ad4206f6d2479085147f02bc2ef834ac85886624a23575ae137c8aa8156" +dependencies = [ + "libc", + "rustix", +] + [[package]] name = "yoke" version = "0.8.1" @@ -5072,6 +5695,7 @@ dependencies = [ "ordered-stream", "serde", "serde_repr", + "tokio", "tracing", "uds_windows", "uuid", @@ -5150,6 +5774,12 @@ dependencies = [ "synstructure", ] +[[package]] +name = "zeroize" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" + [[package]] name = "zerotrie" version = "0.2.3" @@ -5183,6 +5813,18 @@ dependencies = [ "syn 2.0.110", ] +[[package]] +name = "zip" +version = "4.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caa8cd6af31c3b31c6631b8f483848b91589021b28fffe50adada48d4f4d2ed1" +dependencies = [ + "arbitrary", + "crc32fast", + "indexmap 2.12.1", + "memchr", +] + [[package]] name = "zvariant" version = "5.8.0" @@ -5192,6 +5834,7 @@ dependencies = [ "endi", "enumflags2", "serde", + "url", "winnow 0.7.13", "zvariant_derive", "zvariant_utils", diff --git a/packages/tauri/src-tauri/Cargo.toml b/packages/tauri/src-tauri/Cargo.toml index f9542007b..dd893d6e3 100644 --- a/packages/tauri/src-tauri/Cargo.toml +++ b/packages/tauri/src-tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] -name = "opencode" -version = "0.1.0" +name = "opencode-desktop" +version = "0.0.0" description = "A Tauri App" authors = ["you"] edition = "2021" @@ -18,8 +18,13 @@ crate-type = ["staticlib", "cdylib", "rlib"] tauri-build = { version = "2", features = [] } [dependencies] -tauri = { version = "2", features = [] } +tauri = { version = "2", features = ["macos-private-api", "devtools"] } tauri-plugin-opener = "2" +tauri-plugin-shell = "2" +tauri-plugin-dialog = "2" +tauri-plugin-updater = "2" + serde = { version = "1", features = ["derive"] } serde_json = "1" - +tokio = "1.48.0" +listeners = "0.3" diff --git a/packages/tauri/src-tauri/capabilities/default.json b/packages/tauri/src-tauri/capabilities/default.json index f77836402..12f94213e 100644 --- a/packages/tauri/src-tauri/capabilities/default.json +++ b/packages/tauri/src-tauri/capabilities/default.json @@ -3,5 +3,12 @@ "identifier": "default", "description": "Capability for the main window", "windows": ["main"], - "permissions": ["core:default", "opener:default"] + "permissions": [ + "core:default", + "opener:default", + "core:window:allow-start-dragging", + "shell:default", + "updater:default", + "dialog:default" + ] } diff --git a/packages/tauri/src-tauri/icons/128x128.png b/packages/tauri/src-tauri/icons/128x128.png index 6be5e50e9..57d061b44 100644 Binary files a/packages/tauri/src-tauri/icons/128x128.png and b/packages/tauri/src-tauri/icons/128x128.png differ diff --git a/packages/tauri/src-tauri/icons/128x128@2x.png b/packages/tauri/src-tauri/icons/128x128@2x.png index e81becee5..a87a4c3cc 100644 Binary files a/packages/tauri/src-tauri/icons/128x128@2x.png and b/packages/tauri/src-tauri/icons/128x128@2x.png differ diff --git a/packages/tauri/src-tauri/icons/32x32.png b/packages/tauri/src-tauri/icons/32x32.png index a437dd517..8383b4730 100644 Binary files a/packages/tauri/src-tauri/icons/32x32.png and b/packages/tauri/src-tauri/icons/32x32.png differ diff --git a/packages/tauri/src-tauri/icons/64x64.png b/packages/tauri/src-tauri/icons/64x64.png new file mode 100644 index 000000000..ef3b81179 Binary files /dev/null and b/packages/tauri/src-tauri/icons/64x64.png differ diff --git a/packages/tauri/src-tauri/icons/Square107x107Logo.png b/packages/tauri/src-tauri/icons/Square107x107Logo.png index 0ca4f2719..c80eb8909 100644 Binary files a/packages/tauri/src-tauri/icons/Square107x107Logo.png and b/packages/tauri/src-tauri/icons/Square107x107Logo.png differ diff --git a/packages/tauri/src-tauri/icons/Square142x142Logo.png b/packages/tauri/src-tauri/icons/Square142x142Logo.png index b81f82039..bb767ed97 100644 Binary files a/packages/tauri/src-tauri/icons/Square142x142Logo.png and b/packages/tauri/src-tauri/icons/Square142x142Logo.png differ diff --git a/packages/tauri/src-tauri/icons/Square150x150Logo.png b/packages/tauri/src-tauri/icons/Square150x150Logo.png index 624c7bfba..15cc8e0d2 100644 Binary files a/packages/tauri/src-tauri/icons/Square150x150Logo.png and b/packages/tauri/src-tauri/icons/Square150x150Logo.png differ diff --git a/packages/tauri/src-tauri/icons/Square284x284Logo.png b/packages/tauri/src-tauri/icons/Square284x284Logo.png index c021d2ba7..5d78834e0 100644 Binary files a/packages/tauri/src-tauri/icons/Square284x284Logo.png and b/packages/tauri/src-tauri/icons/Square284x284Logo.png differ diff --git a/packages/tauri/src-tauri/icons/Square30x30Logo.png b/packages/tauri/src-tauri/icons/Square30x30Logo.png index 621970023..f78bf4c5a 100644 Binary files a/packages/tauri/src-tauri/icons/Square30x30Logo.png and b/packages/tauri/src-tauri/icons/Square30x30Logo.png differ diff --git a/packages/tauri/src-tauri/icons/Square310x310Logo.png b/packages/tauri/src-tauri/icons/Square310x310Logo.png index f9bc04839..2419f9209 100644 Binary files a/packages/tauri/src-tauri/icons/Square310x310Logo.png and b/packages/tauri/src-tauri/icons/Square310x310Logo.png differ diff --git a/packages/tauri/src-tauri/icons/Square44x44Logo.png b/packages/tauri/src-tauri/icons/Square44x44Logo.png index d5fbfb2ab..3f665e55a 100644 Binary files a/packages/tauri/src-tauri/icons/Square44x44Logo.png and b/packages/tauri/src-tauri/icons/Square44x44Logo.png differ diff --git a/packages/tauri/src-tauri/icons/Square71x71Logo.png b/packages/tauri/src-tauri/icons/Square71x71Logo.png index 63440d798..f4d9d20d8 100644 Binary files a/packages/tauri/src-tauri/icons/Square71x71Logo.png and b/packages/tauri/src-tauri/icons/Square71x71Logo.png differ diff --git a/packages/tauri/src-tauri/icons/Square89x89Logo.png b/packages/tauri/src-tauri/icons/Square89x89Logo.png index f3f705af2..07be723db 100644 Binary files a/packages/tauri/src-tauri/icons/Square89x89Logo.png and b/packages/tauri/src-tauri/icons/Square89x89Logo.png differ diff --git a/packages/tauri/src-tauri/icons/StoreLogo.png b/packages/tauri/src-tauri/icons/StoreLogo.png index 455638826..3e78e8d3e 100644 Binary files a/packages/tauri/src-tauri/icons/StoreLogo.png and b/packages/tauri/src-tauri/icons/StoreLogo.png differ diff --git a/packages/tauri/src-tauri/icons/android/mipmap-anydpi-v26/ic_launcher.xml b/packages/tauri/src-tauri/icons/android/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 000000000..2ffbf24b6 --- /dev/null +++ b/packages/tauri/src-tauri/icons/android/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/packages/tauri/src-tauri/icons/android/mipmap-hdpi/ic_launcher.png b/packages/tauri/src-tauri/icons/android/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..6e500bb7e Binary files /dev/null and b/packages/tauri/src-tauri/icons/android/mipmap-hdpi/ic_launcher.png differ diff --git a/packages/tauri/src-tauri/icons/android/mipmap-hdpi/ic_launcher_foreground.png b/packages/tauri/src-tauri/icons/android/mipmap-hdpi/ic_launcher_foreground.png new file mode 100644 index 000000000..23b5818ac Binary files /dev/null and b/packages/tauri/src-tauri/icons/android/mipmap-hdpi/ic_launcher_foreground.png differ diff --git a/packages/tauri/src-tauri/icons/android/mipmap-hdpi/ic_launcher_round.png b/packages/tauri/src-tauri/icons/android/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 000000000..69d1023ec Binary files /dev/null and b/packages/tauri/src-tauri/icons/android/mipmap-hdpi/ic_launcher_round.png differ diff --git a/packages/tauri/src-tauri/icons/android/mipmap-mdpi/ic_launcher.png b/packages/tauri/src-tauri/icons/android/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..e67031171 Binary files /dev/null and b/packages/tauri/src-tauri/icons/android/mipmap-mdpi/ic_launcher.png differ diff --git a/packages/tauri/src-tauri/icons/android/mipmap-mdpi/ic_launcher_foreground.png b/packages/tauri/src-tauri/icons/android/mipmap-mdpi/ic_launcher_foreground.png new file mode 100644 index 000000000..d274f1c9d Binary files /dev/null and b/packages/tauri/src-tauri/icons/android/mipmap-mdpi/ic_launcher_foreground.png differ diff --git a/packages/tauri/src-tauri/icons/android/mipmap-mdpi/ic_launcher_round.png b/packages/tauri/src-tauri/icons/android/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 000000000..167af3864 Binary files /dev/null and b/packages/tauri/src-tauri/icons/android/mipmap-mdpi/ic_launcher_round.png differ diff --git a/packages/tauri/src-tauri/icons/android/mipmap-xhdpi/ic_launcher.png b/packages/tauri/src-tauri/icons/android/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..237b8fb29 Binary files /dev/null and b/packages/tauri/src-tauri/icons/android/mipmap-xhdpi/ic_launcher.png differ diff --git a/packages/tauri/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_foreground.png b/packages/tauri/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_foreground.png new file mode 100644 index 000000000..d6299e807 Binary files /dev/null and b/packages/tauri/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_foreground.png differ diff --git a/packages/tauri/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_round.png b/packages/tauri/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 000000000..999e00638 Binary files /dev/null and b/packages/tauri/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/packages/tauri/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher.png b/packages/tauri/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..262667374 Binary files /dev/null and b/packages/tauri/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher.png differ diff --git a/packages/tauri/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png b/packages/tauri/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png new file mode 100644 index 000000000..4e04fbca4 Binary files /dev/null and b/packages/tauri/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png differ diff --git a/packages/tauri/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_round.png b/packages/tauri/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 000000000..cda7c3e6d Binary files /dev/null and b/packages/tauri/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/packages/tauri/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher.png b/packages/tauri/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..cb9d5ef52 Binary files /dev/null and b/packages/tauri/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/packages/tauri/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png b/packages/tauri/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png new file mode 100644 index 000000000..557ddef40 Binary files /dev/null and b/packages/tauri/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png differ diff --git a/packages/tauri/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_round.png b/packages/tauri/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 000000000..df0abee51 Binary files /dev/null and b/packages/tauri/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/packages/tauri/src-tauri/icons/android/values/ic_launcher_background.xml b/packages/tauri/src-tauri/icons/android/values/ic_launcher_background.xml new file mode 100644 index 000000000..ea9c223a6 --- /dev/null +++ b/packages/tauri/src-tauri/icons/android/values/ic_launcher_background.xml @@ -0,0 +1,4 @@ + + + #fff + \ No newline at end of file diff --git a/packages/tauri/src-tauri/icons/icon.icns b/packages/tauri/src-tauri/icons/icon.icns index 12a5bcee2..8a6b43f96 100644 Binary files a/packages/tauri/src-tauri/icons/icon.icns and b/packages/tauri/src-tauri/icons/icon.icns differ diff --git a/packages/tauri/src-tauri/icons/icon.ico b/packages/tauri/src-tauri/icons/icon.ico index b3636e4b2..7749a74b1 100644 Binary files a/packages/tauri/src-tauri/icons/icon.ico and b/packages/tauri/src-tauri/icons/icon.ico differ diff --git a/packages/tauri/src-tauri/icons/icon.png b/packages/tauri/src-tauri/icons/icon.png index e1cd2619e..ae5fdabbe 100644 Binary files a/packages/tauri/src-tauri/icons/icon.png and b/packages/tauri/src-tauri/icons/icon.png differ diff --git a/packages/tauri/src-tauri/icons/ios/AppIcon-20x20@1x.png b/packages/tauri/src-tauri/icons/ios/AppIcon-20x20@1x.png new file mode 100644 index 000000000..36d7ee388 Binary files /dev/null and b/packages/tauri/src-tauri/icons/ios/AppIcon-20x20@1x.png differ diff --git a/packages/tauri/src-tauri/icons/ios/AppIcon-20x20@2x-1.png b/packages/tauri/src-tauri/icons/ios/AppIcon-20x20@2x-1.png new file mode 100644 index 000000000..871f8e39d Binary files /dev/null and b/packages/tauri/src-tauri/icons/ios/AppIcon-20x20@2x-1.png differ diff --git a/packages/tauri/src-tauri/icons/ios/AppIcon-20x20@2x.png b/packages/tauri/src-tauri/icons/ios/AppIcon-20x20@2x.png new file mode 100644 index 000000000..871f8e39d Binary files /dev/null and b/packages/tauri/src-tauri/icons/ios/AppIcon-20x20@2x.png differ diff --git a/packages/tauri/src-tauri/icons/ios/AppIcon-20x20@3x.png b/packages/tauri/src-tauri/icons/ios/AppIcon-20x20@3x.png new file mode 100644 index 000000000..007046c4a Binary files /dev/null and b/packages/tauri/src-tauri/icons/ios/AppIcon-20x20@3x.png differ diff --git a/packages/tauri/src-tauri/icons/ios/AppIcon-29x29@1x.png b/packages/tauri/src-tauri/icons/ios/AppIcon-29x29@1x.png new file mode 100644 index 000000000..288506f61 Binary files /dev/null and b/packages/tauri/src-tauri/icons/ios/AppIcon-29x29@1x.png differ diff --git a/packages/tauri/src-tauri/icons/ios/AppIcon-29x29@2x-1.png b/packages/tauri/src-tauri/icons/ios/AppIcon-29x29@2x-1.png new file mode 100644 index 000000000..013281df8 Binary files /dev/null and b/packages/tauri/src-tauri/icons/ios/AppIcon-29x29@2x-1.png differ diff --git a/packages/tauri/src-tauri/icons/ios/AppIcon-29x29@2x.png b/packages/tauri/src-tauri/icons/ios/AppIcon-29x29@2x.png new file mode 100644 index 000000000..013281df8 Binary files /dev/null and b/packages/tauri/src-tauri/icons/ios/AppIcon-29x29@2x.png differ diff --git a/packages/tauri/src-tauri/icons/ios/AppIcon-29x29@3x.png b/packages/tauri/src-tauri/icons/ios/AppIcon-29x29@3x.png new file mode 100644 index 000000000..b042fbdda Binary files /dev/null and b/packages/tauri/src-tauri/icons/ios/AppIcon-29x29@3x.png differ diff --git a/packages/tauri/src-tauri/icons/ios/AppIcon-40x40@1x.png b/packages/tauri/src-tauri/icons/ios/AppIcon-40x40@1x.png new file mode 100644 index 000000000..871f8e39d Binary files /dev/null and b/packages/tauri/src-tauri/icons/ios/AppIcon-40x40@1x.png differ diff --git a/packages/tauri/src-tauri/icons/ios/AppIcon-40x40@2x-1.png b/packages/tauri/src-tauri/icons/ios/AppIcon-40x40@2x-1.png new file mode 100644 index 000000000..a78ec7334 Binary files /dev/null and b/packages/tauri/src-tauri/icons/ios/AppIcon-40x40@2x-1.png differ diff --git a/packages/tauri/src-tauri/icons/ios/AppIcon-40x40@2x.png b/packages/tauri/src-tauri/icons/ios/AppIcon-40x40@2x.png new file mode 100644 index 000000000..a78ec7334 Binary files /dev/null and b/packages/tauri/src-tauri/icons/ios/AppIcon-40x40@2x.png differ diff --git a/packages/tauri/src-tauri/icons/ios/AppIcon-40x40@3x.png b/packages/tauri/src-tauri/icons/ios/AppIcon-40x40@3x.png new file mode 100644 index 000000000..9de8403a8 Binary files /dev/null and b/packages/tauri/src-tauri/icons/ios/AppIcon-40x40@3x.png differ diff --git a/packages/tauri/src-tauri/icons/ios/AppIcon-512@2x.png b/packages/tauri/src-tauri/icons/ios/AppIcon-512@2x.png new file mode 100644 index 000000000..348f719a1 Binary files /dev/null and b/packages/tauri/src-tauri/icons/ios/AppIcon-512@2x.png differ diff --git a/packages/tauri/src-tauri/icons/ios/AppIcon-60x60@2x.png b/packages/tauri/src-tauri/icons/ios/AppIcon-60x60@2x.png new file mode 100644 index 000000000..9de8403a8 Binary files /dev/null and b/packages/tauri/src-tauri/icons/ios/AppIcon-60x60@2x.png differ diff --git a/packages/tauri/src-tauri/icons/ios/AppIcon-60x60@3x.png b/packages/tauri/src-tauri/icons/ios/AppIcon-60x60@3x.png new file mode 100644 index 000000000..b06c67dd8 Binary files /dev/null and b/packages/tauri/src-tauri/icons/ios/AppIcon-60x60@3x.png differ diff --git a/packages/tauri/src-tauri/icons/ios/AppIcon-76x76@1x.png b/packages/tauri/src-tauri/icons/ios/AppIcon-76x76@1x.png new file mode 100644 index 000000000..903dc4d3e Binary files /dev/null and b/packages/tauri/src-tauri/icons/ios/AppIcon-76x76@1x.png differ diff --git a/packages/tauri/src-tauri/icons/ios/AppIcon-76x76@2x.png b/packages/tauri/src-tauri/icons/ios/AppIcon-76x76@2x.png new file mode 100644 index 000000000..c2f796c30 Binary files /dev/null and b/packages/tauri/src-tauri/icons/ios/AppIcon-76x76@2x.png differ diff --git a/packages/tauri/src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png b/packages/tauri/src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png new file mode 100644 index 000000000..fd49a44f3 Binary files /dev/null and b/packages/tauri/src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png differ diff --git a/packages/tauri/src-tauri/src/lib.rs b/packages/tauri/src-tauri/src/lib.rs index 4a277ef35..836d575cd 100644 --- a/packages/tauri/src-tauri/src/lib.rs +++ b/packages/tauri/src-tauri/src/lib.rs @@ -1,14 +1,269 @@ -// Learn more about Tauri commands at https://tauri.app/develop/calling-rust/ -#[tauri::command] -fn greet(name: &str) -> String { - format!("Hello, {}! You've been greeted from Rust!", name) +use std::{ + net::SocketAddr, + process::Command, + sync::{Arc, Mutex}, + time::{Duration, Instant}, +}; +use tauri::{App, AppHandle, Manager, RunEvent, WebviewUrl, WebviewWindow}; +use tauri_plugin_dialog::{DialogExt, MessageDialogButtons, MessageDialogResult}; +use tauri_plugin_shell::process::{CommandChild, CommandEvent}; +use tauri_plugin_shell::ShellExt; +use tauri_plugin_updater::UpdaterExt; +use tokio::net::TcpSocket; + +#[derive(Clone)] +struct ServerState(Arc>>); + +fn get_sidecar_port() -> u16 { + option_env!("OPENCODE_PORT") + .map(|s| s.to_string()) + .or_else(|| std::env::var("OPENCODE_PORT").ok()) + .and_then(|port_str| port_str.parse().ok()) + .unwrap_or(4096) +} + +fn find_and_kill_process_on_port(port: u16) -> Result<(), Box> { + // Find all listeners on the specified port + let listeners = listeners::get_processes_by_port(port)?; + + if listeners.is_empty() { + println!("No processes found listening on port {}", port); + return Ok(()); + } + + for listener in listeners { + let pid = listener.pid; + println!("Found process {} listening on port {}", pid, port); + + // Kill the process using platform-appropriate command + #[cfg(target_os = "windows")] + { + Command::new("taskkill") + .args(["/F", "/PID", &pid.to_string()]) + .output()?; + } + + #[cfg(not(target_os = "windows"))] + { + Command::new("kill") + .args(["-9", &pid.to_string()]) + .output()?; + } + + println!("Killed process {}", pid); + } + + Ok(()) +} + +fn spawn_sidecar(app: &AppHandle, port: u16) -> CommandChild { + let (mut rx, child) = app + .shell() + .sidecar("opencode") + .unwrap() + .args(["serve", &format!("--port={port}")]) + .spawn() + .expect("Failed to spawn opencode"); + + tauri::async_runtime::spawn(async move { + while let Some(event) = rx.recv().await { + match event { + CommandEvent::Stdout(line_bytes) => { + let line = String::from_utf8_lossy(&line_bytes); + print!("{line}"); + } + CommandEvent::Stderr(line_bytes) => { + let line = String::from_utf8_lossy(&line_bytes); + eprint!("{line}"); + } + _ => {} + } + } + }); + + child +} + +async fn is_server_running(port: u16) -> bool { + TcpSocket::new_v4() + .unwrap() + .connect(SocketAddr::new( + "127.0.0.1".parse().expect("Failed to parse IP"), + port, + )) + .await + .is_ok() } #[cfg_attr(mobile, tauri::mobile_entry_point)] pub fn run() { - tauri::Builder::default() + let updater_enabled = option_env!("TAURI_SIGNING_PRIVATE_KEY").is_some(); + + let mut builder = tauri::Builder::default() + .plugin(tauri_plugin_dialog::init()) + .plugin(tauri_plugin_shell::init()) .plugin(tauri_plugin_opener::init()) - .invoke_handler(tauri::generate_handler![greet]) - .run(tauri::generate_context!()) - .expect("error while running tauri application"); + .setup(move |app| { + let app = app.handle().clone(); + + if updater_enabled { + tauri::async_runtime::spawn(run_updater(app.clone())); + } + + tauri::async_runtime::spawn(async move { + let port = get_sidecar_port(); + let socket_connected = is_server_running(port).await; + + let should_spawn_sidecar = if socket_connected { + let res = app + .dialog() + .message( + "OpenCode Server is already running, would you like to restart it?", + ) + .buttons(MessageDialogButtons::YesNo) + .blocking_show_with_result(); + + match res { + MessageDialogResult::Yes => { + if let Err(e) = find_and_kill_process_on_port(port) { + eprintln!("Failed to kill process on port {}: {}", port, e); + } + true + } + _ => false, + } + } else { + true + }; + + let child = if should_spawn_sidecar { + let child = spawn_sidecar(&app, port); + + let timestamp = Instant::now(); + loop { + if timestamp.elapsed() > Duration::from_secs(3) { + todo!("Handle server spawn timeout"); + } + + tokio::time::sleep(Duration::from_millis(10)).await; + + if is_server_running(port).await { + // give the server a little bit more time to warm up + tokio::time::sleep(Duration::from_millis(10)).await; + + break; + } + } + + println!("Server ready after {:?}", timestamp.elapsed()); + + Some(child) + } else { + None + }; + + let mut window_builder = + WebviewWindow::builder(&app, "main", WebviewUrl::App("/".into())) + .title("OpenCode") + .inner_size(800.0, 600.0) + .decorations(true); + + #[cfg(target_os = "macos")] + { + window_builder = window_builder.hidden_title(true); + } + + window_builder.build().expect("Failed to create window"); + + app.manage(ServerState(Arc::new(Mutex::new(child)))); + }); + + Ok(()) + }); + + if updater_enabled { + builder = builder.plugin(tauri_plugin_updater::Builder::new().build()); + } + + builder + .build(tauri::generate_context!()) + .expect("error while running tauri application") + .run(|app, event| { + if let RunEvent::Exit = event { + println!("Received Exit"); + + let _ = app + .state::() + .0 + .lock() + .expect("Failed to acquire mutex lock") + .take() + .expect("State not found") + .kill(); + + println!("Killed server"); + } + }); +} + +async fn run_updater(app: AppHandle) { + let update = match app + .updater_builder() + .version_comparator(|v, r| { + dbg!(&v, &r); + r.version > v + }) + .build() + .unwrap() + .check() + .await + { + Ok(u) => u, + Err(e) => { + dbg!(e); + app.dialog() + .message("Failed to check for updates") + .show(|_| {}); + return; + } + }; + + dbg!(update.is_some()); + + let Some(update) = update else { + return; + }; + + let Ok(update_bytes) = update.download(|_, _| {}, || {}).await else { + return; + }; + + let should_update = app + .dialog() + .message(format!( + "Version {} of OpenCode is available, would you like to install it?", + &update.version + )) + .buttons(MessageDialogButtons::YesNo) + .blocking_show(); + + if !should_update { + return; + } + + if update.install(update_bytes).is_err() { + app.dialog() + .message("Failed to install update") + .blocking_show(); + } + + let should_restart = app + .dialog() + .message("Update installed successfully, would you like to restart OpenCode?") + .buttons(MessageDialogButtons::YesNo) + .blocking_show(); + + if should_restart { + app.restart(); + } } diff --git a/packages/tauri/src-tauri/tauri.conf.json b/packages/tauri/src-tauri/tauri.conf.json index 754569c6a..fcb6c03de 100644 --- a/packages/tauri/src-tauri/tauri.conf.json +++ b/packages/tauri/src-tauri/tauri.conf.json @@ -1,8 +1,9 @@ { "$schema": "https://schema.tauri.app/config/2", - "productName": "opencode", - "version": "0.1.0", - "identifier": "ai.opencode", + "productName": "OpenCode", + "mainBinaryName": "OpenCode Desktop", + "version": "../package.json", + "identifier": "ai.opencode.desktop", "build": { "beforeDevCommand": "bun run dev", "devUrl": "http://localhost:1420", @@ -11,21 +12,22 @@ }, "app": { "withGlobalTauri": true, - "windows": [ - { - "title": "opencode", - "width": 800, - "height": 600, - "url": "https://desktop.dev.opencode.ai" - } - ], "security": { "csp": null - } + }, + "macOSPrivateApi": true }, "bundle": { "active": true, - "targets": "all", - "icon": ["icons/32x32.png", "icons/128x128.png", "icons/128x128@2x.png", "icons/icon.icns", "icons/icon.ico"] + "targets": ["deb", "rpm", "appimage", "dmg", "app", "nsis"], + "icon": ["icons/32x32.png", "icons/128x128.png", "icons/128x128@2x.png", "icons/icon.icns", "icons/icon.ico"], + "externalBin": ["sidecars/opencode"], + "createUpdaterArtifacts": true + }, + "plugins": { + "updater": { + "pubkey": "dW50cnVzdGVkIGNvbW1lbnQ6IG1pbmlzaWduIHB1YmxpYyBrZXk6IDgxNjQ5OUExQjg2MEI3ODAKUldTQXQyQzRvWmxrZ2VOU09ta1IwSVpKSlQ1ZjJsRVh3cmRZcEZKUlF2MzBpTHcwWU82WWRLOXIK", + "endpoints": ["https://github.com/brendonovich/opencode/releases/latest/download/latest.json"] + } } } diff --git a/packages/tauri/src/assets/tauri.svg b/packages/tauri/src/assets/tauri.svg deleted file mode 100644 index 31b62c928..000000000 --- a/packages/tauri/src/assets/tauri.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/packages/tauri/src/assets/typescript.svg b/packages/tauri/src/assets/typescript.svg deleted file mode 100644 index 30a5edd33..000000000 --- a/packages/tauri/src/assets/typescript.svg +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - diff --git a/packages/tauri/src/assets/vite.svg b/packages/tauri/src/assets/vite.svg deleted file mode 100644 index e7b8dfb1b..000000000 --- a/packages/tauri/src/assets/vite.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/packages/tauri/src/index.ts b/packages/tauri/src/index.ts new file mode 100644 index 000000000..b9060d628 --- /dev/null +++ b/packages/tauri/src/index.ts @@ -0,0 +1 @@ +import "@opencode-ai/desktop" diff --git a/packages/tauri/src/main.ts b/packages/tauri/src/main.ts deleted file mode 100644 index 6b8710aec..000000000 --- a/packages/tauri/src/main.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { invoke } from "@tauri-apps/api/core" - -let greetInputEl: HTMLInputElement | null -let greetMsgEl: HTMLElement | null - -async function greet() { - if (greetMsgEl && greetInputEl) { - // Learn more about Tauri commands at https://tauri.app/develop/calling-rust/ - greetMsgEl.textContent = await invoke("greet", { - name: greetInputEl.value, - }) - } -} - -window.addEventListener("DOMContentLoaded", () => { - greetInputEl = document.querySelector("#greet-input") - greetMsgEl = document.querySelector("#greet-msg") - document.querySelector("#greet-form")?.addEventListener("submit", (e) => { - e.preventDefault() - greet() - }) -}) diff --git a/packages/tauri/src/styles.css b/packages/tauri/src/styles.css deleted file mode 100644 index 7011746b1..000000000 --- a/packages/tauri/src/styles.css +++ /dev/null @@ -1,116 +0,0 @@ -.logo.vite:hover { - filter: drop-shadow(0 0 2em #747bff); -} - -.logo.typescript:hover { - filter: drop-shadow(0 0 2em #2d79c7); -} -:root { - font-family: Inter, Avenir, Helvetica, Arial, sans-serif; - font-size: 16px; - line-height: 24px; - font-weight: 400; - - color: #0f0f0f; - background-color: #f6f6f6; - - font-synthesis: none; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - -webkit-text-size-adjust: 100%; -} - -.container { - margin: 0; - padding-top: 10vh; - display: flex; - flex-direction: column; - justify-content: center; - text-align: center; -} - -.logo { - height: 6em; - padding: 1.5em; - will-change: filter; - transition: 0.75s; -} - -.logo.tauri:hover { - filter: drop-shadow(0 0 2em #24c8db); -} - -.row { - display: flex; - justify-content: center; -} - -a { - font-weight: 500; - color: #646cff; - text-decoration: inherit; -} - -a:hover { - color: #535bf2; -} - -h1 { - text-align: center; -} - -input, -button { - border-radius: 8px; - border: 1px solid transparent; - padding: 0.6em 1.2em; - font-size: 1em; - font-weight: 500; - font-family: inherit; - color: #0f0f0f; - background-color: #ffffff; - transition: border-color 0.25s; - box-shadow: 0 2px 2px rgba(0, 0, 0, 0.2); -} - -button { - cursor: pointer; -} - -button:hover { - border-color: #396cd8; -} -button:active { - border-color: #396cd8; - background-color: #e8e8e8; -} - -input, -button { - outline: none; -} - -#greet-input { - margin-right: 5px; -} - -@media (prefers-color-scheme: dark) { - :root { - color: #f6f6f6; - background-color: #2f2f2f; - } - - a:hover { - color: #24c8db; - } - - input, - button { - color: #ffffff; - background-color: #0f0f0f98; - } - button:active { - background-color: #0f0f0f69; - } -} diff --git a/packages/tauri/vite.config.ts b/packages/tauri/vite.config.ts index c2ac9a3fd..ead3d8a8d 100644 --- a/packages/tauri/vite.config.ts +++ b/packages/tauri/vite.config.ts @@ -1,10 +1,11 @@ import { defineConfig } from "vite" +import desktopPlugin from "@opencode-ai/desktop/vite" -// @ts-expect-error process is a nodejs global const host = process.env.TAURI_DEV_HOST // https://vite.dev/config/ -export default defineConfig(async () => ({ +export default defineConfig({ + plugins: [desktopPlugin], // Vite options tailored for Tauri development and only applied in `tauri dev` or `tauri build` // // 1. prevent Vite from obscuring rust errors @@ -26,4 +27,4 @@ export default defineConfig(async () => ({ ignored: ["**/src-tauri/**"], }, }, -})) +}) diff --git a/packages/ui/src/styles/tailwind/index.css b/packages/ui/src/styles/tailwind/index.css index c58141922..7a24b42ac 100644 --- a/packages/ui/src/styles/tailwind/index.css +++ b/packages/ui/src/styles/tailwind/index.css @@ -1,6 +1,7 @@ @layer theme, base, components, utilities; + @import "tailwindcss/theme.css" layer(theme); -@import "tailwindcss/utilities.css" layer(utilities); +@import "tailwindcss/utilities.css" layer(utilities) source("../../../../"); @import "./utilities.css"; @import "../index.css"; -- cgit v1.2.3