Saltar al contenido
CADCAMFUN
Documentos

Documentación

Interfaz de usuario de escritorio

Espacios de trabajo SolidJS, un cliente API local y un shell Tauri que posee integración nativa.

Traducido automáticamente del inglés. Ver el original en inglés

Arquitectura de aplicaciones

La aplicación de escritorio combina una vista web SolidJS, Vite, Three.js y un shell Tauri v2 Rust. La vista web posee pantallas y estado de interacción. El sidecar Bun posee controladores API, acceso a bases de datos, sesiones de IA y servicios de proyectos. El proceso Rust posee la ventana, los menús, la bandeja, los cuadros de diálogo del sistema operativo, el acceso al llavero, las actualizaciones y el ciclo de vida del sidecar.

apps/desktop/src/main.tsx monta la aplicación. app/App.tsx establece la conexión API y proporciona el estado compartido; app/routes.tsx asigna URL a módulos de páginas diferidas. Las pantallas de funciones viven en features/. La presencia de una ruta no establece la disponibilidad de sus servicios externos: la facturación necesita la configuración de Stripe y la IA necesita un proveedor configurado.

Recuperación de inicio y conexión.

  1. El shell inicia el sidecar incluido con un token de inicio generado y directorios de migración y datos de la aplicación.
  2. El sidecar une un puerto efímero en 127.0.0.1, espera a que responda su ruta de salud y escribe un JSON ready evento que contiene el puerto.
  3. La vista web invoca get_sidecar_endpoint y crea un cliente API y un tiempo de ejecución de Effect administrado.
  4. Una solicitud de salud exitosa crea el estado de la aplicación y monta el enrutador y el shell.

La vista web permite 150 segundos para la recuperación de la conexión, con un tiempo de espera de 30 segundos por intento y una pausa de reintento de 750 milisegundos. Los intentos fallidos descartan el punto final almacenado en caché para que un sidecar reiniciado pueda suministrar un nuevo puerto. El supervisor de Rust espera 60 segundos para cada protocolo de enlace listo y permite un reinicio automático. El reintento estará disponible cuando caduque el presupuesto de conexión de vista web.

La vista previa del navegador utiliza una API en memoria

Fuera de Tauri, un navegador sin VITE_SIDECAR_URL usos src/testing/fake-api.ts. Los datos de vista previa son locales para la página en ejecución; las colecciones no admitidas devuelven HTTP 501. Para conectar un navegador a un sidecar real, proporcione ambos VITE_SIDECAR_URL y VITE_SIDECAR_TOKEN al iniciar Vite.

Rutas de pantalla

ÁreaRutas y módulos
Proyectos/projects, /projects/create, /projects/:id, y /projects/:id/history; pantallas en features/projects/screens.
Diseño y fabricación/cad monturas CadPage; /cam monturas CamPage. Los dibujos y rutas de herramientas guardados tienen rutas detalladas independientes.
Recursos/library, /materials, /tools, /machiney sus páginas de detalles utilizan módulos de funciones de biblioteca. Los componentes tienen rutas listadas y detalladas.
Asistente/ai y el panel asistente acoplado comparten el estado de la función AI. La actividad de IA alterna el panel.
Ajustes/settings, /settings/companion, configuración de MCP y configuración de suscripción.
Cuenta y colaboraciónLas rutas de autenticación, perfil, organización, invitación, chat, mercado, complemento, costos, análisis y administración cargan cada módulo de funciones.

Usar app/routes.tsx para nombres de parámetros exactos y pages/ para localizar la pantalla montada en una URL. Los adaptadores de ruta son intencionalmente pequeños; lea la pantalla y sus llamadas API al diagnosticar una vista vacía o una acción fallida.

Organización fuente

  • app/: inicio, enrutador, cliente API global, integración nativa, shell y atajos de teclado.
  • pages/: adaptadores de ruta que importan o reexportan pantallas.
  • features/: áreas de productos con pantallas, componentes, ganchos, estado y ayudantes específicos de dominio.
  • shared/: controles reutilizables, componentes de shell, estado de la aplicación, almacenamiento en caché de consultas e historial de comandos.
  • viewport/: dibujo de lienzo, ajuste, gestos de herramientas, renderizado, mallado y reproducción de Three.js.
  • i18n/, styles/, y testing/: traducciones, estilos globales y accesorios de prueba.

El escritorio depende de @cadcamfun/api para el contrato HTTP y en @cadcamfun/core para operaciones de geometría y CAM. La persistencia de la base de datos permanece detrás de la API complementaria. El historial del editor local es distinto de las versiones persistentes de dibujo o trayectoria y del control de versiones del proyecto.

