Documentazione
Interfaccia utente del desktop
Aree di lavoro SolidJS, un client API locale e una shell Tauri che possiede l'integrazione nativa.
Tradotto automaticamente dall'inglese. Vedi l'originale in inglese
Architettura dell'applicazione
L'applicazione desktop combina una visualizzazione web SolidJS, Vite, Three.js e una shell Tauri v2 Rust. La visualizzazione web possiede schermate e stato di interazione. Il sidecar Bun possiede gestori API, accesso al database, sessioni AI e servizi di progetto. Il processo Rust possiede la finestra, i menu, il vassoio, le finestre di dialogo del sistema operativo, l'accesso al portachiavi, gli aggiornamenti e il ciclo di vita del sidecar.
apps/desktop/src/main.tsx monta l'applicazione. app/App.tsx stabilisce la connessione API e fornisce lo stato condiviso; app/routes.tsx mappa gli URL ai moduli di pagina pigri. Schermate delle funzionalità in tempo reale features/. La presenza di un percorso non stabilisce la disponibilità dei suoi servizi esterni: la fatturazione necessita della configurazione di Stripe e l'AI necessita di un provider configurato.
Avvio e ripristino della connessione
- La shell avvia il sidecar in bundle con un token di avvio generato, i dati dell'applicazione e le directory di migrazione.
- Il sidecar lega un porto effimero
127.0.0.1, attende la risposta del percorso di integrità e scrive un JSONreadyevento contenente il porto. - La visualizzazione web invoca
get_sidecar_endpointe crea un client API e un runtime di effetti gestiti. - Una richiesta di integrità riuscita crea lo stato dell'applicazione e monta il router e la shell.
La visualizzazione web concede 150 secondi per il ripristino della connessione, con un timeout di 30 secondi per tentativo e una pausa tra i tentativi di 750 millisecondi. I tentativi falliti eliminano l'endpoint memorizzato nella cache in modo che un sidecar riavviato possa fornire una nuova porta. Il supervisore Rust attende 60 secondi per ogni handshake pronto e consente un riavvio automatico. Il nuovo tentativo diventa disponibile quando scade il budget per la connessione WebView.
L'anteprima del browser utilizza un'API in memoria
Fuori Tauri, un browser senza VITE_SIDECAR_URL usi src/testing/fake-api.ts. I dati di anteprima sono locali rispetto alla pagina in esecuzione; le raccolte non supportate restituiscono HTTP 501. Per connettere un browser a un vero sidecar, forniscili entrambi VITE_SIDECAR_URL e VITE_SIDECAR_TOKEN all'avvio di Vite.
Percorsi sullo schermo
| Zona | Percorsi e moduli |
|---|---|
| Progetti | /projects, /projects/create, /projects/:id, e /projects/:id/history; schermi dentro features/projects/screens. |
| Progettazione e produzione | /cad monta CadPage; /cam monta CamPage. I disegni e i percorsi utensile salvati hanno percorsi di dettaglio separati. |
| Risorse | /library, /materials, /tools, /machinee le relative pagine dei dettagli utilizzano i moduli delle funzionalità della libreria. I componenti hanno percorsi di elenco e dettaglio. |
| Assistente | /ai e il pannello assistente ancorato condividono lo stato delle funzionalità AI. L'attività AI attiva/disattiva il pannello. |
| Impostazioni | /settings, /settings/companion, impostazioni MCP e impostazioni di abbonamento. |
| Conto e collaborazione | Autenticazione, profilo, organizzazione, invito, chat, marketplace, plug-in, costi, analisi e percorsi di amministrazione caricano ogni modulo di funzionalità. |
Utilizzo app/routes.tsx per i nomi esatti dei parametri e pages/ per individuare lo schermo montato su un URL. Gli adattatori di percorso sono intenzionalmente piccoli; leggere lo schermo e le relative chiamate API durante la diagnosi di una vista vuota o di un'azione non riuscita.
Organizzazione delle fonti
app/: avvio, router, client API globale, integrazione nativa, shell e scorciatoie da tastiera.pages/: gli adattatori di percorso importano o riesportano le schermate.features/: aree di prodotto con schermate, componenti, hook, assistenti di stato e specifici del dominio.shared/: controlli riutilizzabili, componenti della shell, stato dell'applicazione, memorizzazione nella cache delle query e cronologia dei comandi.viewport/: disegno su tela, snap, gesti degli strumenti, rendering Three.js, meshing e riproduzione.i18n/,styles/, etesting/: traduzioni, stili globali e dispositivi di prova.
Il desktop dipende da @cadcamfun/api per il contratto HTTP e così via @cadcamfun/core per operazioni di geometria e CAM. La persistenza del database rimane dietro l'API sidecar. La cronologia dell'editor locale è distinta dalle versioni persistenti del disegno o del percorso utensile e dal controllo della versione del progetto.
Conchiglia nativa
La finestra di produzione è 1440 × 900 per impostazione predefinita, con un minimo di 960 × 600. Tauri mette in scena il frontend da apps/desktop/dist, un sidecar specifico per il target di src-tauri/binariese ha generato migrazioni come risorse. Si registra .cadcam, .nc, e .gcode associazioni di file. L'apertura di un file supportato o l'avvio di una seconda istanza inoltra i percorsi dei file alla finestra esistente.
src-tauri/src/sidecar.rs supervisiona il processo figlio. Chiudendo l'app scrive a {"event":"shutdown"} allinearsi allo stdin del bambino e attendere brevemente prima di raccoglierlo; il bambino osserva anche la chiusura dello stdin. Il token di avvio è di 32 byte casuali, codificato esadecimale come 64 caratteri e le righe di log sidecar che potrebbero contenere credenziali vengono oscurate. I log sono separati da stdout, che trasporta l'handshake ready/error. È possibile accedere ai segreti nativi tramite src-tauri/src/secrets.rs utilizzando il portachiavi del sistema operativo.
Su macOS, la shell registra il plugin Liquid Glass. La visualizzazione web segue l'impostazione del vetro e torna indietro quando l'effetto non è disponibile. La configurazione dell'App Store disabilita l'opzione API privata; la configurazione regolare lo consente. Queste sono configurazioni di build separate.
Limiti di sicurezza e persistenza
La policy del contenuto di produzione consente risorse locali, connessioni API di loopback, immagini di dati/blob e valutazione WebAssembly. Non garantisce l'esecuzione arbitraria di script remoti. L'ambito delle autorizzazioni native è incluso src-tauri/capabilities; la politica di sviluppo consente inoltre Vite e il suo websocket.
open_path canonicalizza i percorsi, li limita alle directory utente/applicazione consentite e rifiuta le estensioni eseguibili come .exe, .app, .sh, .bat, .msi, e .jar. .. segmenti e collegamenti simbolici non possono sfuggire alle cartelle consentite perché entrambi i lati sono canonizzati. La selezione e il salvataggio dei file utilizzano finestre di dialogo e convalida native. Un token di avvio garantisce l'accesso all'API dell'applicazione locale; trattalo separatamente da un token compagno o da un token bridge AI con ambito progetto.
Le impostazioni dell'interfaccia utente, lo stato delle query API, i comandi dell'editor, le versioni del progetto archiviate e i segreti nativi hanno proprietari diversi. Diagnostica ciascuno tramite il suo servizio effettivo anziché presupporre che tutto lo stato dell'applicazione sia archiviato in SQLite.
Integrazione delle funzionalità
I moduli di funzionalità CAD e CAM compongono componenti viewport riutilizzabili con i propri pannelli, archivi e flussi di salvataggio. Il pannello dell'assistente riceve il contesto del progetto e dell'editor e trasmette in streaming gli eventi dello strumento attraverso lo stato della funzionalità AI. Le schermate delle risorse utilizzano il client API invece di accedere direttamente al database.
Per una modifica dell'interfaccia utente, seguire l'adattatore di percorso fino alla relativa schermata delle funzionalità, quindi ispezionare l'archivio delle funzionalità o l'hook che invia la richiesta. Riutilizzare i componenti condivisi solo quando il loro contratto esistente corrisponde all'interazione. Mantieni la geometria pura nel pacchetto principale e il comportamento nativo del sistema operativo nella shell Rust.
Caricamento del percorso ed errori
Ogni percorso utilizza il limite di importazione pigro di Solid. La tabella include una pagina generale, /500, /offlinee vie legali. È necessario fornire una navigazione diretta nel browser tramite il server di sviluppo Vite o la visualizzazione Web in pacchetto in modo che il router client possa risolvere l'URL.
L'API di anteprima implementa un set limitato di raccolte e può inserire deliberatamente richieste non riuscite nei test. Un rendering di anteprima riuscito dimostra il comportamento dell'interfaccia utente rispetto a tali dispositivi; verificare la persistenza, le autorizzazioni, lo streaming e le integrazioni esterne con il sidecar live.
Interfaccia di comando nativa
| Comando | Scopo |
|---|---|
get_sidecar_endpoint | Attendi il sidecar supervisionato e restituisci l'URL di base e il token di avvio. L'attesa copre un riavvio: due timeout di disponibilità di 60 secondi più 5 secondi (125 secondi). |
get_logs_dir, open_path | Risolvi la directory del registro dell'applicazione come stringa e apri un percorso assoluto esistente con l'apri del sistema operativo. I percorsi devono essere risolti nella cartella dati dell'app, registro, documenti, download o desktop. |
secret_get, secret_set, secret_delete | Accedi alle voci del portachiavi nativo sotto il file com.cadcamfun.app servizio. Le chiavi sono 1–128 byte di lettere ASCII, cifre e . _ - : (per esempio ai.anthropic.apiKey); secret_get ritorna null per una voce mancante. |
pick_file, save_file | pick_file({ filters: [{ name, extensions }] }) restituisce il percorso scelto o null all'annullamento. save_file({ defaultName, contents }) scrive il testo UTF-8 nel percorso scelto e lo restituisce, oppure null all'annullamento; le directory e le estensioni eseguibili vengono rifiutate. |
set_recent_projects | Aggiorna il menu dei progetti recenti del vassoio. |
check_for_updates, install_update | Richiedi un controllo dell'aggiornamento o installa un aggiornamento in sospeso. install_update accetta un facoltativo unsavedWork bandiera (predefinito false) in modo che l'installazione non interrompa un editor aperto. |
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.
Eventi nativi
La conchiglia emette sidecar-status per i cambiamenti del ciclo di vita, open-file con percorsi supportati, menu per la selezione del menu e update://status per l'avanzamento dell'aggiornamento. Le selezioni dei progetti recenti del vassoio sono rappresentate da tray.recent.<projectId> identificatori del menu. Il menu della shell e i moduli del vassoio definiscono i loro set di identificatori completi.
Gli ascoltatori dovrebbero essere limitati al loro componente o al ciclo di vita dell'applicazione e rimossi durante la pulizia. La visualizzazione Web deve risolvere nuovamente l'endpoint dopo un riavvio sidecar anziché continuare a utilizzare la porta precedente.
Sviluppo e verifica
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 Il primo comando esegue un'anteprima del browser. desktop:dev compila il vero sidecar e mette in scena le migrazioni prima di avviare Tauri. Il pacchetto desktop è tauri:dev lo script invece crea uno stub binario solo quando non esiste alcun binario; usalo per il lavoro di shell isolato e controlla quale binario è presente prima di interpretare le sue risposte API.
La scrivania build viene eseguito lo script vite build soltanto; non compila il sidecar né impacchetta un pacchetto Tauri. Utilizzo bun scripts/build.ts per la pipeline di rilascio completa (vedi Pubblicazione).
Preferenze e impostazioni
L'archivio delle impostazioni condivise mantiene un record convalidato in cadcamfun.settings nella memoria locale di Webview. I campi mancanti, non validi o illeggibili rientrano in modo indipendente. Un'area di archiviazione piena o bloccata non interrompe la modifica, ma le modifiche alle preferenze potrebbero non persistere. Le preferenze di anteprima del browser appartengono all'origine del browser e sono separate dalle preferenze di visualizzazione Web native.
| Collocamento | Valori accettati/predefiniti | Effetto operativo |
|---|---|---|
| Tema | light, dark, system; sistema predefinito | La modalità di sistema segue le modifiche alla combinazione di colori del sistema operativo. |
| Unità espositive | mm o in; predefinito mm | Presentazione dei controlli; le coordinate del disegno principale rimangono millimetri. |
| Decimali | Numero intero 0–6; predefinito 3 | Precisione della presentazione della lunghezza. |
| Posta predefinita | grbl, linuxcnc, smoothwb, gcode, fanuc; grbl predefinito | Una grammatica di output selezionata è una preferenza, non una prova che la macchina sia configurata o verificata. |
| Tolleranza del disegno | Tolleranza centrale convalidata; predefinito 0.01 mm | Preferenza di precisione condivisa utilizzata dagli utenti del disegno/percorso utensile. |
| Stato dello snap | Booleano; abilitato per impostazione predefinita | Preferenza di stato condivisa. I singoli redattori possiedono il loro comportamento scattante; quello autonomo Editor2D attualmente abilita internamente lo snap alla griglia. |
| Bicchiere | Booleano; abilitato per impostazione predefinita | Richiede il materiale della finestra macOS quando l'host nativo lo supporta. |
La schermata Impostazioni contiene le schede Profilo, Account, Sicurezza, Abbonamento, Notifiche, AI, Dispositivi e Lingua. La scheda Dispositivi incorpora il pannello del gateway complementare. Le impostazioni della lingua includono la levetta del vetro. L'archivio locale comune attualmente convalida la locale predefinita; non dedurre ulteriore copertura della traduzione da un elenco di etichette visualizzate.
Salvare e riaprire un programma CAM
- Genera o carica il codice NC nel CAM e apri la finestra di dialogo di salvataggio/esportazione dal punto di ingresso esistente.
- Per un'esportazione di file, scegli il codice G o il formato del percorso utensile portatile. Il codice G scarica il testo NC corrente; la scelta del percorso utensile scrive un file strutturato
.cam.jsonistantanea. - Per la persistenza dell'applicazione, scegli un progetto esistente, un nuovo progetto o aggiorna il programma già salvato. Fornire il nome del programma e i campi di destinazione richiesti.
- Durante l'aggiornamento, il flusso di salvataggio registra il programma completo precedente come versione del percorso utensile prima di sostituire i dati correnti.
- Aprire l'elemento salvato nel percorso dei dettagli del percorso utensile per ispezionare o ripristinare le versioni.
Il riepilogo del salvataggio include righe NC, byte, movimenti, identificatori utensile, nomi operazioni, stock, unità, offset pezzo e identità di verifica quando tale prova appartiene all'NC corrente. Un testo NC modificato può rendere obsolete le prove precedentemente calcolate. Esaminare l'attuale relazione codice/evidenza prima di fare affidamento sul riepilogo.
Se la creazione di un nuovo progetto ha esito positivo ma un passaggio di salvataggio successivo non riesce, la modale conserva la destinazione creata per i tentativi e include il relativo identificatore nell'errore. Riprovare all'interno di quella modalità evita di creare nuovamente lo stesso progetto. Non dare per scontato che il flusso di salvataggio sia una transazione atomica tra risorse incrociate.
L'esportazione dei file e la persistenza del progetto sono operazioni diverse
Un file di codice G scaricato non crea una riga del percorso utensile del progetto. Uno snapshot portatile trasporta uno stato più ricco rispetto al semplice NC. Verifica un programma salvato riaprendolo dall'applicazione e verifica un'esportazione controllando il file scaricato.
Diagnosi della tastiera e dei guasti
Cmd/Ctrl+K apre la tavolozza dei comandi e Cmd/Ctrl+J attiva/disattiva il pannello dell'assistente. Le scorciatoie della shell vengono ignorate quando il focus è su un elemento input, textarea, select o content-modificabile. Le tele dell'editor hanno la propria gestione della tastiera. Diversi richiami ai comandi della shell, incluso Salva/Esporta nella tabella di scelta rapida generica, sono segnaposto; utilizzare gli effettivi controlli di salvataggio/esportazione della funzionalità invece di dare per scontato che ogni acceleratore elencato esegua un'operazione sul documento.
| Comportamento osservato | Controllo |
|---|---|
| L'avvio attende, quindi viene visualizzato Riprova | Output di errore/pronto sidecar, file binario di destinazione, risorsa di migrazione e log dell'applicazione. Una porta memorizzata nella cache può appartenere a un processo precedente. |
| Viene visualizzato uno schermo ma viene richiesto di restituire 501 | Modalità dispositivo del browser. Avvia il sidecar reale e passa entrambe le variabili dell'endpoint Vite. |
| I dati del desktop differiscono da uno script manuale | La directory dei dati e il token di ciascun processo; un nome file da solo non identifica il database. |
| Un comando nativo non è disponibile | Richiama la registrazione, le autorizzazioni per le funzionalità, il supporto del sistema operativo e se il codice viene eseguito all'interno di Tauri. |
| Le impostazioni vengono ripristinate dopo il riavvio | Disponibilità e convalida dello spazio di archiviazione. I campi memorizzati non validi tornano ai valori predefiniti. |
| L'evidenza del programma salvato differisce da NC | Se NC è stato modificato dopo la generazione. Ricalcolare la verifica appropriata per il testo/programma effettivo. |
Ancore di implementazione: shared/state/settings.ts, app/shortcuts.ts, features/settings/screens/settings.tsx, e features/cam/components/SaveCamModal.tsx.
Payload di eventi nativi
| Evento | Carico utile | Note |
|---|---|---|
sidecar-status | { state: "starting" }, { state: "ready", port }, { state: "restarting" }, { state: "failed", message } | Dopo restarting, chiamata get_sidecar_endpoint ancora; il porto cambia. |
update://status | status: checking, upToDate (version), available (version, notes, date, critical), downloading (downloaded, total), ready (version), failed (message); più dismissible | Un aggiornamento critico e un riavvio in sospeso non sono ignorabili. Un controllo fallito non viene mai visualizzato come errore bloccante. |
menu | ID della voce di menu, ad esempio file.new, file.open, file.save, view.devtools, help.documentation | Utilizzo degli articoli del vassoio tray.quit e tray.recent.<projectId>. |
open-file | Percorsi di .cadcam, .nc, o .gcode file | Inviato quando il sistema operativo apre un file con l'app o viene avviata una seconda istanza. |
install_update può essere rifiutato con una motivazione digitata: unsavedWork ("l'editor ha del lavoro non salvato; applica l'aggiornamento una volta salvato"), noneAvailable (niente in sospeso o già installato) o failed (download o controllo della firma non riusciti). Installa solo l'aggiornamento annunciato dall'ultimo controllo.
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 ritorna { baseUrl, token } (serializzato in camelCase da SidecarEndpoint). Gli errori da ogni comando arrivano come valore rifiutato di invoke, sagomato { kind, message }.
Scorciatoie da tastiera
| Scorciatoia | Azione | Gruppo |
|---|---|---|
Cmd/Ctrl+K | Apri la tavolozza dei comandi | navigazione |
Cmd/Ctrl+Shift+P | Nuovo progetto | navigazione |
Cmd/Ctrl+Z / Cmd/Ctrl+Shift+Z | Annulla/ripristina | modificare |
Cmd/Ctrl+S, Cmd/Ctrl+Shift+E | Salva, esporta (segnaposto della shell; utilizza i controlli della funzionalità) | modificare |
Cmd/Ctrl+0 | Zoom per adattare | visualizzazione |
Cmd/Ctrl+= / Cmd/Ctrl+- | Zoom avanti/indietro | visualizzazione |
Cmd/Ctrl+J | Attiva/disattiva il pannello dell'assistente | ai |
Cmd si applica su macOS e Ctrl altrove. L'ID di ogni scorciatoia è anche il suffisso della chiave di traduzione (ad esempio settings.shortcut.palette) e la schermata Impostazioni esegue il rendering della stessa tabella, in modo che la documentazione e l'app non possano discostarsi.
Ogni percorso sullo schermo
Il router dentro apps/desktop/src/app/routes.tsx dichiara 68 rotte, ciascuna caricata pigramente da apps/desktop/src/pages/ (i segmenti dinamici sono _id_.tsx file). Raggruppati per primo segmento:
| Zona | Percorsi |
|---|---|
* | * |
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 |
* esegue il rendering della pagina 404 e /500 la pagina di errore. /offline esegue il rendering dello schermo offline; come le pagine di autorizzazione, invito, 404, 500 e acquisto riuscito, utilizza il layout autonomo senza l'app Chrome. Poiché ogni pagina è un'importazione lenta, il codice di una schermata viene caricato solo alla prima visita; un caricamento di blocco non riuscito viene visualizzato come errore di percorso, non come app vuota.