diff --git a/apps/desktop/package.json b/apps/desktop/package.json index 0936fe70..2750d5cb 100644 --- a/apps/desktop/package.json +++ b/apps/desktop/package.json @@ -1,6 +1,6 @@ { "name": "@trixty/desktop", - "version": "1.0.14", + "version": "1.1.5", "private": true, "scripts": { "dev": "next dev", diff --git a/apps/desktop/src-tauri/src/discord_rpc.rs b/apps/desktop/src-tauri/src/discord_rpc.rs index aeeed926..b8efb5cd 100644 --- a/apps/desktop/src-tauri/src/discord_rpc.rs +++ b/apps/desktop/src-tauri/src/discord_rpc.rs @@ -1,7 +1,6 @@ use serde::{Deserialize, Serialize}; use serde_json::{json, Value}; -use std::env; -use std::path::PathBuf; + use tokio::io::{AsyncReadExt, AsyncWriteExt}; #[cfg(unix)] use tokio::net::UnixStream; diff --git a/apps/desktop/src-tauri/src/lib.rs b/apps/desktop/src-tauri/src/lib.rs index fc04f159..f58bd1ca 100644 --- a/apps/desktop/src-tauri/src/lib.rs +++ b/apps/desktop/src-tauri/src/lib.rs @@ -8,7 +8,7 @@ mod http; mod pty; mod discord_rpc; -use cli::CliWorkspace; + use error::redact_user_paths; mod extensions; diff --git a/apps/desktop/src/api/builtin.l10n.ts b/apps/desktop/src/api/builtin.l10n.ts index 11637546..012f5d22 100644 --- a/apps/desktop/src/api/builtin.l10n.ts +++ b/apps/desktop/src/api/builtin.l10n.ts @@ -1004,6 +1004,9 @@ export function registerBuiltinTranslations() { 'agent.configuration.loadonstartup_warning': 'Aviso: Esto puede provocar ralentización del sistema y hacer que Trixty tarde más en cargar mientras el modelo se sube a la memoria.', 'agent.configuration.loadonstartup_ping_desc': 'Trixty enviará una señal en segundo plano para cargar los modelos al iniciar la aplicación.', 'agent.configuration.keepalive_unit': 'minutos', + 'agent.configuration.ai_agent_suffix': 'Agente de IA', + 'agent.configuration.time_m': '{n}m', + 'agent.configuration.time_h': '{n}h', 'agent.configuration.provider_keys_label': 'Permitir Claves de Proveedor', 'agent.configuration.provider_keys_desc': 'Desbloquea proveedores en la nube (OpenAI, Anthropic, Gemini, OpenRouter) en el encabezado del chat y revela el submenú Claves de Proveedor donde guardas las credenciales API.', 'agent.configuration.inline_suggestions_label': 'Sugerencias de código en línea', @@ -1033,10 +1036,6 @@ export function registerBuiltinTranslations() { 'settings.about.logo_alt': 'Logo de Trixty', 'settings.general.exclude_title_part1': 'Archivos: ', 'settings.general.exclude_title_part2': 'Excluir', - 'agent.configuration.keepalive_unit': 'minutos', - 'agent.configuration.ai_agent_suffix': 'Agente de IA', - 'agent.configuration.time_m': '{n}m', - 'agent.configuration.time_h': '{n}h', 'onboarding.language.en_native': 'Inglés (EE. UU.)', 'onboarding.language.es_native': 'Español', }); diff --git a/apps/desktop/src/components/StatusBar.tsx b/apps/desktop/src/components/StatusBar.tsx index f64fa526..2fe46275 100644 --- a/apps/desktop/src/components/StatusBar.tsx +++ b/apps/desktop/src/components/StatusBar.tsx @@ -89,8 +89,8 @@ const StatusBar: React.FC = () => { .filter(u => u.user && u.user.clientId !== (provider?.awareness?.clientID)) .map((u, i) => (
-
- {u.user.name} +
+ {u.user?.name}
))}
diff --git a/apps/desktop/src/components/TabBar.tsx b/apps/desktop/src/components/TabBar.tsx index 3b3a5134..5f51b7df 100644 --- a/apps/desktop/src/components/TabBar.tsx +++ b/apps/desktop/src/components/TabBar.tsx @@ -115,8 +115,8 @@ const TabBar: React.FC = () => { className="flex bg-surface-1 h-[36px] overflow-x-auto scrollbar-none border-b border-border-subtle shrink-0" > {openFiles.map((file) => { - const isActive = currentFile && - file.path.replace(/\\/g, "/").toLowerCase() === currentFile.path.replace(/\\/g, "/").toLowerCase(); + const isActive = !!(currentFile && + file.path.replace(/\\/g, "/").toLowerCase() === currentFile.path.replace(/\\/g, "/").toLowerCase()); return (
Promise; @@ -28,7 +40,7 @@ export function CollaborationProvider({ children }: { children: React.ReactNode const [isCollaborating, setIsCollaborating] = useState(false); const [role, setRole] = useState<"host" | "guest" | null>(null); const [joinSecret, setJoinSecret] = useState(null); - const [activeUsers, setActiveUsers] = useState([]); + const [activeUsers, setActiveUsers] = useState([]); const { systemSettings } = useSettings(); const ydoc = useMemo(() => new Y.Doc(), []); @@ -65,7 +77,7 @@ export function CollaborationProvider({ children }: { children: React.ReactNode }); // Listen for Discord RPC events - const unlisten = listen("discord-rpc-event", (event: any) => { + const unlisten = listen("discord-rpc-event", (event: { payload: any }) => { const { evt, data } = event.payload; if (evt === "ACTIVITY_JOIN_REQUEST") { const { user } = data; @@ -135,7 +147,7 @@ export function CollaborationProvider({ children }: { children: React.ReactNode try { await invoke("accept_discord_join_request", { userId }); toast.success("Accepted join request"); - } catch (err) { + } catch { toast.error("Failed to accept join request"); } }; @@ -144,7 +156,7 @@ export function CollaborationProvider({ children }: { children: React.ReactNode try { await invoke("reject_discord_join_request", { userId }); toast.info("Rejected join request"); - } catch (err) { + } catch { toast.error("Failed to reject join request"); } }; diff --git a/apps/desktop/src/hooks/useWorkspaceSync.ts b/apps/desktop/src/hooks/useWorkspaceSync.ts index 2e9e83f1..f972e8d0 100644 --- a/apps/desktop/src/hooks/useWorkspaceSync.ts +++ b/apps/desktop/src/hooks/useWorkspaceSync.ts @@ -2,7 +2,7 @@ import { useEffect, useCallback } from "react"; import { invoke } from "@tauri-apps/api/core"; import { useCollaboration } from "@/context/CollaborationContext"; import { useWorkspace } from "@/context/WorkspaceContext"; -import { useSettings } from "@/context/SettingsContext"; + import * as Y from "yjs"; interface FileEntry { @@ -15,9 +15,9 @@ interface FileEntry { export function useWorkspaceSync() { const { isCollaborating, role, ydoc } = useCollaboration(); const { rootPath } = useWorkspace(); - const { systemSettings } = useSettings(); - const syncDirectory = useCallback(async (path: string, map: Y.Map) => { + + const syncDirectory = useCallback(async (path: string, map: Y.Map) => { try { const data = await invoke("read_directory", { path }); @@ -46,14 +46,14 @@ export function useWorkspaceSync() { syncDirectory(rootPath, workspaceMap); // Listen for file requests from guests - const requestObserver = async (event: any) => { + const requestObserver = async (event: Y.YMapEvent) => { for (const [path, action] of event.keys) { if (action.action === "add" || action.action === "update") { const req = fileRequests.get(path); if (!req) continue; try { - const content = await invoke("read_file", { path }, { silent: true }); + const content = await invoke("read_file", { path }); const sharedText = ydoc.getText(`file:${path}`); // Only populate if empty to avoid overwriting current edits