caparazón nativo

La ventana de producción es 1440 × 900 de forma predeterminada, con un mínimo de 960 × 600. Tauri prepara el frontend desde apps/desktop/dist, un sidecar específico para objetivos de src-tauri/binaries, y generaron migraciones como recursos. se registra .cadcam, .nc, y .gcode asociaciones de archivos. Al abrir un archivo compatible o iniciar una segunda instancia, se reenvían las rutas de los archivos a la ventana existente.

src-tauri/src/sidecar.rs supervisa el proceso hijo. Al cerrar la aplicación se escribe un {"event":"shutdown"} línea al stdin del niño y espera brevemente antes de cosecharlo; el niño también observa el cierre estándar. El token de lanzamiento consta de 32 bytes aleatorios, codificados en hexadecimal como 64 caracteres y las líneas de registro complementarias que pueden contener credenciales están redactadas. Los registros están separados de la salida estándar, que lleva el protocolo de enlace listo/error. Se accede a los secretos nativos a través de src-tauri/src/secrets.rs usando el llavero del sistema operativo.

En macOS, el shell registra el complemento Liquid Glass. La vista web sigue la configuración del cristal y retrocede cuando el efecto no está disponible. La configuración de la App Store desactiva la opción de API privada; la configuración habitual lo permite. Estas son configuraciones de compilación independientes.

Límites de seguridad y persistencia

La política de contenido de producción permite activos locales, conexiones API de bucle invertido, imágenes de datos/blobs y evaluación de WebAssembly. No permite la ejecución remota de scripts arbitrarios. Los permisos nativos tienen un alcance en src-tauri/capabilities; la política de desarrollo también permite a Vite y su websocket.

open_path canonicaliza rutas, las limita a directorios de usuarios/aplicaciones permitidos y rechaza extensiones ejecutables como .exe, .app, .sh, .bat, .msi, y .jar. .. los segmentos y enlaces simbólicos no pueden escapar de las carpetas permitidas porque ambos lados están canonicalizados. La selección y el guardado de archivos utilizan diálogos y validación nativos. Un token de lanzamiento otorga acceso a la API de la aplicación local; trátelo por separado de un token complementario o de un token puente de IA con ámbito de proyecto.

La configuración de la interfaz de usuario, el estado de la consulta de la API, los comandos del editor, las versiones almacenadas del proyecto y los secretos nativos tienen propietarios diferentes. Diagnostique cada uno a través de su servicio real en lugar de asumir que todo el estado de la aplicación está almacenado en SQLite.

Integración de funciones

Los módulos de funciones CAD y CAM componen componentes de ventana gráfica reutilizables con sus propios paneles, tiendas y flujos de guardado. El panel asistente recibe el contexto del proyecto y del editor y transmite eventos de herramientas a través del estado de las funciones de IA. Las pantallas de recursos utilizan el cliente API en lugar de acceder directamente a la base de datos.

Para un cambio de interfaz de usuario, siga el adaptador de ruta hasta su pantalla de funciones y luego inspeccione el almacén de funciones o el enlace que envía la solicitud. Reutilice los componentes compartidos solo cuando su contrato existente coincida con la interacción. Mantenga la geometría pura en el paquete principal y el comportamiento nativo del sistema operativo en el shell Rust.

Carga de ruta y errores

Cada ruta utiliza el límite de importación diferido de Solid. La tabla incluye una página general, /500, /offliney vías legales. Se debe realizar una navegación directa del navegador a través del servidor de desarrollo de Vite o la vista web empaquetada para que el enrutador del cliente pueda resolver la URL.

La API de vista previa implementa un conjunto limitado de colecciones y puede inyectar deliberadamente errores de solicitud en las pruebas. Una vista previa exitosa del renderizado demuestra el comportamiento de la interfaz de usuario frente a esos dispositivos; verifique la persistencia, los permisos, la transmisión y las integraciones externas con el sidecar en vivo.

Interfaz de comando nativa

