Add pwa & stuff #75

Merged
alois merged 48 commits from dev into main 2026-08-18 22:32:16 +03:00
21 changed files with 6619 additions and 5257 deletions
Showing only changes of commit 45d39cb47c - Show all commits

chore(deps): fully update repo (except rust)
Some checks failed
/ build-web (push) Failing after 5m51s
/ build-desktop (linux) (push) Failing after 5m58s
/ release (push) Has been cancelled
/ build-mobile (push) Has been cancelled

Alois 2026-08-07 23:10:28 +02:00
Signed by: alois
SSH key fingerprint: SHA256:GBzT2DXvAuGV9XIV5W3WrzVpjU54FThmxHXdbz95J24

View file

@ -0,0 +1,49 @@
name: Dependency builds
on:
pull_request:
env:
NIX_CONFIG: experimental-features = nix-command flakes
FORGEJO_TOKEN: ""
GITHUB_TOKEN: ""
jobs:
web:
if: ${{ github.actor == 'renovate' }}
name: Build web
runs-on: nixos
steps:
- run: nix profile add nixpkgs#nodejs_24
- uses: https://data.forgejo.org/actions/checkout@v4
with:
persist-credentials: false
- run: nix develop .#electron --command pnpm install --frozen-lockfile
- run: nix develop .#electron --command pnpm run build:packages
- run: nix develop .#electron --command pnpm run build:web
desktop:
if: ${{ github.actor == 'renovate' }}
name: Build desktop
runs-on: nixos
steps:
- run: nix profile add nixpkgs#nodejs_24
- uses: https://data.forgejo.org/actions/checkout@v4
with:
persist-credentials: false
- run: nix develop .#electron --command pnpm install --frozen-lockfile
- run: nix develop .#electron --command pnpm run build:packages
- run: nix develop .#electron --command pnpm run build:desktop
mobile:
if: ${{ github.actor == 'renovate' }}
name: Build mobile
runs-on: nixos
steps:
- run: nix profile add nixpkgs#nodejs_24
- uses: https://data.forgejo.org/actions/checkout@v4
with:
persist-credentials: false
- run: nix develop .#tauri --command pnpm install --frozen-lockfile
- run: nix develop .#tauri --command pnpm run build:packages
- run: nix develop .#tauri --command pnpm --dir apps/tauri run build:mobile:ci

View file

@ -28,12 +28,11 @@
"validate:raw": "pnpm run build && pnpm run package:linux:raw", "validate:raw": "pnpm run build && pnpm run package:linux:raw",
"validate": "if command -v nix >/dev/null 2>&1 && [ -z \"$IN_NIX_SHELL\" ]; then nix develop ../..#electron --command pnpm run validate:raw; else pnpm run validate:raw; fi" "validate": "if command -v nix >/dev/null 2>&1 && [ -z \"$IN_NIX_SHELL\" ]; then nix develop ../..#electron --command pnpm run validate:raw; else pnpm run validate:raw; fi"
}, },
"dependencies": {},
"devDependencies": { "devDependencies": {
"@types/node": "^25.9.1", "@types/node": "^26.1.2",
"electron": "^39.2.7", "electron": "^43.3.0",
"electron-builder": "^26.0.12", "electron-builder": "^26.15.3",
"esbuild": "^0.28.0", "esbuild": "^0.28.1",
"typescript": "~6.0.3" "typescript": "~6.0.3"
}, },
"build": { "build": {

View file

@ -17,6 +17,7 @@
"dev:mobile:raw": "tauri android dev --host ${TAURI_DEV_HOST:-127.0.0.1}", "dev:mobile:raw": "tauri android dev --host ${TAURI_DEV_HOST:-127.0.0.1}",
"start-adb:mobile:raw": "adb devices", "start-adb:mobile:raw": "adb devices",
"build:mobile:raw": "tauri android build", "build:mobile:raw": "tauri android build",
"build:mobile:ci": "node render-version.ts && trap 'node render-version.ts --unrender' EXIT && tauri android build --debug",
"dev:mobile": "if command -v nix >/dev/null 2>&1 && [ -z \"$IN_NIX_SHELL\" ]; then nix develop ../..#tauri --command pnpm run dev:mobile:raw; else pnpm run dev:mobile:raw; fi", "dev:mobile": "if command -v nix >/dev/null 2>&1 && [ -z \"$IN_NIX_SHELL\" ]; then nix develop ../..#tauri --command pnpm run dev:mobile:raw; else pnpm run dev:mobile:raw; fi",
"start-adb:mobile": "if command -v nix >/dev/null 2>&1 && [ -z \"$IN_NIX_SHELL\" ]; then nix develop ../..#tauri --command pnpm run start-adb:mobile:raw; else pnpm run start-adb:mobile:raw; fi", "start-adb:mobile": "if command -v nix >/dev/null 2>&1 && [ -z \"$IN_NIX_SHELL\" ]; then nix develop ../..#tauri --command pnpm run start-adb:mobile:raw; else pnpm run start-adb:mobile:raw; fi",
"build:mobile": "node render-version.ts && trap 'node render-version.ts --unrender' EXIT && if command -v nix >/dev/null 2>&1 && [ -z \"$IN_NIX_SHELL\" ]; then nix develop ../..#tauri --command pnpm run build:mobile:raw; else pnpm run build:mobile:raw; fi", "build:mobile": "node render-version.ts && trap 'node render-version.ts --unrender' EXIT && if command -v nix >/dev/null 2>&1 && [ -z \"$IN_NIX_SHELL\" ]; then nix develop ../..#tauri --command pnpm run build:mobile:raw; else pnpm run build:mobile:raw; fi",
@ -25,18 +26,16 @@
"lint": "eslint src" "lint": "eslint src"
}, },
"dependencies": { "dependencies": {
"@tauri-apps/api": "^2",
"@tauri-apps/plugin-barcode-scanner": "~2",
"@tauri-apps/plugin-deep-link": "~2",
"@tauri-apps/plugin-log": "~2",
"@tauri-apps/plugin-notification": "~2",
"@tensamin/shared": "workspace:*",
"@methanium/ui": "*", "@methanium/ui": "*",
"react": "^19.2.0", "@tauri-apps/api": "^2.11.1",
"react-dom": "^19.2.0" "@tauri-apps/plugin-barcode-scanner": "~2.4.5",
"@tauri-apps/plugin-deep-link": "~2.4.9",
"@tensamin/shared": "workspace:*",
"react": "^19.2.8",
"react-dom": "^19.2.8"
}, },
"devDependencies": { "devDependencies": {
"@tauri-apps/cli": "^2", "@tauri-apps/cli": "^2.11.4",
"@types/node": "^25.9.1" "@types/node": "^26.1.2"
} }
} }

