Документация
Настольный пользовательский интерфейс
Рабочие пространства SolidJS, локальный клиент API и оболочка Tauri, имеющая встроенную интеграцию.
Автоматически переведено с английского. Смотреть оригинал на английском
Архитектура приложения
Настольное приложение сочетает в себе веб-просмотр SolidJS, Vite, Three.js и оболочку Tauri v2 Rust. Веб-просмотру принадлежат экраны и состояние взаимодействия. Sidecar Bun владеет обработчиками API, доступом к базе данных, сеансами искусственного интеллекта и сервисами проекта. Процессу Rust принадлежат окно, меню, панель задач, диалоговые окна операционной системы, доступ к цепочке ключей, обновления и жизненный цикл вспомогательной программы.
apps/desktop/src/main.tsx монтирует приложение. app/App.tsx устанавливает соединение API и предоставляет общее состояние; app/routes.tsx сопоставляет URL-адреса с модулями ленивых страниц. Функциональные экраны живут в features/. Наличие маршрута не определяет доступность его внешних сервисов: биллинг требует настройки Stripe, а AI — настроенного провайдера.
Запуск и восстановление соединения
- Оболочка запускает связанную вспомогательную программу с сгенерированным токеном запуска, данными приложения и каталогами миграции.
- Sidecar привязывает эфемерный порт к
127.0.0.1, ожидает ответа от своего маршрута работоспособности и записывает JSONreadyсобытие, содержащее порт. - Веб-просмотр вызывает
get_sidecar_endpointи создает клиент API и среду выполнения управляемого эффекта. - Успешный запрос работоспособности создает состояние приложения и монтирует маршрутизатор и оболочку.
Веб-просмотр предоставляет 150 секунд для восстановления соединения с тайм-аутом 30 секунды на попытку и паузой повторной попытки в 750 миллисекунды. Неудачные попытки удаляют кэшированную конечную точку, чтобы перезапущенная сайдкар могла предоставить новый порт. Супервизор Rust ожидает 60 секунд для каждого готового рукопожатия и разрешает один автоматический перезапуск. Повторная попытка становится доступной после истечения срока действия бюджета подключения к веб-просмотру.
Предварительный просмотр в браузере использует API в памяти.
За пределами Таури браузер без VITE_SIDECAR_URL использует src/testing/fake-api.ts. Данные предварительного просмотра являются локальными для текущей страницы; неподдерживаемые коллекции возвращают HTTP 501. Чтобы подключить браузер к реальной сайдкаре, укажите оба VITE_SIDECAR_URL и VITE_SIDECAR_TOKEN при запуске Вите.
Экранные маршруты
| Область | Маршруты и модули |
|---|---|
| Проекты | /projects, /projects/create, /projects/:id, и /projects/:id/history; экраны в features/projects/screens. |
| Проектирование и производство | /cad монтируется CadPage; /cam монтируется CamPage. Сохраненные чертежи и траектории имеют отдельные маршруты деталей. |
| Ресурсы | /library, /materials, /tools, /machine, а их страницы сведений используют функциональные модули библиотеки. Компоненты имеют список и подробные маршруты. |
| Ассистент | /ai и закрепленная панель помощника совместно использует состояние функции искусственного интеллекта. Действия ИИ переключают панель. |
| Настройки | /settings, /settings/companion, настройки MCP и настройки подписки. |
| Аккаунт и сотрудничество | Маршруты аутентификации, профиля, организации, приглашения, чата, торговой площадки, плагина, затрат, аналитики и администрирования для каждого функционального модуля загрузки. |
Использовать app/routes.tsx для точных имен параметров и pages/ чтобы найти экран, смонтированный по URL-адресу. Адаптеры маршрутов намеренно малы; читайте экран и его вызовы API при диагностике пустого представления или неудачного действия.
Исходная организация
app/: запуск, маршрутизатор, глобальный API-клиент, встроенная интеграция, оболочка и сочетания клавиш.pages/: адаптеры маршрутов, импортирующие или реэкспортирующие экраны.features/: области продуктов с экранами, компонентами, хуками, состоянием и помощниками, специфичными для предметной области.shared/: элементы управления многократного использования, компоненты оболочки, состояние приложения, кэширование запросов и история команд.viewport/: рисование на холсте, привязка, жесты инструментов, рендеринг Three.js, создание сетки и воспроизведение.i18n/,styles/, иtesting/: переводы, глобальные стили и тестовые приспособления.
Рабочий стол зависит от @cadcamfun/api для контракта HTTP и далее @cadcamfun/core для геометрии и операций CAM. Сохранение базы данных остается позади API-интерфейса. История локального редактора отличается от сохраненных версий чертежей или траекторий, а также от контроля версий проекта.
Родная оболочка
По умолчанию производственное окно составляет 1440 × 900 с минимумом 960 × 600. Таури готовит интерфейс от apps/desktop/dist, целевая сайдкар из src-tauri/binariesи генерировали миграции в качестве ресурсов. Он регистрируется .cadcam, .nc, и .gcode файловые ассоциации. При открытии поддерживаемого файла или запуске второго экземпляра пути к файлам перенаправляются в существующее окно.
src-tauri/src/sidecar.rs контролирует дочерний процесс. При закрытии приложения пишет {"event":"shutdown"} выводит строку на стандартный ввод дочернего процесса и некоторое время ждет, прежде чем получить ее; ребенок также наблюдает закрытие стандартного ввода. Токен запуска состоит из 32 случайных байтов, закодированных в шестнадцатеричном виде как 64 символов, а дополнительные строки журнала, которые могут содержать учетные данные, отредактированы. Журналы отделены от стандартного вывода, который передает подтверждение готовности/ошибки. Доступ к родным секретам осуществляется через src-tauri/src/secrets.rs с помощью связки ключей операционной системы.
В macOS оболочка регистрирует плагин Liquid Glass. Веб-просмотр следует настройке стекла и возвращается обратно, когда эффект недоступен. Конфигурация App Store отключает опцию частного API; обычная конфигурация позволяет это сделать. Это отдельные конфигурации сборки.
Границы безопасности и устойчивости
Политика производственного контента разрешает локальные активы, соединения API обратной связи, изображения данных/BLOB-объектов и оценку WebAssembly. Он не разрешает произвольное удаленное выполнение сценариев. Собственные разрешения ограничены src-tauri/capabilities; политика разработки также разрешает Vite и его веб-сокет.
open_path канонизирует пути, ограничивает их разрешенными каталогами пользователей/приложений и отклоняет исполняемые расширения, такие как .exe, .app, .sh, .bat, .msi, и .jar. .. сегменты и символические ссылки не могут выйти из разрешенных папок, поскольку обе стороны канонизированы. Для выбора и сохранения файлов используются собственные диалоговые окна и проверка. Токен запуска предоставляет доступ к API локального приложения; рассматривайте его отдельно от сопутствующего токена или токена моста AI в рамках проекта.
Настройки пользовательского интерфейса, состояние запроса API, команды редактора, сохраненные версии проектов и собственные секреты имеют разных владельцев. Диагностируйте каждый из них с помощью его фактического сервиса, а не предполагайте, что все состояние приложения хранится в SQLite.
Интеграция функций
Функциональные модули CAD и CAM составляют повторно используемые компоненты видового экрана со своими собственными панелями, хранилищами и потоками сохранения. Панель помощника получает информацию о контексте проекта и редактора и передает события инструмента через состояние функции искусственного интеллекта. Экраны ресурсов используют клиент API вместо прямого доступа к базе данных.
Для изменения пользовательского интерфейса следуйте адаптеру маршрута к экрану его функций, затем проверьте хранилище функций или перехватчик, который отправляет запрос. Повторно используйте общие компоненты только в том случае, если их существующий контракт соответствует взаимодействию. Сохраняйте чистую геометрию в основном пакете и собственное поведение операционной системы в оболочке Rust.
Загрузка маршрута и ошибки
Каждый маршрут использует границу отложенного импорта Solid. Таблица включает в себя страницу со всеми данными, /500, /offlineи законные маршруты. Прямая навигация в браузере должна осуществляться через сервер разработки Vite или упакованное веб-представление, чтобы клиентский маршрутизатор мог разрешить URL-адрес.
API предварительного просмотра реализует ограниченный набор коллекций и может намеренно включать ошибки запросов в тесты. Успешный предварительный рендеринг демонстрирует поведение пользовательского интерфейса по отношению к этим приборам; проверьте постоянство, разрешения, потоковую передачу и внешнюю интеграцию с живой сайдкаром.
Собственный командный интерфейс
| Команда | Цель |
|---|---|
get_sidecar_endpoint | Дождитесь контролируемого сайдкара, верните его базовый URL-адрес и токен запуска. Ожидание охватывает один перезапуск: два тайм-аута готовности по 60 секунды плюс 5 секунд (125 секунд). |
get_logs_dir, open_path | Разрешите каталог журнала приложения как строку и откройте существующий абсолютный путь с помощью средства открытия операционной системы. Пути должны разрешаться в папке «Данные приложения», «Журнал», «Документы», «Загрузки» или «Рабочий стол». |
secret_get, secret_set, secret_delete | Доступ к собственным записям связки ключей в разделе com.cadcamfun.app услуга. Ключи — это 1–128 байты букв ASCII, цифр и символов. . _ - : (например ai.anthropic.apiKey); secret_get возвращает null за отсутствующую запись. |
pick_file, save_file | pick_file({ filters: [{ name, extensions }] }) возвращает выбранный путь или null при отмене. save_file({ defaultName, contents }) записывает текст UTF-8 по выбранному пути и возвращает его, или null при отмене; каталоги и исполняемые расширения отклоняются. |
set_recent_projects | Обновите меню последних проектов в трее. |
check_for_updates, install_update | Запросите проверку обновления или установите ожидающее обновление. install_update принимает необязательное unsavedWork флаг (по умолчанию false), поэтому установка не прерывает работу открытого редактора. |
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.
Родные события
Оболочка излучает sidecar-status для изменений жизненного цикла, open-file с поддерживаемыми путями, menu для выбора меню и update://status для прогресса обновления. Выбор последних проектов в лотке представлен значками tray.recent.<projectId> идентификаторы меню. Модули меню и лотка оболочки определяют свои полные наборы идентификаторов.
Прослушиватели должны быть ограничены жизненным циклом их компонентов или приложений и удаляться при очистке. Веб-просмотр должен повторно разрешить конечную точку после перезапуска вспомогательной машины, а не продолжать использовать предыдущий порт.
Разработка и проверка
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 Первая команда запускает предварительный просмотр в браузере. desktop:dev компилирует реальную сайдкар и выполняет миграцию перед запуском Tauri. Пакет настольных компьютеров tauri:dev вместо этого скрипт создает заглушку двоичного файла только в том случае, если двоичный файл не существует; используйте его для изолированной работы оболочки и проверьте, какой двоичный файл присутствует, прежде чем интерпретировать его ответы API.
Рабочий стол build скрипт запускается vite build только; он не компилирует сайдкар и не упаковывает пакет Tauri. Использовать bun scripts/build.ts полный конвейер выпуска (см. Выпускать).
Предпочтения и настройки
В хранилище общих настроек сохраняется проверенная запись под cadcamfun.settings в локальном хранилище веб-просмотра. Отсутствующие, недействительные или нечитаемые поля восстанавливаются независимо. Заполненная или заблокированная область хранения не прекращает редактирование, но изменения предпочтений могут не сохраниться. Настройки предварительного просмотра браузера относятся к источнику браузера и отличаются от собственных настроек веб-просмотра.
| Параметр | Принятые значения/по умолчанию | Операционный эффект |
|---|---|---|
| Тема | light, dark, system; система по умолчанию | Системный режим соответствует изменениям цветовой схемы операционной системы. |
| Единицы отображения | mm или in; по умолчанию мм | Управляет презентацией; Координаты основного чертежа остаются в миллиметрах. |
| десятичные дроби | Целое число 0–6; по умолчанию 3 | Точность представления длины. |
| Сообщение по умолчанию | grbl, linuxcnc, smoothwb, gcode, fanuc; грбл по умолчанию | Выбранная выходная грамматика является предпочтением, а не доказательством того, что машина настроена или проверена. |
| Допуск рисунка | Подтвержденный допуск ядра; по умолчанию 0.01 мм | Общие предпочтения точности, используемые потребителями чертежей/траекторий. |
| Состояние привязки | логическое значение; по умолчанию включено | Общие предпочтения статуса. Отдельные редакторы владеют своим поведением при съемке; автономный Editor2D в настоящее время включает внутреннюю привязку к сетке. |
| Стекло | логическое значение; по умолчанию включено | Запрашивает материал окна macOS, если его поддерживает собственный хост. |
На экране настроек есть вкладки «Профиль», «Учетная запись», «Безопасность», «Подписка», «Уведомления», «ИИ», «Устройства» и «Язык». На вкладке «Устройства» встроена панель сопутствующего шлюза. Языковые настройки включают переключатель стекла. Общее хранилище локалей в настоящее время проверяет локаль по умолчанию; не делайте вывод о дополнительном переводе из списка отображаемых меток.
Сохраните и снова откройте программу CAM.
- Создайте или загрузите код УП в CAM и откройте диалоговое окно сохранения/экспорта из существующей точки входа.
- Для экспорта файла выберите G-код или переносимый формат траектории. G-код загружает текущий текст ЧПУ; выбор траектории инструмента записывает структурированный
.cam.jsonснимок. - Для сохранения приложения выберите существующий проект, новый проект или обновите уже сохраненную программу. Укажите название программы и обязательные поля назначения.
- При обновлении поток сохранения записывает предыдущую полную программу как версию траектории перед заменой текущих данных.
- Откройте сохраненный элемент по подробному маршруту его траектории, чтобы проверить или восстановить версии.
Сводка сохранения включает в себя линии ЧПУ, байты, перемещения, идентификаторы инструментов, имена операций, запас, единицы измерения, смещение детали и проверочный идентификатор, если эти свидетельства принадлежат текущему ЧПУ. Измененный текст NC может сделать ранее вычисленные доказательства устаревшими. Прежде чем полагаться на сводку, просмотрите текущую связь между кодом и доказательствами.
Если создание нового проекта удалось, но последующий этап сохранения завершился неудачно, модальное окно сохраняет созданное место назначения для повторных попыток и включает его идентификатор в ошибку. Повторная попытка в этом модальном окне позволяет избежать повторного создания того же проекта. Не думайте, что поток сохранения представляет собой одну атомарную транзакцию между ресурсами.
Экспорт файлов и сохранение проекта — это разные операции.
Загруженный файл G-кода не создает строку траектории проекта. Портативный снимок содержит более богатое состояние, чем обычный NC. Проверьте сохраненную программу, повторно открыв ее из приложения, и проверьте экспорт, проверив загруженный файл.
Диагностика клавиатуры и неисправностей
Cmd/Ctrl+K открывает палитру команд и Cmd/Ctrl+J переключает панель помощника. Ярлыки оболочки игнорируются, когда фокус находится на элементе ввода, текстовой области, выборе или редактируемом содержимом элементе. Холсты редактора имеют собственную обработку с помощью клавиатуры. Некоторые обратные вызовы команд оболочки, включая «Сохранить/Экспорт» в общей таблице ярлыков, являются заполнителями; используйте фактические элементы управления сохранением/экспортом функции вместо того, чтобы предполагать, что каждый указанный ускоритель выполняет операцию с документом.
| Наблюдаемое поведение | Проверять |
|---|---|
| Запуск ожидает, затем появляется сообщение «Повторить». | Сопутствующие ошибки/готовые выходные данные, целевой двоичный файл, ресурс миграции и журналы приложений. Кэшированный порт может принадлежать предыдущему процессу. |
| Экран отображается, но запрашивает возврат 501 | Режим настройки браузера. Запустите настоящую сайдкар и передайте обе переменные конечной точки Vite. |
| Данные рабочего стола отличаются от ручного скрипта | Каталог данных и токен каждого процесса; само по себе имя файла не идентифицирует базу данных. |
| Собственная команда недоступна | Вызов регистрации, разрешения возможностей, поддержка операционной системы и запуск кода внутри Tauri. |
| Настройки сбрасываются после перезапуска | Доступность и проверка хранилища. Недопустимые сохраненные поля возвращаются к значениям по умолчанию. |
| Сохраненные данные программы отличаются от данных NC. | Был ли NC отредактирован после генерации. Пересчитайте соответствующую проверку для фактического текста/программы. |
Якоря реализации: shared/state/settings.ts, app/shortcuts.ts, features/settings/screens/settings.tsx, и features/cam/components/SaveCamModal.tsx.
Собственные полезные данные событий
| Событие | Полезная нагрузка | Примечания |
|---|---|---|
sidecar-status | { state: "starting" }, { state: "ready", port }, { state: "restarting" }, { state: "failed", message } | После restarting, вызов get_sidecar_endpoint снова; порт меняется. |
update://status | status: checking, upToDate (version), available (version, notes, date, critical), downloading (downloaded, total), ready (version), failed (message); плюс dismissible | Критическое обновление и ожидающий перезапуск не могут быть отклонены. Неудачная проверка никогда не отображается как ошибка блокировки. |
menu | Идентификатор пункта меню, например file.new, file.open, file.save, view.devtools, help.documentation | Использование предметов лотка tray.quit и tray.recent.<projectId>. |
open-file | Пути .cadcam, .nc, или .gcode файлы | Отправляется, когда ОС открывает файл с приложением или запускается второй экземпляр. |
install_update может быть отказано с указанием причины: unsavedWork («в редакторе есть несохраненная работа; примените обновление, как только оно будет сохранено»), noneAvailable (ничего не ожидается или уже установлено) или failed (загрузка или проверка подписи не удались). Он устанавливает только то обновление, которое было объявлено при последней проверке.
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 возвращает { baseUrl, token } (сериал в CamelCase от SidecarEndpoint). Ошибки каждой команды поступают как отклоненное значение invoke, в форме { kind, message }.
Сочетания клавиш
| Ярлык | Действие | Группа |
|---|---|---|
Cmd/Ctrl+K | Откройте палитру команд | навигация |
Cmd/Ctrl+Shift+P | Новый проект | навигация |
Cmd/Ctrl+Z / Cmd/Ctrl+Shift+Z | Отменить / повторить | редактировать |
Cmd/Ctrl+S, Cmd/Ctrl+Shift+E | Сохранение, экспорт (заполнители оболочки; используйте собственные элементы управления функцией) | редактировать |
Cmd/Ctrl+0 | Масштабировать по размеру | вид |
Cmd/Ctrl+= / Cmd/Ctrl+- | Увеличение/уменьшение масштаба | вид |
Cmd/Ctrl+J | Переключить панель помощника | ай |
Cmd применяется на macOS и Ctrl в другом месте. Идентификатор каждого ярлыка также является его суффиксом ключа перевода (например, settings.shortcut.palette), и экран настроек отображает эту же таблицу, поэтому документация и приложение не могут расходиться.
Маршрут каждого экрана
Маршрутизатор в apps/desktop/src/app/routes.tsx объявляет 68 маршрутов, каждый из которых лениво загружается из apps/desktop/src/pages/ (динамические сегменты _id_.tsx файлы). Сгруппировано по первому сегменту:
| Область | Маршруты |
|---|---|
* | * |
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 |
* отображает страницу 404 и /500 страница ошибки. /offline визуализирует автономный экран; как и страницы аутентификации, приглашения, 404, 500 и успешной покупки, он использует автономный макет без Chrome приложения. Поскольку каждая страница представляет собой ленивый импорт, код экрана загружается только при первом посещении; неудачная загрузка фрагмента отображается как ошибка маршрута, а не как пустое приложение.