DominioObjetivo
get_sidecar_endpointEspere el sidecar supervisado y devuelva su URL base y su token de inicio. La espera cubre un reinicio: dos tiempos de espera de preparación de 60 segundos más 5 segundos (125 segundos).
get_logs_dir, open_pathResuelva el directorio de registro de la aplicación como una cadena y abra una ruta absoluta existente con el abridor del sistema operativo. Las rutas deben resolverse en la carpeta de datos, registro, Documentos, Descargas o Escritorio de la aplicación.
secret_get, secret_set, secret_deleteAcceda a las entradas del llavero nativo en com.cadcamfun.app servicio. Las claves son 1–128 bytes de letras ASCII, dígitos y . _ - : (por ejemplo ai.anthropic.apiKey); secret_get regresa null por una entrada faltante.
pick_file, save_filepick_file({ filters: [{ name, extensions }] }) devuelve la ruta elegida o null al cancelar. save_file({ defaultName, contents }) escribe texto UTF-8 en la ruta elegida y lo devuelve, o null al cancelar; Se rechazan los directorios y extensiones ejecutables.
set_recent_projectsActualiza el menú de proyectos recientes de la bandeja.
check_for_updates, install_updateSolicite una verificación del actualizador o instale una actualización pendiente. install_update acepta una opción unsavedWork bandera (predeterminada false) para que una instalación no interrumpa un editor abierto.

The invoke handler is registered in src-tauri/src/lib.rs. Capabilities and generated command permissions also control availability; command registration alone does not establish webview access. Command errors are serialized as { kind, message } with kinds such as sidecar, invalid_path, io, dialog, and path; no command panics.

eventos nativos

La concha emite sidecar-status para cambios en el ciclo de vida, open-file con caminos apoyados, menu para la selección del menú, y update://status para ver el progreso del actualizador. Las selecciones de proyectos recientes de la bandeja están representadas por tray.recent.<projectId> identificadores de menú. Los módulos de menú y bandeja del shell definen sus conjuntos completos de identificadores.

Los oyentes deben tener como alcance el ciclo de vida de su componente o aplicación y eliminarse durante la limpieza. La vista web debe volver a resolver el punto final después de reiniciar el sidecar en lugar de continuar usando el puerto anterior.

Desarrollo y verificación

Ejecutar desde la raíz del repositorio
bun run --filter @cadcamfun/desktop dev
bun run desktop:dev
bun run --filter @cadcamfun/desktop typecheck
bun test apps/desktop/src
bun run build:desktop

El primer comando ejecuta una vista previa del navegador. desktop:dev compila el sidecar real y organiza las migraciones antes de iniciar Tauri. El paquete de escritorio tauri:dev en su lugar, el script crea un código auxiliar sólo cuando no existe ningún binario; Úselo para trabajos de shell aislados y verifique qué binario está presente antes de interpretar sus respuestas API.

el escritorio build ejecución del script vite build solo; no compila el sidecar ni empaqueta un paquete Tauri. Usar bun scripts/build.ts para conocer el proceso de lanzamiento completo (consulte Liberar).

Preferencias y configuraciones

El almacén de configuración compartida conserva un registro validado en cadcamfun.settings en el almacenamiento local de webview. Los campos faltantes, no válidos o ilegibles vuelven a aparecer de forma independiente. Un área de almacenamiento llena o bloqueada no detiene la edición, pero es posible que los cambios de preferencias no persistan. Las preferencias de vista previa del navegador pertenecen al origen del navegador y son independientes de las preferencias de vista web nativa.

ConfiguraciónValores aceptados/predeterminadoEfecto operativo
Temalight, dark, system; sistema predeterminadoEl modo del sistema sigue los cambios en la combinación de colores del sistema operativo.
Unidades de visualizaciónmm o in; mm predeterminadoPresentación de controles; Las coordenadas del dibujo central siguen siendo milímetros.
decimalesEntero 0–6; predeterminado 3Precisión de presentación de longitud.
Publicación predeterminadagrbl, linuxcnc, smoothwb, gcode, fanuc; grbl predeterminadoUna gramática de salida seleccionada es una preferencia, no una prueba de que la máquina esté configurada o verificada.
Tolerancia de dibujoTolerancia central validada; predeterminado 0.01 mmPreferencia de precisión compartida utilizada por los consumidores de dibujos/trayectorias.
Estado de ajustebooleano; habilitado por defectoPreferencia de estado compartido. Los editores individuales son dueños de su comportamiento de captura; el independiente Editor2D actualmente habilita su ajuste de cuadrícula internamente.
Vasobooleano; habilitado por defectoSolicita material de ventana de macOS cuando el host nativo lo admite.

La pantalla Configuración tiene pestañas Perfil, Cuenta, Seguridad, Suscripción, Notificaciones, IA, Dispositivos e Idioma. La pestaña Dispositivos incorpora el panel de puerta de enlace complementario. La configuración de idioma incluye el interruptor de cristal. El almacén de configuración regional común valida actualmente la configuración regional predeterminada; no infiera cobertura de traducción adicional a partir de una lista de etiquetas de visualización.