View file

@ -923,28 +923,33 @@ mod android {
use std::sync::OnceLock; use std::sync::OnceLock;
use jni::{ use jni::{
objects::{GlobalRef, JClass, JObject, JString, JValue}, jni_sig, jni_str,
JNIEnv, JavaVM, objects::{Global, JClass, JObject, JString, JValue},
Env, EnvUnowned, JavaVM,
}; };
use serde_json::Value; use serde_json::Value;
pub struct Host { pub struct Host {
vm: JavaVM, vm: JavaVM,
context: GlobalRef, context: Global<JObject<'static>>,
bridge: GlobalRef, bridge: Global<JObject<'static>>,
} }
static HOST: OnceLock<Host> = OnceLock::new(); static HOST: OnceLock<Host> = OnceLock::new();
pub fn attach(env: &mut JNIEnv, context: JObject) -> Result<(), String> { pub fn attach(env: &mut Env, context: JObject) -> Result<(), String> {
if HOST.get().is_some() { if HOST.get().is_some() {
return Ok(()); return Ok(());
} }
let class = env let class = env
.find_class("net/tensamin/client/NativeMtpBridge") .find_class(jni_str!("net/tensamin/client/NativeMtpBridge"))
.map_err(|e| e.to_string())?; .map_err(|e| e.to_string())?;
let bridge = env let bridge = env
.get_static_field(class, "INSTANCE", "Lnet/tensamin/client/NativeMtpBridge;") .get_static_field(
class,
jni_str!("INSTANCE"),
jni_sig!("Lnet/tensamin/client/NativeMtpBridge;"),
)
.and_then(|value| value.l()) .and_then(|value| value.l())
.map_err(|e| e.to_string())?; .map_err(|e| e.to_string())?;
HOST.set(Host { HOST.set(Host {
@ -955,15 +960,11 @@ mod android {
.map_err(|_| "Android MTP host is already attached".to_string()) .map_err(|_| "Android MTP host is already attached".to_string())
} }
fn with_env<T>( fn with_env<T>(call: impl FnOnce(&mut Env, &Host) -> Result<T, String>) -> Result<T, String> {
call: impl FnOnce(&mut JNIEnv, &Host) -> Result<T, String>,
) -> Result<T, String> {
let host = HOST.get().ok_or("Android MTP host is not attached")?; let host = HOST.get().ok_or("Android MTP host is not attached")?;
let mut env = host host.vm
.vm .attach_current_thread(|env| Ok::<_, jni::errors::Error>(call(env, host)))
.attach_current_thread_as_daemon() .map_err(|e| e.to_string())?
.map_err(|e| e.to_string())?;
call(&mut env, host)
} }
pub fn store_config(config: &str) -> Result<(), String> { pub fn store_config(config: &str) -> Result<(), String> {
@ -971,8 +972,8 @@ mod android {
let value = env.new_string(config).map_err(|e| e.to_string())?; let value = env.new_string(config).map_err(|e| e.to_string())?;
env.call_method( env.call_method(
host.bridge.as_obj(), host.bridge.as_obj(),
"storeConfig", jni_str!("storeConfig"),
"(Landroid/content/Context;Ljava/lang/String;)V", jni_sig!("(Landroid/content/Context;Ljava/lang/String;)V"),
&[ &[
JValue::Object(host.context.as_obj()), JValue::Object(host.context.as_obj()),
JValue::Object(&value), JValue::Object(&value),
@ -987,8 +988,8 @@ mod android {
with_env(|env, host| { with_env(|env, host| {
env.call_method( env.call_method(
host.bridge.as_obj(), host.bridge.as_obj(),
"hasConfig", jni_str!("hasConfig"),
"(Landroid/content/Context;)Z", jni_sig!("(Landroid/content/Context;)Z"),
&[JValue::Object(host.context.as_obj())], &[JValue::Object(host.context.as_obj())],
) )
.and_then(|value| value.z()) .and_then(|value| value.z())
@ -1000,8 +1001,8 @@ mod android {
with_env(|env, host| { with_env(|env, host| {
env.call_method( env.call_method(
host.bridge.as_obj(), host.bridge.as_obj(),
"setServiceEnabled", jni_str!("setServiceEnabled"),
"(Landroid/content/Context;Z)V", jni_sig!("(Landroid/content/Context;Z)V"),
&[ &[
JValue::Object(host.context.as_obj()), JValue::Object(host.context.as_obj()),
JValue::Bool(enabled.into()), JValue::Bool(enabled.into()),
@ -1017,8 +1018,8 @@ mod android {
let status = env.new_string(status).map_err(|e| e.to_string())?; let status = env.new_string(status).map_err(|e| e.to_string())?;
env.call_method( env.call_method(
host.bridge.as_obj(), host.bridge.as_obj(),
"updateServiceStatus", jni_str!("updateServiceStatus"),
"(Landroid/content/Context;Ljava/lang/String;)V", jni_sig!("(Landroid/content/Context;Ljava/lang/String;)V"),
&[ &[
JValue::Object(host.context.as_obj()), JValue::Object(host.context.as_obj()),
JValue::Object(&status), JValue::Object(&status),
@ -1043,8 +1044,8 @@ mod android {
.map_err(|e| e.to_string())?; .map_err(|e| e.to_string())?;
env.call_method( env.call_method(
host.bridge.as_obj(), host.bridge.as_obj(),
"postMessageNotification", jni_str!("postMessageNotification"),
"(Landroid/content/Context;JLjava/lang/String;Ljava/lang/String;[B)V", jni_sig!("(Landroid/content/Context;JLjava/lang/String;Ljava/lang/String;[B)V"),
&[ &[
JValue::Object(host.context.as_obj()), JValue::Object(host.context.as_obj()),
JValue::Long(sender_id as i64), JValue::Long(sender_id as i64),
@ -1062,8 +1063,8 @@ mod android {
with_env(|env, host| { with_env(|env, host| {
env.call_method( env.call_method(
host.bridge.as_obj(), host.bridge.as_obj(),
"cancelMessageNotification", jni_str!("cancelMessageNotification"),
"(Landroid/content/Context;J)V", jni_sig!("(Landroid/content/Context;J)V"),
&[ &[
JValue::Object(host.context.as_obj()), JValue::Object(host.context.as_obj()),
JValue::Long(sender_id as i64), JValue::Long(sender_id as i64),
@ -1078,8 +1079,8 @@ mod android {
with_env(|env, host| { with_env(|env, host| {
env.call_method( env.call_method(
host.bridge.as_obj(), host.bridge.as_obj(),
"isIgnoringBatteryOptimizations", jni_str!("isIgnoringBatteryOptimizations"),
"(Landroid/content/Context;)Z", jni_sig!("(Landroid/content/Context;)Z"),
&[JValue::Object(host.context.as_obj())], &[JValue::Object(host.context.as_obj())],
) )
.and_then(|value| value.z()) .and_then(|value| value.z())
@ -1091,8 +1092,8 @@ mod android {
with_env(|env, host| { with_env(|env, host| {
env.call_method( env.call_method(
host.bridge.as_obj(), host.bridge.as_obj(),
"requestBatteryExemption", jni_str!("requestBatteryExemption"),
"(Landroid/content/Context;)V", jni_sig!("(Landroid/content/Context;)V"),
&[JValue::Object(host.context.as_obj())], &[JValue::Object(host.context.as_obj())],
) )
.map_err(|e| e.to_string())?; .map_err(|e| e.to_string())?;
@ -1101,32 +1102,36 @@ mod android {
} }
#[no_mangle] #[no_mangle]
pub extern "system" fn Java_net_tensamin_client_NativeMtpBridge_nativeAttach( pub extern "system" fn Java_net_tensamin_client_NativeMtpBridge_nativeAttach<'caller>(
mut env: JNIEnv, mut env: EnvUnowned<'caller>,
_class: JClass, _class: JClass,
context: JObject, context: JObject<'caller>,
) { ) {
let _ = let _ = env.with_env(|env| {
std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| attach(&mut env, context))); let _ = attach(env, context);
Ok::<_, jni::errors::Error>(())
});
} }
#[no_mangle] #[no_mangle]
pub extern "system" fn Java_net_tensamin_client_NativeMtpBridge_nativeStart( pub extern "system" fn Java_net_tensamin_client_NativeMtpBridge_nativeStart<'caller>(
mut env: JNIEnv, mut env: EnvUnowned<'caller>,
_class: JClass, _class: JClass,
config: JString, config: JString<'caller>,
) { ) {
let _ = std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| { let _ = env.with_env(|env| {
let config: String = env.get_string(&config).map_err(|e| e.to_string())?.into(); if let Ok(config) = config.mutf8_chars(env) {
let config = serde_json::from_str(&config).map_err(|e| e.to_string())?; if let Ok(config) = serde_json::from_str(config.to_str().as_ref()) {
super::manager().configure_and_start(config); super::manager().configure_and_start(config);
Ok::<_, String>(()) }
})); }
Ok::<_, jni::errors::Error>(())
});
} }
#[no_mangle] #[no_mangle]
pub extern "system" fn Java_net_tensamin_client_NativeMtpBridge_nativeStop( pub extern "system" fn Java_net_tensamin_client_NativeMtpBridge_nativeStop(
_env: JNIEnv, _env: EnvUnowned,
_class: JClass, _class: JClass,
) { ) {
let _ = std::panic::catch_unwind(|| super::manager().stop()); let _ = std::panic::catch_unwind(|| super::manager().stop());
@ -1134,31 +1139,34 @@ mod android {
#[no_mangle] #[no_mangle]
pub extern "system" fn Java_net_tensamin_client_NativeMtpBridge_nativeSetUiState( pub extern "system" fn Java_net_tensamin_client_NativeMtpBridge_nativeSetUiState(
_env: JNIEnv, _env: EnvUnowned,
_class: JClass, _class: JClass,
visible: jni::sys::jboolean, visible: jni::sys::jboolean,
) { ) {
super::manager().set_ui_visible(visible != 0); super::manager().set_ui_visible(visible);
} }
#[no_mangle] #[no_mangle]
pub extern "system" fn Java_net_tensamin_client_NativeMtpBridge_nativeLog( pub extern "system" fn Java_net_tensamin_client_NativeMtpBridge_nativeLog<'caller>(
mut env: JNIEnv, mut env: EnvUnowned<'caller>,
_class: JClass, _class: JClass,
level: jni::sys::jint, level: jni::sys::jint,
message: JString, message: JString<'caller>,
details: JString, details: JString<'caller>,
) { ) {
let _ = std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| { let _ = env.with_env(|env| {
let message: String = env.get_string(&message).map_err(|e| e.to_string())?.into(); if let (Ok(message), Ok(details)) = (message.mutf8_chars(env), details.mutf8_chars(env))
let details: String = env.get_string(&details).map_err(|e| e.to_string())?.into(); {
let message = message.to_str();
let details = details.to_str();
super::manager().log( super::manager().log(
level.clamp(0, 3) as u8, level.clamp(0, 3) as u8,
message, message.into_owned(),
(!details.is_empty()).then(|| Value::String(details)), (!details.is_empty()).then(|| Value::String(details.into_owned())),
); );
Ok::<_, String>(()) }
})); Ok::<_, jni::errors::Error>(())
});
} }
} }

View file

@ -12,135 +12,51 @@
"preview": "cd dist && nix-shell -p python3 --run 'python3 -m http.server 3000' && cd .." "preview": "cd dist && nix-shell -p python3 --run 'python3 -m http.server 3000' && cd .."
}, },
"dependencies": { "dependencies": {
"@base-ui/react": "^1.0.0", "@fontsource-variable/public-sans": "^5.3.0",
"@base-ui/utils": "0.3.2", "@methanium/ui": "*",
"@babel/runtime": "^7.29.2", "@tailwindcss/vite": "^4.3.3",
"@fontsource-variable/inter": "^5.2.8", "@tanstack/react-router": "^1.170.21",
"@fontsource-variable/public-sans": "^5.2.7", "@tanstack/react-virtual": "^3.14.9",
"@floating-ui/core": "^1.7.0", "@tauri-apps/api": "^2.11.1",
"@floating-ui/dom": "^1.7.0",
"@floating-ui/react-dom": "^2.1.8",
"@floating-ui/utils": "^0.2.11",
"@radix-ui/primitive": "^1.1.0",
"@radix-ui/react-compose-refs": "^1.1.1",
"@radix-ui/react-context": "^1.1.4",
"@radix-ui/react-dialog": "^1.1.6",
"@radix-ui/react-dismissable-layer": "^1.1.11",
"@radix-ui/react-focus-guards": "^1.1.4",
"@radix-ui/react-focus-scope": "^1.1.11",
"@radix-ui/react-id": "^1.1.0",
"@radix-ui/react-portal": "^1.1.13",
"@radix-ui/react-presence": "^1.1.6",
"@radix-ui/react-primitive": "^2.0.2",
"@radix-ui/react-slot": "^1.1.2",
"@radix-ui/react-use-callback-ref": "^1.1.1",
"@radix-ui/react-use-controllable-state": "^1.2.3",
"@radix-ui/react-use-effect-event": "^0.0.5",
"@radix-ui/react-use-layout-effect": "^1.1.0",
"@reduxjs/toolkit": "^2.0.0",
"@tailwindcss/vite": "^4.2.4",
"@tanstack/devtools-event-client": "^0.5.0",
"@tanstack/query-core": "^5.0.0",
"@tanstack/react-router": "^1.169.1",
"@tanstack/history": "1.162.0",
"@tanstack/react-store": "^0.11.0",
"@tanstack/router-core": "^1.169.1",
"@tanstack/store": "^0.11.0",
"@tanstack/virtual-core": "^3.13.24",
"@tanstack/react-virtual": "^3.13.24",
"@tauri-apps/api": "^2",
"@tensamin/call": "workspace:*",
"@tensamin/cache": "workspace:*", "@tensamin/cache": "workspace:*",
"@tensamin/call": "workspace:*",
"@tensamin/chat": "workspace:*", "@tensamin/chat": "workspace:*",
"@tensamin/crypto": "workspace:*", "@tensamin/crypto": "workspace:*",
"@tensamin/hotkeys": "workspace:*", "@tensamin/hotkeys": "workspace:*",
"@tensamin/shared": "workspace:*",
"@tensamin/settings": "workspace:*",
"@tensamin/storage": "workspace:*",
"@tensamin/tauri": "workspace:*",
"@tensamin/mtp": "workspace:*",
"@tensamin/tauth": "workspace:*",
"@tensamin/markdown": "workspace:*", "@tensamin/markdown": "workspace:*",
"@methanium/ui": "*", "@tensamin/mtp": "workspace:*",
"@tensamin/user": "workspace:*",
"@tensamin/notifications": "workspace:*", "@tensamin/notifications": "workspace:*",
"@tensamin/onboarding": "workspace:*", "@tensamin/onboarding": "workspace:*",
"aria-hidden": "^1.2.4", "@tensamin/settings": "workspace:*",
"class-variance-authority": "^0.7.1", "@tensamin/shared": "workspace:*",
"clsx": "^2.1.1", "@tensamin/storage": "workspace:*",
"cmdk": "^1.1.1", "@tensamin/tauri": "workspace:*",
"cookie-es": "^3.0.0", "@tensamin/tauth": "workspace:*",
"d3-array": "^3.1.6", "@tensamin/user": "workspace:*",
"d3-color": "^3.1.0",
"d3-ease": "^3.0.1",
"d3-format": "^3.1.0",
"d3-interpolate": "^3.0.1",
"d3-path": "^3.0.1",
"d3-scale": "^4.0.2",
"d3-shape": "^3.1.0",
"d3-time": "^3.0.0",
"d3-time-format": "^4.1.0",
"d3-timer": "^3.0.1",
"date-fns": "^4.4.0",
"decimal.js-light": "^2.5.1", "decimal.js-light": "^2.5.1",
"detect-node-es": "^1.1.0", "eventemitter3": "^5.0.4",
"dijkstrajs": "^1.0.1", "lucide-react": "^1.29.0",
"embla-carousel": "8.6.0", "react": "^19.2.8",
"embla-carousel-react": "^8.6.0", "react-dom": "^19.2.8",
"embla-carousel-reactive-utils": "8.6.0", "react-is": "^19.2.8",
"es-toolkit": "^1.39.3", "react-redux": "^9.3.0",
"eventemitter3": "^5.0.1",
"get-nonce": "^1.0.1",
"immer": "^10.1.1",
"input-otp": "^1.4.2",
"internmap": "^2.0.3",
"tw-animate-css": "^1.4.0",
"lucide-react": "^1.14.0",
"next-themes": "^0.4.6",
"pngjs": "^5.0.0",
"qrcode": "^1.5.4",
"react": "^19.2.0",
"react-day-picker": "^10.0.1",
"react-dom": "^19.2.0",
"react-is": "^19.0.0",
"react-redux": "^9.0.0",
"react-remove-scroll": "^2.7.2",
"react-remove-scroll-bar": "^2.3.7",
"react-resizable-panels": "^4.11.2",
"react-style-singleton": "^2.2.3",
"recharts": "3.10.1",
"redux": "^5.0.0",
"redux-thunk": "^3.1.0",
"reselect": "5.2.0",
"scheduler": "^0.27.0",
"seroval": "^1.5.4",
"seroval-plugins": "^1.5.4",
"shadcn": "^4.11.0",
"sonner": "^2.0.7",
"tailwindcss": "^4.2.4",
"tailwind-merge": "^3.6.0",
"tailwind-scrollbar-hide": "^4.0.0", "tailwind-scrollbar-hide": "^4.0.0",
"tiny-invariant": "^1.3.3", "tailwindcss": "^4.3.3",
"tslib": "^2.8.1", "tw-animate-css": "^1.4.0",
"use-callback-ref": "^1.3.3", "use-sync-external-store": "^1.6.0",
"use-sidecar": "^1.1.3", "zod": "^4.4.3"
"use-sync-external-store": "^1.2.2",
"vaul": "^1.1.2",
"victory-vendor": "^37.0.2",
"yargs": "^15.3.1",
"zod": "^4.3.6"
}, },
"devDependencies": { "devDependencies": {
"@eslint/js": "^10.0.1", "@eslint/js": "^10.0.1",
"@types/qrcode": "^1.5.6", "@types/qrcode": "^1.5.6",
"@types/react": "^19.2.2", "@types/react": "^19.2.18",
"@types/react-dom": "^19.2.2", "@types/react-dom": "^19.2.4",
"@vitejs/plugin-react": "^6.0.1", "@vitejs/plugin-react": "^6.0.5",
"esbuild": "^0.28.0", "esbuild": "^0.28.1",
"eslint": "^10.0.3", "eslint": "^10.8.0",
"globals": "^17.4.0", "globals": "^17.9.0",
"typescript": "~6.0.3", "typescript": "~6.0.3",
"typescript-eslint": "^8.57.0", "typescript-eslint": "^8.66.0",
"vite": "^8.0.10" "vite": "^8.2.1"
} }
} }

View file

@ -37,16 +37,15 @@
"eslint-plugin-react-hooks": "^7.1.1", "eslint-plugin-react-hooks": "^7.1.1",
"fallow": "^3.14.0", "fallow": "^3.14.0",
"globals": "^17.9.0", "globals": "^17.9.0",
"jsonc-parser": "^3.3.1",
"prettier": "^3.9.6", "prettier": "^3.9.6",
"typescript": "^7.0.2", "typescript": "^6.0.3",
"typescript-eslint": "^8.66.0", "typescript-eslint": "^8.66.0",
"vitest": "^4.1.10", "vitest": "^4.1.10"
"yaml": "^2.8.2"
}, },
"dependencies": { "dependencies": {
"@methanium/ui": "https://git.methanium.net/methanium/ui/releases/download/0.0.2/methanium-ui.tgz", "@methanium/ui": "*",
"mtp": "*", "mtp": "*",
"sonner": "^2.0.7" "sonner": "^2.0.7",
"yaml": "^2.9.0"
} }
} }

View file

@ -19,7 +19,7 @@
"@tensamin/mtp": "workspace:*", "@tensamin/mtp": "workspace:*",
"@tensamin/shared": "workspace:*", "@tensamin/shared": "workspace:*",
"@tensamin/storage": "workspace:*", "@tensamin/storage": "workspace:*",
"react": "^19.2.0", "react": "^19.2.8",
"zod": "^4.3.6" "zod": "^4.4.3"
} }
} }

View file

@ -17,21 +17,21 @@
"build": "tsc -p tsconfig.json --noEmit" "build": "tsc -p tsconfig.json --noEmit"
}, },
"dependencies": { "dependencies": {
"@livekit/components-react": "^2.9.20", "@livekit/components-react": "^2.9.23",
"@tanstack/react-router": "^1.169.1", "@methanium/ui": "*",
"@tanstack/react-router": "^1.170.21",
"@tensamin/crypto": "workspace:*", "@tensamin/crypto": "workspace:*",
"@tensamin/mtp": "workspace:*",
"@tensamin/shared": "workspace:*", "@tensamin/shared": "workspace:*",
"@tensamin/storage": "workspace:*", "@tensamin/storage": "workspace:*",
"@tensamin/mtp": "workspace:*",
"@methanium/ui": "*",
"@tensamin/user": "workspace:*", "@tensamin/user": "workspace:*",
"deepfilternet3-noise-filter": "1.3.0", "deepfilternet3-noise-filter": "1.3.0",
"livekit-client": "^2.18.8", "livekit-client": "^2.21.0",
"lucide-react": "^1.14.0", "lucide-react": "^1.29.0",
"react": "^19.2.0", "react": "^19.2.8",
"react-dom": "^19.2.0", "react-dom": "^19.2.8",
"recharts": "^3.8.1", "recharts": "^3.10.1",
"zod": "^4.3.6", "zod": "^4.4.3",
"zustand": "^5.0.8" "zustand": "^5.0.14"
} }
} }

View file

@ -16,23 +16,23 @@
"build": "tsc -p tsconfig.json --noEmit" "build": "tsc -p tsconfig.json --noEmit"
}, },
"dependencies": { "dependencies": {
"@tensamin/cache": "workspace:*", "@methanium/ui": "*",
"@tanstack/pacer": "^0.21.1", "@tanstack/pacer": "^0.21.1",
"@tanstack/react-query": "^5.0.0", "@tanstack/react-query": "^5.101.4",
"@tanstack/react-router": "^1.0.0", "@tanstack/react-router": "^1.170.21",
"@tanstack/react-virtual": "^3.0.0", "@tanstack/react-virtual": "^3.14.9",
"@tensamin/cache": "workspace:*",
"@tensamin/crypto": "workspace:*", "@tensamin/crypto": "workspace:*",
"@tensamin/hotkeys": "workspace:*", "@tensamin/hotkeys": "workspace:*",
"@tensamin/markdown": "workspace:*", "@tensamin/markdown": "workspace:*",
"@tensamin/mtp": "workspace:*", "@tensamin/mtp": "workspace:*",
"@tensamin/shared": "workspace:*", "@tensamin/shared": "workspace:*",
"@tensamin/storage": "workspace:*", "@tensamin/storage": "workspace:*",
"@methanium/ui": "*",
"@tensamin/user": "workspace:*", "@tensamin/user": "workspace:*",
"lucide-react": "^1.14.0", "lucide-react": "^1.29.0",
"motion": "^12.42.2", "motion": "^13.0.0",
"react": "^19.2.0", "react": "^19.2.8",
"react-dom": "^19.2.0", "react-dom": "^19.2.8",
"zod": "^4.3.6" "zod": "^4.4.3"
} }
} }

View file

@ -15,7 +15,7 @@
"build": "pnpm run test && tsc -p tsconfig.json --noEmit" "build": "pnpm run test && tsc -p tsconfig.json --noEmit"
}, },
"dependencies": { "dependencies": {
"react": "^19.2.0", "react": "^19.2.8",
"react-dom": "^19.2.0" "react-dom": "^19.2.8"
} }
} }

View file

@ -15,10 +15,10 @@
"dependencies": { "dependencies": {
"@tanstack/react-hotkeys": "^0.10.0", "@tanstack/react-hotkeys": "^0.10.0",
"@tensamin/storage": "workspace:*", "@tensamin/storage": "workspace:*",
"react": "^19.2.0", "react": "^19.2.8",
"react-dom": "^19.2.0" "react-dom": "^19.2.8"
}, },
"devDependencies": { "devDependencies": {
"vite": "^8.0.10" "vite": "^8.2.1"
} }
} }

View file

@ -15,15 +15,15 @@
}, },
"dependencies": { "dependencies": {
"@codemirror/autocomplete": "^6.20.3", "@codemirror/autocomplete": "^6.20.3",
"@codemirror/commands": "^6.10.2", "@codemirror/commands": "^6.10.4",
"@codemirror/lang-markdown": "^6.5.0", "@codemirror/lang-markdown": "^6.5.2",
"@codemirror/language": "^6.12.4", "@codemirror/language": "^6.12.4",
"@codemirror/state": "^6.5.4", "@codemirror/state": "^6.7.1",
"@codemirror/view": "^6.41.1", "@codemirror/view": "^6.43.8",
"@methanium/ui": "*", "@methanium/ui": "*",
"@twemoji/api": "^17.0.3", "@twemoji/api": "^17.0.3",
"emojibase-data": "^17.0.0", "emojibase-data": "^17.0.0",
"react": "^19.2.0", "react": "^19.2.8",
"react-dom": "^19.2.0" "react-dom": "^19.2.8"
} }
} }

View file

@ -12,18 +12,17 @@
"build": "tsc -p tsconfig.json --noEmit" "build": "tsc -p tsconfig.json --noEmit"
}, },
"dependencies": { "dependencies": {
"@tauri-apps/api": "^2", "@methanium/ui": "*",
"@tauri-apps/api": "^2.11.1",
"@tensamin/crypto": "workspace:*", "@tensamin/crypto": "workspace:*",
"@tensamin/shared": "workspace:*", "@tensamin/shared": "workspace:*",
"@tensamin/storage": "workspace:*", "@tensamin/storage": "workspace:*",
"@methanium/ui": "*",
"lucide-react": "^1.14.0",
"mtp": "*", "mtp": "*",
"react": "^19.2.0", "react": "^19.2.8",
"react-dom": "^19.2.0", "react-dom": "^19.2.8",
"zod": "^4.4.2" "zod": "^4.4.3"
}, },
"devDependencies": { "devDependencies": {
"eslint": "^10.0.3" "eslint": "^10.8.0"
} }
} }

View file

@ -12,19 +12,18 @@
"build": "tsc -p tsconfig.json --noEmit" "build": "tsc -p tsconfig.json --noEmit"
}, },
"dependencies": { "dependencies": {
"@tanstack/react-router": "^1.169.1",
"@tauri-apps/api": "^2.11.0",
"@tauri-apps/plugin-notification": "~2",
"@tensamin/crypto": "workspace:*",
"@tensamin/shared": "workspace:*",
"@tensamin/chat": "workspace:*",
"@tensamin/storage": "workspace:*",
"@tensamin/mtp": "workspace:*",
"@methanium/ui": "*", "@methanium/ui": "*",
"@tanstack/react-router": "^1.170.21",
"@tauri-apps/api": "^2.11.1",
"@tauri-apps/plugin-notification": "~2.3.3",
"@tensamin/chat": "workspace:*",
"@tensamin/crypto": "workspace:*",
"@tensamin/mtp": "workspace:*",
"@tensamin/shared": "workspace:*",
"@tensamin/storage": "workspace:*",
"@tensamin/user": "workspace:*", "@tensamin/user": "workspace:*",
"react": "^19.2.0", "react": "^19.2.8",
"react-dom": "^19.2.0", "react-dom": "^19.2.8",
"sonner": "^2.0.7", "sonner": "^2.0.7"
"zod": "^4.3.6"
} }
} }

View file

@ -12,14 +12,14 @@
"build": "tsc -p tsconfig.json --noEmit" "build": "tsc -p tsconfig.json --noEmit"
}, },
"dependencies": { "dependencies": {
"@tauri-apps/api": "^2", "@methanium/ui": "*",
"@tauri-apps/plugin-notification": "~2", "@tauri-apps/api": "^2.11.1",
"@tauri-apps/plugin-notification": "~2.3.3",
"@tensamin/shared": "workspace:*", "@tensamin/shared": "workspace:*",
"@tensamin/storage": "workspace:*", "@tensamin/storage": "workspace:*",
"@methanium/ui": "*", "lucide-react": "^1.29.0",
"lucide-react": "^1.14.0", "react": "^19.2.8",
"react": "^19.2.0", "react-dom": "^19.2.8",
"react-dom": "^19.2.0", "zod": "^4.4.3"
"zod": "^4.3.6"
} }
} }

View file

@ -12,20 +12,20 @@
"build": "tsc -p tsconfig.json --noEmit" "build": "tsc -p tsconfig.json --noEmit"
}, },
"dependencies": { "dependencies": {
"@tanstack/react-router": "^1.169.1", "@methanium/ui": "*",
"@tanstack/react-router": "^1.170.21",
"@tensamin/cache": "workspace:*", "@tensamin/cache": "workspace:*",
"@tensamin/hotkeys": "workspace:*", "@tensamin/hotkeys": "workspace:*",
"@tensamin/markdown": "workspace:*", "@tensamin/markdown": "workspace:*",
"@tensamin/mtp": "workspace:*", "@tensamin/mtp": "workspace:*",
"@tensamin/shared": "workspace:*", "@tensamin/shared": "workspace:*",
"@tensamin/storage": "workspace:*", "@tensamin/storage": "workspace:*",
"@methanium/ui": "*",
"@tensamin/user": "workspace:*", "@tensamin/user": "workspace:*",
"lucide-react": "^1.14.0", "lucide-react": "^1.29.0",
"react": "^19.2.0", "react": "^19.2.8",
"react-dom": "^19.2.0" "react-dom": "^19.2.8"
}, },
"devDependencies": { "devDependencies": {
"vite": "^8.0.10" "vite": "^8.2.1"
} }
} }

View file

@ -22,9 +22,9 @@
}, },
"dependencies": { "dependencies": {
"@methanium/ui": "*", "@methanium/ui": "*",
"lucide-react": "^1.14.0", "lucide-react": "^1.29.0",
"react": "^19.2.0", "react": "^19.2.8",
"react-dom": "^19.2.0", "react-dom": "^19.2.8",
"zod": "^4.3.6" "zod": "^4.4.3"
} }
} }

