diff --git a/.github/workflows/build-test.yml b/.github/workflows/build-test.yml index b1ea87f4..6a40e825 100644 --- a/.github/workflows/build-test.yml +++ b/.github/workflows/build-test.yml @@ -16,8 +16,11 @@ jobs: - platform: "macos-latest" # for Intel based macs. args: "--target x86_64-apple-darwin" target: "x86_64-apple-darwin" - - platform: "ubuntu-22.04" - args: "" + - platform: "ubuntu-22.04" # Build .deb on 22.04 + args: "--bundles deb" + target: "x86_64-unknown-linux-gnu" + - platform: "ubuntu-24.04" # Build AppImage and RPM on 24.04 + args: "--bundles appimage,rpm" target: "x86_64-unknown-linux-gnu" - platform: "windows-latest" args: "" @@ -31,4 +34,5 @@ jobs: sign-binaries: true asset-prefix: "handy-test" upload-artifacts: true + is-debug-build: ${{ contains(matrix.args, '--debug') }} secrets: inherit diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 2065a278..c9192cb5 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -20,6 +20,10 @@ on: required: false type: string default: "handy" + asset-name-pattern: + required: false + type: string + default: "" upload-artifacts: required: false type: boolean @@ -35,6 +39,10 @@ on: required: false type: string default: ${{ github.ref }} + is-debug-build: + required: false + type: boolean + default: false jobs: build: @@ -57,6 +65,18 @@ jobs: echo "Application version from tauri.conf.json: $VERSION" echo "version=$VERSION" >> "$GITHUB_OUTPUT" + - name: Determine build profile + id: build-profile + shell: bash + run: | + if [[ "${{ inputs.is-debug-build }}" == "true" ]]; then + echo "profile=debug" >> "$GITHUB_OUTPUT" + echo "Build profile: debug" + else + echo "profile=release" >> "$GITHUB_OUTPUT" + echo "Build profile: release" + fi + - uses: oven-sh/setup-bun@v2 - name: install Rust stable @@ -149,6 +169,19 @@ jobs: echo "CERT_ID=$CERT_ID" >> $GITHUB_ENV echo "Certificate imported." + - name: Patch asset name pattern + id: patch-release-name + shell: bash + if: ${{ inputs.release-id != '' && inputs.asset-name-pattern != '' }} + run: | + platform="${{ inputs.platform }}" + replacement="$(echo ${platform} | sed -E 's/-latest//')" + patched_platform=$(echo '${{ inputs.asset-name-pattern }}' | sed -E "s/\[platform\]/${replacement}/") + if [[ -n "${{ inputs.asset-prefix }}" ]]; then + patched_platform="${{ inputs.asset-prefix }}_${patched_platform}" + fi + echo "platform=${patched_platform}" >> $GITHUB_OUTPUT + - name: Build with Tauri uses: tauri-apps/tauri-action@v0 env: @@ -165,10 +198,13 @@ jobs: AZURE_TENANT_ID: ${{ inputs.sign-binaries && secrets.AZURE_TENANT_ID || '' }} TAURI_SIGNING_PRIVATE_KEY: ${{ inputs.sign-binaries && secrets.TAURI_SIGNING_PRIVATE_KEY || '' }} TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ inputs.sign-binaries && secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD || '' }} + WHISPER_NO_AVX: ${{ contains(inputs.platform, 'ubuntu') && 'ON' || '' }} + WHISPER_NO_AVX2: ${{ contains(inputs.platform, 'ubuntu') && 'ON' || '' }} with: tagName: ${{ inputs.release-id && format('v{0}', steps.get-version.outputs.version) || '' }} releaseName: ${{ inputs.release-id && format('v{0}', steps.get-version.outputs.version) || '' }} releaseId: ${{ inputs.release-id }} + assetNamePattern: ${{ steps.patch-release-name.outputs.platform }} args: ${{ inputs.build-args }} - name: Upload artifacts (macOS) @@ -177,8 +213,8 @@ jobs: with: name: ${{ inputs.asset-prefix }}-${{ inputs.target }} path: | - src-tauri/target/${{ inputs.target }}/release/bundle/dmg/*.dmg - src-tauri/target/${{ inputs.target }}/release/bundle/macos/*.app + src-tauri/target/${{ inputs.target }}/${{ steps.build-profile.outputs.profile }}/bundle/dmg/*.dmg + src-tauri/target/${{ inputs.target }}/${{ steps.build-profile.outputs.profile }}/bundle/macos/*.app retention-days: 30 - name: Install FUSE for AppImage processing @@ -191,7 +227,7 @@ jobs: if: contains(inputs.platform, 'ubuntu') run: | # Find the AppImage file - APPIMAGE_PATH=$(find src-tauri/target/release/bundle/appimage -name "*.AppImage" | head -1) + APPIMAGE_PATH=$(find src-tauri/target/${{ steps.build-profile.outputs.profile }}/bundle/appimage -name "*.AppImage" | head -1) if [ -n "$APPIMAGE_PATH" ]; then echo "Processing AppImage: $APPIMAGE_PATH" @@ -236,10 +272,11 @@ jobs: if: inputs.upload-artifacts && contains(inputs.platform, 'ubuntu') uses: actions/upload-artifact@v4 with: - name: ${{ inputs.asset-prefix }}-${{ inputs.target }} + name: ${{ inputs.asset-prefix }}-${{ inputs.platform }}-${{ inputs.target }} path: | - src-tauri/target/release/bundle/deb/*.deb - src-tauri/target/release/bundle/appimage/*.AppImage + src-tauri/target/${{ steps.build-profile.outputs.profile }}/bundle/deb/*.deb + src-tauri/target/${{ steps.build-profile.outputs.profile }}/bundle/appimage/*.AppImage + src-tauri/target/${{ steps.build-profile.outputs.profile }}/bundle/rpm/*.rpm retention-days: 30 - name: Upload artifacts (Windows) @@ -248,6 +285,6 @@ jobs: with: name: ${{ inputs.asset-prefix }}-${{ inputs.target }} path: | - src-tauri/target/release/bundle/msi/*.msi - src-tauri/target/release/bundle/nsis/*.exe + src-tauri/target/${{ steps.build-profile.outputs.profile }}/bundle/msi/*.msi + src-tauri/target/${{ steps.build-profile.outputs.profile }}/bundle/nsis/*.exe retention-days: 30 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 37b14ffc..1a9abec7 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -52,8 +52,11 @@ jobs: - platform: "macos-latest" # for Intel based macs. args: "--target x86_64-apple-darwin" target: "x86_64-apple-darwin" - - platform: "ubuntu-22.04" - args: "" + - platform: "ubuntu-22.04" # Build .deb on 22.04 + args: "--bundles deb" + target: "x86_64-unknown-linux-gnu" + - platform: "ubuntu-24.04" # Build AppImage and RPM on 24.04 + args: "--bundles appimage,rpm" target: "x86_64-unknown-linux-gnu" - platform: "windows-latest" args: "" diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 12b86a1a..69836778 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -253,6 +253,43 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "async-openai" +version = "0.29.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b08a5b643739686e5b231d2abd5450fb3d4dd8bd65994fb4b51758393db61cc0" +dependencies = [ + "async-openai-macros", + "backoff", + "base64 0.22.1", + "bytes", + "derive_builder", + "eventsource-stream", + "futures", + "rand 0.9.2", + "reqwest 0.12.12", + "reqwest-eventsource", + "secrecy", + "serde", + "serde_json", + "thiserror 2.0.16", + "tokio", + "tokio-stream", + "tokio-util", + "tracing", +] + +[[package]] +name = "async-openai-macros" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0289cba6d5143bfe8251d57b4a8cac036adf158525a76533a7082ba65ec76398" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", +] + [[package]] name = "async-process" version = "2.3.0" @@ -309,9 +346,9 @@ checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" [[package]] name = "async-trait" -version = "0.1.85" +version = "0.1.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f934833b4b7233644e5848f235df3f57ed8c80f1528a26c3dfa13d2147fa056" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", @@ -373,6 +410,20 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" +[[package]] +name = "backoff" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b62ddb9cb1ec0a098ad4bbf9344d0713fa193ae1a80af55febcff2627b6a00c1" +dependencies = [ + "futures-core", + "getrandom 0.2.15", + "instant", + "pin-project-lite", + "rand 0.8.5", + "tokio", +] + [[package]] name = "backtrace" version = "0.3.74" @@ -1123,6 +1174,37 @@ dependencies = [ "syn 2.0.96", ] +[[package]] +name = "derive_builder" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "507dfb09ea8b7fa618fcf76e953f4f5e192547945816d5358edffe39f6f94947" +dependencies = [ + "derive_builder_macro", +] + +[[package]] +name = "derive_builder_core" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.96", +] + +[[package]] +name = "derive_builder_macro" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" +dependencies = [ + "derive_builder_core", + "syn 2.0.96", +] + [[package]] name = "derive_more" version = "0.99.18" @@ -1503,6 +1585,17 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "eventsource-stream" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74fef4569247a5f429d9156b9d0a2599914385dd189c539334c625d8099d90ab" +dependencies = [ + "futures-core", + "nom 7.1.3", + "pin-project-lite", +] + [[package]] name = "extended" version = "0.1.0" @@ -1674,6 +1767,21 @@ dependencies = [ "new_debug_unreachable", ] +[[package]] +name = "futures" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + [[package]] name = "futures-channel" version = "0.3.31" @@ -1754,12 +1862,19 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" +[[package]] +name = "futures-timer" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" + [[package]] name = "futures-util" version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ + "futures-channel", "futures-core", "futures-io", "futures-macro", @@ -2395,7 +2510,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "socket2", + "socket2 0.5.8", "tokio", "tower-service", "tracing", @@ -2432,6 +2547,7 @@ dependencies = [ "hyper 1.6.0", "hyper-util", "rustls", + "rustls-native-certs", "rustls-pki-types", "tokio", "tokio-rustls", @@ -2465,7 +2581,7 @@ dependencies = [ "http-body 1.0.1", "hyper 1.6.0", "pin-project-lite", - "socket2", + "socket2 0.5.8", "tokio", "tower-service", "tracing", @@ -2719,6 +2835,26 @@ dependencies = [ "libc", ] +[[package]] +name = "instant" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "io-uring" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b" +dependencies = [ + "bitflags 2.8.0", + "cfg-if", + "libc", +] + [[package]] name = "ipnet" version = "2.11.0" @@ -3124,6 +3260,16 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" +[[package]] +name = "mime_guess" +version = "2.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" +dependencies = [ + "mime", + "unicase", +] + [[package]] name = "minimal-lexical" version = "0.2.1" @@ -3202,7 +3348,7 @@ dependencies = [ "openssl-probe", "openssl-sys", "schannel", - "security-framework", + "security-framework 2.11.1", "security-framework-sys", "tempfile", ] @@ -4353,7 +4499,7 @@ dependencies = [ "quinn-udp", "rustc-hash 2.1.0", "rustls", - "socket2", + "socket2 0.5.8", "thiserror 2.0.16", "tokio", "tracing", @@ -4388,7 +4534,7 @@ dependencies = [ "cfg_aliases 0.2.1", "libc", "once_cell", - "socket2", + "socket2 0.5.8", "tracing", "windows-sys 0.59.0", ] @@ -4427,6 +4573,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" @@ -4447,6 +4603,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" @@ -4465,6 +4631,15 @@ dependencies = [ "getrandom 0.2.15", ] +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom 0.3.1", +] + [[package]] name = "rand_hc" version = "0.2.0" @@ -4650,11 +4825,13 @@ dependencies = [ "js-sys", "log", "mime", + "mime_guess", "once_cell", "percent-encoding", "pin-project-lite", "quinn", "rustls", + "rustls-native-certs", "rustls-pemfile 2.2.0", "rustls-pki-types", "serde", @@ -4675,6 +4852,22 @@ dependencies = [ "windows-registry", ] +[[package]] +name = "reqwest-eventsource" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "632c55746dbb44275691640e7b40c907c16a2dc1a5842aa98aaec90da6ec6bde" +dependencies = [ + "eventsource-stream", + "futures-core", + "futures-timer", + "mime", + "nom 7.1.3", + "pin-project-lite", + "reqwest 0.12.12", + "thiserror 1.0.69", +] + [[package]] name = "ring" version = "0.17.8" @@ -4844,6 +5037,18 @@ dependencies = [ "zeroize", ] +[[package]] +name = "rustls-native-certs" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fcff2dd52b58a8d98a70243663a0d234c4e2b79235637849d15913394a247d3" +dependencies = [ + "openssl-probe", + "rustls-pki-types", + "schannel", + "security-framework 3.5.1", +] + [[package]] name = "rustls-pemfile" version = "1.0.4" @@ -4945,6 +5150,16 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +[[package]] +name = "secrecy" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e891af845473308773346dc847b2c23ee78fe442e0472ac50e22a18a93d3ae5a" +dependencies = [ + "serde", + "zeroize", +] + [[package]] name = "security-framework" version = "2.11.1" @@ -4958,11 +5173,24 @@ dependencies = [ "security-framework-sys", ] +[[package]] +name = "security-framework" +version = "3.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3297343eaf830f66ede390ea39da1d462b6b0c1b000f420d0a83f898bbbe6ef" +dependencies = [ + "bitflags 2.8.0", + "core-foundation 0.10.0", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + [[package]] name = "security-framework-sys" -version = "2.14.0" +version = "2.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" +checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0" dependencies = [ "core-foundation-sys", "libc", @@ -5242,6 +5470,16 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "socket2" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" +dependencies = [ + "libc", + "windows-sys 0.60.2", +] + [[package]] name = "socks" version = "0.3.4" @@ -6498,18 +6736,20 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.43.0" +version = "1.47.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d61fa4ffa3de412bfea335c6ecff681de2b609ba3c77ef3e00e521813a9ed9e" +checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" dependencies = [ "backtrace", "bytes", + "io-uring", "libc", "mio 1.0.3", "pin-project-lite", - "socket2", + "slab", + "socket2 0.6.1", "tokio-macros", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -6684,10 +6924,13 @@ dependencies = [ [[package]] name = "transcribe-rs" -version = "0.1.1" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5a2e67ea475c444fee6ffa137eb180c484a87bd3755034e08bc95273f1da0d6" +checksum = "77dbb8e1048585b7f0bc216d87025953e2f7b04a3e4f4489948f18ab847486a9" dependencies = [ + "async-openai", + "async-trait", + "derive_builder", "env_logger 0.10.2", "hound", "log", @@ -6696,6 +6939,7 @@ dependencies = [ "ort", "regex", "thiserror 2.0.16", + "tokio", "whisper-rs", ] @@ -6813,6 +7057,12 @@ dependencies = [ "unic-common", ] +[[package]] +name = "unicase" +version = "2.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" + [[package]] name = "unicode-bidi" version = "0.3.18" diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 15ee975d..e25366f8 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -64,7 +64,7 @@ rusqlite = { version = "0.32", features = ["bundled"] } tauri-plugin-sql = { version = "2", features = ["sqlite"] } tar = "0.4.44" flate2 = "1.0" -transcribe-rs = "0.1.1" +transcribe-rs = "0.1.3" [target.'cfg(not(any(target_os = "android", target_os = "ios")))'.dependencies] tauri-plugin-autostart = "2"