Guardar y volver a abrir un programa CAM

  1. Genere o cargue código NC en CAM y abra el cuadro de diálogo guardar/exportar desde su punto de entrada existente.
  2. Para exportar un archivo, elija el código G o el formato de ruta de herramienta portátil. El código G descarga el texto NC actual; la elección de la trayectoria escribe una estructura .cam.json instantánea.
  3. Para la persistencia de la aplicación, elija un proyecto existente, un proyecto nuevo o actualice el programa ya guardado. Proporcione el nombre del programa y los campos de destino requeridos.
  4. Al actualizar, el flujo de guardado registra el programa completo anterior como una versión de la trayectoria antes de reemplazar los datos actuales.
  5. Abra el elemento guardado en su ruta detallada de la ruta de herramienta para inspeccionar o restaurar versiones.

El resumen guardado incluye líneas NC, bytes, movimientos, identificadores de herramientas, nombres de operaciones, stock, unidades, compensación de trabajo e identidad de verificación cuando esa evidencia pertenece al NC actual. Un texto NC modificado puede hacer que la evidencia previamente calculada quede obsoleta. Revise la relación código/evidencia actual antes de confiar en el resumen.

Si la creación de un nuevo proyecto tiene éxito pero un paso posterior para guardar falla, el modal conserva el destino creado para los reintentos e incluye su identificador en el error. Reintentar dentro de ese modal evita crear el mismo proyecto nuevamente. No asuma que el flujo de guardado es una transacción atómica entre recursos.

La exportación de archivos y la persistencia del proyecto son operaciones diferentes.

Un archivo de código G descargado no crea una fila de ruta de herramienta del proyecto. Una instantánea portátil tiene un estado más rico que una simple NC. Verifique un programa guardado volviéndolo a abrir desde la aplicación y verifique una exportación inspeccionando el archivo descargado.

Teclado y diagnóstico de fallos.

Cmd/Ctrl+K abre la paleta de comandos y Cmd/Ctrl+J alterna el panel asistente. Los accesos directos del Shell se ignoran cuando el foco está en una entrada, un área de texto, una selección o un elemento de contenido editable. Los lienzos del editor tienen su propio manejo del teclado. Varias devoluciones de llamadas de comandos de shell, incluido Guardar/Exportar en la tabla de accesos directos genéricos, son marcadores de posición; utilice los controles reales de guardar/exportar de la función en lugar de asumir que cada acelerador enumerado realiza una operación de documento.

Comportamiento observadoControlar
El inicio espera y luego aparece ReintentarError de sidecar/salida lista, binario de destino, recursos de migración y registros de aplicaciones. Un puerto almacenado en caché puede pertenecer a un proceso anterior.
Se muestra una pantalla pero solicita devolución 501Modo accesorio del navegador. Inicie el sidecar real y pase ambas variables de punto final de Vite.
Los datos de escritorio difieren de un script manualEl directorio de datos y el token de cada proceso; un nombre de archivo por sí solo no identifica la base de datos.
Un comando nativo no está disponibleInvoque el registro, los permisos de capacidad, la compatibilidad con el sistema operativo y si el código se ejecuta dentro de Tauri.
La configuración se revierte después del reinicioDisponibilidad de almacenamiento y validación. Los campos almacenados no válidos vuelven a los valores predeterminados.
La evidencia del programa guardado difiere de NCSi NC fue editado tras generación. Vuelva a calcular la verificación adecuada para el texto/programa real.

Anclas de implementación: shared/state/settings.ts, app/shortcuts.ts, features/settings/screens/settings.tsx, y features/cam/components/SaveCamModal.tsx.

Cargas útiles de eventos nativos

EventoCarga útilNotas
sidecar-status{ state: "starting" }, { state: "ready", port }, { state: "restarting" }, { state: "failed", message }Después restarting, llamar get_sidecar_endpoint de nuevo; el puerto cambia.
update://statusstatus: checking, upToDate (version), available (version, notes, date, critical), downloading (downloaded, total), ready (version), failed (message); más dismissibleUna actualización crítica y un reinicio pendiente no se pueden descartar. Una verificación fallida nunca se muestra como un error de bloqueo.
menuID de elemento de menú, como file.new, file.open, file.save, view.devtools, help.documentationUso de elementos de la bandeja tray.quit y tray.recent.<projectId>.
open-fileCaminos de .cadcam, .nc, o .gcode archivosSe envía cuando el sistema operativo abre un archivo con la aplicación o se inicia una segunda instancia.
install_update se puede rechazar con un motivo escrito: unsavedWork ("el editor tiene trabajo sin guardar; aplique la actualización una vez guardado"), noneAvailable (nada pendiente o ya instalado), o failed (la descarga o la verificación de firma fallaron). Instala solo la actualización que anunció la última verificación.
Llamar comandos nativos desde la vista web
import { invoke } from "@tauri-apps/api/core"
import { listen } from "@tauri-apps/api/event"

