mirror of
https://github.com/hanzoai/desktop.git
synced 2026-10-30 14:58:42 +00:00
* chore(deps): bump Tauri to 2.11 + all deps to latest within-major
Forwards-only, within-major dependency refresh across the JS and Rust
trees. No major-version crossings.
Tauri (Rust + JS kept mutually consistent):
- tauri 2.4 -> 2.11.3, tauri-build 2.4 -> 2.6, plugins -> latest 2.x
(dialog 2.7, fs 2.5, log 2.8, updater 2.10, deep-link 2.4, ...).
- @tauri-apps/api 2.11.1, cli 2.11.3, plugin-* aligned to the same 2.x.
- gen/schemas regenerated for the new plugin ACL permissions.
JS: raised all caret ranges to highest-within-major (radix-ui, tanstack,
framer-motion 12.41, zod 3.25, vite 6.4.3, vitest 4.1.9, typescript 5.9.3,
typescript-eslint 8.62, eslint 9.39, @types/node 20.19.43, ...). pnpm
install + dedupe; package-lock.json regenerated to match (npm-ci CI path).
React pin preserved: react & react-dom stay exactly 19.0.6 (kept equal to
avoid the React reconciler mismatch / blank-app failure mode).
pnpm.overrides added (pnpm ignored the npm-style top-level `overrides`):
- @radix-ui/react-primitive pinned 2.1.4 — 2.1.5+ adds a global
`declare module 'react'` CSSProperties augmentation (`--radix-${string}`)
that breaks rjsf StyleHTMLAttributes typing; the pin keeps every radix
component bump while dropping just the breaking transitive augmentation.
Held at safe boundary (would increase the typecheck error count):
- react-error-boundary held at ~6.0.3 (6.1.x retypes FallbackProps.error
Error -> unknown, breaking the app's typed fallbacks).
Verification (baseline = origin/main):
- frontend `tsc -b`: 34 -> 33 errors (0 new; 1 pre-existing fixed by
@types/node bump). Constraint "must not increase" satisfied.
- `cargo check` (src-tauri): 0 errors / 71 warnings, unchanged from baseline.
* test(e2e): real Tauri E2E harness (tauri-driver + WebdriverIO), decomplected from frontend smoke
The existing e2e-tests/*.spec.ts (Playwright `page.goto(:1420)`) drive the Vite
frontend in Chromium with NO Tauri IPC. That's frontend smoke, not E2E. This
adds the canonical Tauri 2.x E2E: tauri-driver launches the real hanzo-desktop
binary and WebdriverIO drives the native WebKit webview over WebDriver — real
window, real `window.__TAURI_INTERNALS__`, real commands.
Decomplected — one script per intent, no duplication:
- `pnpm test:e2e` -> wdio, real native app (apps/hanzo-desktop/e2e/)
- `pnpm test:smoke` -> playwright frontend smoke (apps/hanzo-desktop/e2e-tests/)
Playwright config + e2e-tests/README relabelled "frontend smoke — NOT Tauri E2E".
Harness (DRY):
- wdio.conf.ts (app root): capability is `tauri:options.application` ->
src-tauri/target/debug/hanzo-desktop, NO browserName (tauri-driver forwards an
unknown browserName to WebKitWebDriver otherwise). Spawns/kills tauri-driver in
beforeSession/afterSession/onComplete, frees stale ports, kills the driver's
native-driver child via its process group. ESM-safe (__dirname from
import.meta.url; the repo is "type":"module"). Headless on DISPLAY=:1.
- tsconfig.e2e.json: own TS project (node + DOM + @wdio/globals) so the specs
typecheck and stay out of the app's tsconfig.app/spec.
- e2e/helpers.ts: shared waitForAppMounted / navigateTo (client-side history,
the app uses BrowserRouter) / restoreSignedInSession (seeds the REAL persisted
zustand stores for a returning cloud user — unlocks ProtectedRoutes with no
IPC/behaviour mocks).
- Specs (minimal but real, no mocks): app-load (window + #root mount +
__TAURI_INTERNALS__ + onboarding), login (Login button gates on terms
checkbox), models (local "Zen Engine" surface + chat composer), chat (real
composer round-trip), mining (mining-page, on-chain/pending balances,
4-tier privacy selector, recent-proofs).
- e2e/README.md: how to run (needs webkit2gtk-driver + tauri-driver + a debug
build), macOS-unsupported caveat.
Deps: @wdio/{cli,local-runner,mocha-framework,spec-reporter,globals,types}
^9.29.0 (devDeps, within-major). pnpm + package-lock both updated.
Verified: config + specs typecheck (tsc -p tsconfig.e2e.json = 0 errors); app
typecheck unchanged at 33 (no e2e leakage); eslint ignores the e2e suites (their
own tsconfigs) — also clears the pre-existing e2e-tests parse error; tauri-driver
+ WebKitWebDriver present, debug binary builds & launches, wdio reaches session
creation. NOT faked green: on this box's bleeding-edge WebKitGTK 2.52.3 the
tauri-driver automation handshake hangs (IncompleteMessage / HEADERS_TIMEOUT) —
an upstream WebKitGTK>=2.46 issue, documented in e2e/README.md with mitigations.
131 lines
5.5 KiB
TOML
131 lines
5.5 KiB
TOML
[package]
|
|
name = "hanzo-desktop"
|
|
version = "0.0.0"
|
|
description = "A first class Desktop application to interact with Hanzo Node"
|
|
authors = ["[email protected]"]
|
|
license = ""
|
|
repository = ""
|
|
edition = "2021"
|
|
|
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
|
|
|
[build-dependencies]
|
|
tauri-build = { version = "2.6", features = [] }
|
|
|
|
[dependencies]
|
|
tauri = { version = "2.11", features = [ "macos-private-api", "tray-icon", "image-png", "devtools"] }
|
|
serde = { version = "1.0", features = ["derive"] }
|
|
serde_json = "1.0"
|
|
# fix this dependency later on
|
|
reqwest = { version = "0.11", features = ["json", "stream"] }
|
|
lazy_static = "1.4.0"
|
|
tokio = { version = "1.36.0", features = ["macros", "rt-multi-thread", "rt", "net", "sync", "io-util"] }
|
|
chrono = "0.4.38"
|
|
futures-util = "0.3"
|
|
regex = "1.10.4"
|
|
once_cell = "1.19.0"
|
|
wgpu = "0.20.0"
|
|
sysinfo = "0.30.12"
|
|
ed25519-dalek = { version = "2.1.1", features = ["rand_core"] }
|
|
blake3 = "1.5.1"
|
|
# Phase-2 on-chain claim signer (mining/claim.rs) — lean secp256k1 stack (not
|
|
# alloy/ethers): BIP-39 mnemonic → BIP-44 (m/44'/60'/0'/0/0) → k256 ECDSA, with
|
|
# EIP-1559 RLP via `rlp` and keccak via `tiny-keccak`. Derives the SAME address
|
|
# as the frontend ethers wallet, so the mining wallet == the user's wallet.
|
|
coins-bip39 = { version = "0.8.7", default-features = false, features = ["english"] }
|
|
k256 = "0.13"
|
|
rlp = "0.5"
|
|
tiny-keccak = { version = "2.0", features = ["keccak"] }
|
|
opener = "0.7.2"
|
|
hex = "0.4.3"
|
|
base64 = "0.22.1"
|
|
time = "^0.3.36"
|
|
listeners = "0.2"
|
|
log = "0.4"
|
|
anyhow = "1.0.89"
|
|
uuid = { version = "1.10.0", features = ["v4"] }
|
|
kill_tree = { version = "0.2", features = ["tokio"] }
|
|
semver = "1.0"
|
|
sha2 = "0.10"
|
|
rand = "0.8"
|
|
keyring = "3.6"
|
|
|
|
# hanzo-machined client (UNIX-socket HTTP/JSON)
|
|
hyper = { version = "1.4", features = ["client", "http1"] }
|
|
http-body-util = "0.1"
|
|
bytes = "1"
|
|
thiserror = "1.0"
|
|
dirs = "6.0"
|
|
|
|
# Shared AI-chain mining crate (canonical hanzo core), pinned to latest.
|
|
# Same crate Zoo & Lux use so all three mine off the same network protocol.
|
|
hanzo-mining = "1.1.21"
|
|
|
|
tauri-plugin-global-shortcut = "2.3"
|
|
tauri-plugin-shell = "2.3"
|
|
tauri-plugin-single-instance = { version = "2.4", features = ["deep-link"] }
|
|
tauri-plugin-updater = "2.10"
|
|
tauri-plugin-dialog = "2.7"
|
|
tauri-plugin-fs = "2.5"
|
|
tauri-plugin-os = "2.3"
|
|
tauri-plugin-process = "2.3"
|
|
tauri-plugin-log = "2.8"
|
|
tauri-plugin-deep-link = "2.4"
|
|
tauri-plugin-opener = "2.5"
|
|
tauri-plugin-notification = "2.3"
|
|
tauri-plugin-http = "2.5"
|
|
|
|
# Phase 1 AI mining — native-Rust precompile (`mining/precompile.rs`), a pure
|
|
# port of lux/precompile/ai/ai_mining.go. No Go FFI / libluxprecompile shared
|
|
# library: the crypto is FIPS 204 ML-DSA (`fips204`) + BLAKE3 (`blake3`), so
|
|
# hanzo mines with no Go build chain and is identical on every platform.
|
|
fips204 = "0.4"
|
|
|
|
fix-path-env = { git = "https://github.com/tauri-apps/fix-path-env-rs" }
|
|
|
|
# --- Native Hanzo Engine (embedded, in-process) -----------------------------
|
|
# In-process LLM inference via the Hanzo Engine fork at ~/work/hanzo/engine
|
|
# (../../../../engine relative to this manifest). The engine workspace was
|
|
# rebranded mistralrs-* -> hanzo-*: `hanzo` is the high-level SDK, `hanzo-engine`
|
|
# is the core. Optional and OFF by default so the standard build stays light and
|
|
# does not require the engine repo checked out as a sibling. Enable with the
|
|
# `native-engine` feature plus a backend, e.g.
|
|
# cargo build --release --features "native-engine metal" (Apple Silicon)
|
|
# cargo build --release --features "native-engine cuda" (NVIDIA)
|
|
hanzo = { path = "../../../../engine/hanzo", optional = true }
|
|
hanzo-engine = { path = "../../../../engine/hanzo-engine", optional = true }
|
|
# The canonical server: the SAME crate `hanzo serve` builds on. The desktop's
|
|
# embedded engine reuses its `HanzoForServerBuilder` (state) +
|
|
# `HanzoServerRouterBuilder` (axum Router) instead of a hand-rolled server, so
|
|
# the node serves /v1/chat/completions, /v1/responses and /v1/messages
|
|
# identically. `default-features = false` drops the bundled swagger-ui (the
|
|
# inference routes don't need it; the builder gates docs behind that feature).
|
|
hanzo-server-core = { path = "../../../../engine/hanzo-server-core", optional = true, default-features = false }
|
|
axum = { version = "0.8", optional = true }
|
|
|
|
[dev-dependencies]
|
|
tempfile = "3"
|
|
|
|
[features]
|
|
default = ["machine"]
|
|
# this feature is used for production builds or when `devPath` points to the filesystem
|
|
# DO NOT REMOVE!!
|
|
custom-protocol = ["tauri/custom-protocol"]
|
|
|
|
# hanzo-machined integration (UNIX-socket HTTP/JSON client + Tauri commands).
|
|
# Brand-specific configs (zoo, liquidity) can opt out by disabling default-features.
|
|
machine = []
|
|
|
|
# Embed the native Hanzo Engine for in-process inference. This runs the canonical
|
|
# `hanzo-server-core` server (all protocols: chat/responses/messages) on
|
|
# 127.0.0.1:36900 plus a thin /v1/engine/* management surface and Tauri IPC
|
|
# commands. Pair with a backend feature.
|
|
native-engine = ["dep:hanzo", "dep:hanzo-engine", "dep:hanzo-server-core", "dep:axum"]
|
|
# GPU/CPU backends forwarded to the engine AND the server crate so their shared
|
|
# `hanzo-engine` resolves to one feature set. Weak deps (`pkg?/feat`) so selecting
|
|
# a backend never force-enables the engine unless `native-engine` is also on.
|
|
metal = ["hanzo?/metal", "hanzo-engine?/metal", "hanzo-server-core?/metal"]
|
|
cuda = ["hanzo?/cuda", "hanzo-engine?/cuda", "hanzo-server-core?/cuda"]
|
|
accelerate = ["hanzo-engine?/accelerate", "hanzo-server-core?/accelerate"]
|
|
flash-attn = ["hanzo?/flash-attn", "hanzo-server-core?/flash-attn"]
|