Десктопное приложение
Как десктопное приложение Cusp запускает демон, хранит ключи в системной связке ключей, обрабатывает диплинки cusp:// и встраивается в систему.
Десктопное приложение — нативная оболочка на Tauri 2. Она показывает интерфейс рабочей области Cusp в системном webview (WKWebView в macOS, WebView2 в Windows, WebKitGTK в Linux) и следит за средой выполнения агента. Сама оболочка небольшая: она добавляет только то, чего не умеет браузер, — запуск демона, связку ключей, строку меню и значок в трее, диплинки, глобальное сочетание клавиш и уведомления.
Десктопное приложение — предварительная версия. Нативная оболочка, контроль демона, связка ключей и диплинки, описанные здесь, уже готовы; интерфейс рабочей области ещё развивается.
Демон
При запуске Cusp стартует cusp-daemon как дочерний процесс и ждёт сообщения о готовности.
- Демон (daemon) привязывается к
127.0.0.1на случайном порту и генерирует новый bearer-токен. Ни то, ни другое никогда не записывается на диск или в журналы. - Демон печатает одну строку о готовности с портом и токеном, и оболочка передаёт их интерфейсу. Каждый запрос интерфейса содержит этот токен.
- Оболочка проверяет состояние демона каждые 10 секунд. После трёх неудачных проверок подряд она перезапускает демон.
- Если демон падает, он перезапускается с экспоненциальной задержкой — от 0,5 с до 30 с. После 8 неудачных запусков подряд Cusp прекращает попытки и показывает ошибку с кнопкой Перезапустить. Если демон проработал минуту, счётчик сбрасывается.
- При каждом перезапуске выдаются новые порт и токен. Интерфейс переподключается сам, и сессии продолжаются с последнего полученного события.
- При выходе оболочка просит демон остановиться и, если он не остановился за 3 секунды, завершает его принудительно. Если падает сама оболочка, демон замечает, что родительского процесса больше нет, и завершается.
Данные демона хранятся в папке данных приложения: в macOS это ~/Library/Application Support/run.cusp.desktop/daemon.
CLI вместе с приложением
В режиме по умолчанию CLI сначала ищет работающий демон и только потом запускает свой, поэтому cusp в терминале может работать с теми же сессиями, что и приложение, если у них общая папка данных. Чтобы подключиться к конкретному демону, передайте --daemon-url и --daemon-token. См. CLI.
Ключи и связка ключей
API-ключи, которые вы вставляете в Cusp, хранятся в системном хранилище учётных данных под именем службы run.cusp.desktop:
| Платформа | Хранилище |
|---|---|
| macOS | Связка ключей (Keychain) |
| Windows | Диспетчер учётных данных |
| Linux | Secret Service (GNOME Keyring, KWallet) |
База данных демона хранит только ссылку на каждый ключ, но не сам ключ. Значения ключей никогда не попадают в журналы и сообщения об ошибках. Чтобы удалить ключ, удалите провайдера в настройках Cusp или удалите запись в системном диспетчере учётных данных.
Диплинки
Cusp регистрирует схему URL cusp://.
| Ссылка | Открывает |
|---|---|
cusp://session/<sessionId> | Сессию, выводя окно на передний план |
cusp://auth/callback?code=…&state=… | Завершает вход (используется облачным входом, скоро) |
Ссылки, пришедшие до готовности окна, например когда ссылка сама запускает Cusp, придерживаются и доставляются после загрузки интерфейса. Неизвестные ссылки передаются приложению, и оно игнорирует то, чего не понимает.
С помощью ссылок на сессии можно перейти к сессии прямо из уведомления, сообщения в чате или скрипта:
open "cusp://session/ses_01JCQ8Z4X9T5V2M3N7K1P6R0WA" # macOS
xdg-open "cusp://session/ses_01JCQ8Z4X9T5V2M3N7K1P6R0WA" # LinuxДействия меню
В macOS строка меню Cusp содержит эти действия. На всех платформах те же действия доступны из палитры команд.
| Действие | Пункт меню | Сочетание клавиш |
|---|---|---|
session.new | Новая сессия | ⌘N |
workspace.open | Открыть папку… | ⌘O |
settings.open | Настройки… | ⌘, |
update.check | Проверить обновления… | — |
edit.find | Найти… | ⌘F |
palette.open | Палитра команд… | ⌘K |
sidebar.toggle | Боковая панель | ⌘B |
terminal.toggle | Терминал | ⌃` |
help.shortcuts | Сочетания клавиш | ⌘/ |
help.docs | Документация Cusp | — |
help.report-issue | Сообщить о проблеме… | — |
Остальное описано в разделе Горячие клавиши.
Интеграция с системой
- Трей. Значок в трее предлагает пункты «Показать Cusp», «Новая сессия» и «Завершить Cusp».
- Глобальное сочетание клавиш. ⌘⇧Space (Ctrl+Shift+Space в Windows и Linux) показывает или скрывает Cusp из любого приложения.
- Уведомления. Когда сессии нужен ваш ответ или она завершается, а окно не в фокусе, Cusp отправляет системное уведомление. В первый раз он запрашивает разрешение.
- Запуск при входе в систему. По умолчанию выключен. Если включить, Cusp запускается скрытым.
- Открытие в редакторе. Пути к файлам в переписке открываются в вашем редакторе через его схему URL (VS Code, Zed и другие) или в приложении по умолчанию. Сам Cusp никогда не запускает процессы редактора.
- Перетаскивание. Перетащите файлы на окно, чтобы прикрепить их.
- Состояние окна. Размер и положение запоминаются между запусками. Минимальный размер окна — 760 × 520.
- Потоковая передача в фоне. Пока окно скрыто, сессии продолжают получать данные потоком.
Windows и различия платформ
| macOS | Windows | Linux | |
|---|---|---|---|
| Заголовок окна | Встроенные кнопки-«светофоры» над полупрозрачной боковой панелью | Нативный заголовок с эффектом Mica | Нативное оформление |
| Строка меню | Да | Нет; сочетания клавиш обрабатывает приложение | Нет; сочетания клавиш обрабатывает приложение |
| Закрытие окна | Скрывает Cusp | Завершает работу | Завершает работу |
Безопасность
- Никакого удалённого содержимого. Приложение загружает только встроенный интерфейс. Оно никогда не открывает веб-страницы в собственном окне.
- Строгая политика безопасности содержимого (CSP). Интерфейс может подключаться только к самому себе и к демону на loopback-адресе.
- Изолированный IPC. Каждое сообщение от интерфейса к нативной оболочке проходит через слой изоляции, который пропускает только команды, объявленные приложением, и для каждой команды нужно явное разрешение.
- Демон на loopback с токеном. Другие программы на вашем компьютере не могут использовать демон без токена, который выдаётся при каждом запуске, а запросы из браузера демон принимает только с собственного источника (origin) приложения.
См. Безопасность и конфиденциальность.
Обновления
Cusp проверяет обновления, когда вы выбираете Проверить обновления…. Обновления подписаны, и перед установкой приложение сверяет подпись с открытым ключом, встроенным в него при сборке.