const { baseUrl, token } = await invoke<{ baseUrl: string; token: string }>("get_sidecar_endpoint")

const path = await invoke<string | null>("pick_file", {
  filters: [{ name: "G-code", extensions: ["nc", "gcode"] }],
})                                    // null when the user cancels

await invoke("save_file", { defaultName: "part.nc", contents: gcodeText })

const unlisten = await listen<{ state: string; port?: number }>("sidecar-status", (e) => {
  if (e.payload.state === "ready") reconnect()
})
// later: unlisten()

try {
  await invoke("install_update", { unsavedWork: editorIsDirty })
} catch (error) {
  // { kind, message }: the update variant carries the refusal (unsavedWork | noneAvailable | failed)
}

get_sidecar_endpoint regresa { baseUrl, token } (seriado en camelCase de SidecarEndpoint). Los errores de cada comando llegan como el valor rechazado de invoke, en forma { kind, message }.

Atajos de teclado

AtajoAcciónGrupo
Cmd/Ctrl+KAbrir la paleta de comandosnavegación
Cmd/Ctrl+Shift+PNuevo proyectonavegación
Cmd/Ctrl+Z / Cmd/Ctrl+Shift+ZDeshacer/rehacereditar
Cmd/Ctrl+S, Cmd/Ctrl+Shift+EGuardar, exportar (marcadores de posición del shell; use los controles propios de la función)editar
Cmd/Ctrl+0Ampliar para ajustarvista
Cmd/Ctrl+= / Cmd/Ctrl+-Acercar/alejarvista
Cmd/Ctrl+JAlternar el panel asistenteai
Cmd se aplica en macOS y Ctrl en otra parte. El ID de cada acceso directo es también su sufijo de clave de traducción (por ejemplo settings.shortcut.palette), y la pantalla Configuración muestra esta misma tabla, por lo que la documentación y la aplicación no pueden separarse.

Cada ruta de pantalla

El enrutador en apps/desktop/src/app/routes.tsx declara 68 rutas, cada una cargada de forma diferida desde apps/desktop/src/pages/ (los segmentos dinámicos son _id_.tsx archivos). Agrupados por primer segmento:

ÁreaRutas
**
500/500
admin/admin/analytics /admin/feature-flags
ai/ai
analytics/analytics/history /analytics
auth/auth/forgot-password /auth/magic-link /auth/magic-link/verify /auth/reset-password /auth/signin /auth/signup /auth/two-factor /auth/verify-email /auth/verify
cad/cad
cam/cam
costs/costs
components/components/:id /components
drawings/drawings/:id
//
invitations/invitations/:token
legal/legal/privacy /legal/terms /legal/third-party-licenses
library/library
machine/machine/:id /machine
marketplace/marketplace /marketplace/items/:id /marketplace/purchase/success /marketplace/purchases /marketplace/seller/dashboard
materials/materials/:id /materials
mcp/mcp/directory /mcp/servers/:id
offline/offline
organizations/organizations/:id /organizations/:id/chat/:conversationId /organizations/:id/chat /organizations/:id/chat/new-group /organizations/:id/chat/new /organizations/create /organizations
plugins/plugins/:id /plugins
pricing/pricing
profile/profile /profile/settings
projects/projects/:id/history /projects/:id /projects/create /projects
settings/settings /settings/companion /settings/mcp/config-editor /settings/mcp/edit/:id /settings/mcp /settings/subscription
third-party-licenses/third-party-licenses
toolpaths/toolpaths/:id /toolpaths
tools/tools/:id /tools
waitlist/waitlist
* representa la página 404 y /500 la página de errores. /offline muestra la pantalla sin conexión; Al igual que las páginas de autenticación, invitación, 404, 500 y de éxito de compra, utiliza el diseño independiente sin la aplicación Chrome. Debido a que cada página es una importación diferida, el código de una pantalla solo se carga en la primera visita; una carga de fragmento fallida aparece como un error de ruta, no como una aplicación en blanco.

En 3D

Topología del proceso de escritorio Arrastrar para orbitar · desplazarse para hacer zoom · arrastrar con el botón derecho para desplazarse
Processes at run time. The Tauri shell spawns the sidecar and waits for its {”event”:”ready”,”port”:N} line on stdout (sidecar.rs); the webview then talks HTTP to 127.0.0.1 on that port with the bearer token. The sidecar owns the SQLite database, the embedded nikcli AI host (CADCAMFUN_AI_HOST=nikcli, the default) and plugins; the mobile app reaches it through companion pairing.