View file

@ -14,12 +14,12 @@
"build": "tsc -p tsconfig.json --noEmit" "build": "tsc -p tsconfig.json --noEmit"
}, },
"dependencies": { "dependencies": {
"@tauri-apps/api": "^2",
"@tensamin/cache": "workspace:*",
"@tensamin/shared": "workspace:*",
"@tensamin/mtp": "workspace:*",
"@methanium/ui": "*", "@methanium/ui": "*",
"react": "^19.2.0", "@tauri-apps/api": "^2.11.1",
"react-dom": "^19.2.0" "@tensamin/cache": "workspace:*",
"@tensamin/mtp": "workspace:*",
"@tensamin/shared": "workspace:*",
"react": "^19.2.8",
"react-dom": "^19.2.8"
} }
} }

View file

@ -12,17 +12,15 @@
"build": "tsc -p tsconfig.json --noEmit" "build": "tsc -p tsconfig.json --noEmit"
}, },
"dependencies": { "dependencies": {
"@tanstack/react-router": "^1.0.0", "@methanium/ui": "*",
"@tauri-apps/api": "^2.10.1", "@tanstack/react-router": "^1.170.21",
"@tensamin/crypto": "workspace:*", "@tensamin/crypto": "workspace:*",
"@tensamin/mtp": "workspace:*",
"@tensamin/shared": "workspace:*", "@tensamin/shared": "workspace:*",
"@tensamin/storage": "workspace:*", "@tensamin/storage": "workspace:*",
"@tensamin/tauri": "workspace:*", "@tensamin/tauri": "workspace:*",
"@tensamin/mtp": "workspace:*",
"@methanium/ui": "*",
"@tensamin/user": "workspace:*", "@tensamin/user": "workspace:*",
"lucide-react": "^1.8.0", "react": "^19.2.8",
"react": "^19.2.0", "react-dom": "^19.2.8"
"react-dom": "^19.2.0"
} }
} }

View file

@ -18,8 +18,8 @@
"@tensamin/mtp": "workspace:*", "@tensamin/mtp": "workspace:*",
"@tensamin/shared": "workspace:*", "@tensamin/shared": "workspace:*",
"@tensamin/storage": "workspace:*", "@tensamin/storage": "workspace:*",
"react": "^19.2.0", "react": "^19.2.8",
"react-dom": "^19.2.0", "react-dom": "^19.2.8",
"zod": "^4.3.6" "zod": "^4.4.3"
} }
} }

11048
pnpm-lock.yaml generated

File diff suppressed because it is too large Load diff