DSH OpenPencil

DSH OpenPencil

Плагин DeepSeek Harness для OpenPencil — просматривайте, изучайте и редактируйте настоящие документы .op прямо в диалоге.
Точные превью нескольких кадров • Интерактивный холст • Управляемый редактор • Дизайн-инструменты, созданные для агентов

npm: @zseven-w/dsh-openpencil · Текущий релиз плагина: 0.1.0-rc.7 · Проверено вплоть до DSH 0.1.1-rc.2

English · 简体中文 · 繁體中文 · 日本語 · 한국어 · Français · Español · Deutsch · Português · Русский · हिन्दी · Türkçe · ไทย · Tiếng Việt · Bahasa Indonesia

npm CI Stars License Discord


DSH OpenPencil — превью нескольких кадров и редактор в боковой панели

Точные превью .op нескольких кадров с интерактивным холстом и рабочей областью управляемого редактора

## Зачем нужен DSH OpenPencil DSH OpenPencil связывает [DeepSeek Harness](https://github.com/deepseek-ai/DSH) с [OpenPencil](https://github.com/ZSeven-W/openpencil), чтобы агент управлял настоящим, редактируемым, интерактивным дизайн-холстом, а не возвращал сгенерированное изображение.
### 🖼️ Точные превью нескольких кадров Установленный headless-экспортёр OpenPencil формирует точные превью: первый верхнеуровневый кадр — как крупный PNG, пригодный для воспроизведения, плюс горизонтально прокручиваемая лента миниатюр с выбором по клику и навигацией «предыдущий/следующий» для документов с несколькими кадрами. ### 🗺️ Интерактивный холст «Открыть интерактивный холст» лениво монтирует доступный только для чтения Web SDK OpenPencil с панорамированием, масштабированием и подгонкой под размер — изучайте любую страницу, вложенный узел или неактивную страницу, не покидая диалог.
### ✏️ Управляемый редактор С параметром `editable: true` действие «редактировать» открывает управляемый редактор OpenPencil — выделение, слои, свойства, инструменты рисования, отмена/повтор и явную семантику сохранения — в изменяемой по размеру правой боковой рабочей области с опцией полноэкранного режима. ### 🤖 Дизайн-инструменты, созданные для агентов Пять инструментов прямой работы с холстом и шесть инструментов `openpencil_pipeline_*` позволяют агенту создавать, проверять, дорабатывать, публиковать, изменять и читать настоящий холст через управляемые среды OpenPencil.
### 🔐 Гранты на основе возможностей Гранты на изображения и документы — это подписанные возможности, привязанные к хешу. Метаданные браузера никогда не раскрывают произвольный путь на хосте, а подписанные возможности превью и редактора никогда не попадают в канонический результат инструмента или контекст модели. ### ⚡ Транзакционная безопасность Документ полного пайплайна остаётся приватным неопубликованным черновиком до прохождения всех нативных проверок качества и проверок DSH. Публикация не перезаписывает существующий путь, а отмена или неудачный батч не оставляют пустой целевой файл.
### 🌍 Соответствует стилю DSH Карточка инструмента и управляемый редактор следуют китайской/английской локали DSH и светлой/тёмной теме без перезагрузки сессии редактирования. ### 🎯 Один полный рабочий процесс «Требование → приватный live canvas в боковой панели → два семантических батча с точным PNG для пользователя → детерминированные нативные/DSH-гейты качества → атомарная публикация» — полный цикл внутри DSH.
## Установка в DSH DSH — отдельный пакет. Установите его один раз, если его ещё нет: ```sh npm install -g @deepseek-ai/dsh@latest ``` Затем добавьте плагин в профиль и запустите веб-приложение: ```sh dsh plugin --profile web add @zseven-w/dsh-openpencil@next dsh web ``` Для локальной разработки соберите этот checkout, свяжите его абсолютный путь с Web-профилем, а затем полностью перезапустите DSH: ```sh pnpm run build dsh plugin --profile web add link:/absolute/path/to/dsh-openpencil dsh web ``` Зависимость `link:` делает последующие пересборки видимыми прямо из этого checkout. Однако после замены зависимости профиля DSH необходимо полностью перезапустить, поскольку поставляемый Web-профиль по умолчанию не выполняет горячую перезагрузку хост-бандлов. Не хотите ставить DSH глобально? Выполните те же два шага через `pnpm dlx`: ```sh pnpm dlx --package=@deepseek-ai/dsh@latest dsh plugin --profile web add @zseven-w/dsh-openpencil@next pnpm dlx --package=@deepseek-ai/dsh@latest dsh web ``` > Плагин OpenPencil публичный и не требует npm-токена. Если сам пререлиз DSH требует аутентификации в реестре, храните эти учётные данные в пользовательском или временном npm-конфиге вне этого чекаута. Этот репозиторий намеренно не содержит учётных данных реестра. ## Дизайн-инструменты Необязательный выбор: `openpencil_style_plan` → `openpencil_style_confirm` → `openpencil_pipeline_begin` с исходным brief и `style_selection`. Каталог и точный выбор доступны без рекомендаций; провайдер по умолчанию выключен. Передача поддерживает script, но не app-agent и commerce. Обычная генерация app-agent остаётся доступной. | Инструмент | Что он делает | | --- | --- | | `openpencil_new` | Совместимый быстрый путь для простых задач: выполняет один транзакционный QuickJS-скрипт `batch_design`, публикует только при отсутствии цели и возвращает редактируемое представление. Для промышленного дизайна предпочтителен полный пайплайн. | | `openpencil_pipeline_begin` | Запускает принадлежащий сессии приватный черновик с единственным root, немедленно открывает тот же live canvas в боковой панели и оставляет целевой `.op` неопубликованным. | | `openpencil_pipeline_context` | Загружает одну ограниченную деталь guideline, style, theme или UI kit, только если её действительно нет в контракте begin; это не цикл обновления при запуске. | | `openpencil_pipeline_batch` | Выполняет не более двух прямых QuickJS-скриптов генерации. Каждая успешная транзакция лишь пытается показать пользователю точный PNG; после возврата инструмента сразу следуйте `next`. | | `openpencil_pipeline_inspect` | Предоставляет ручную диагностику только по явному запросу пользователя; обычная генерация не использует его как этап превью или просмотра изображения моделью. | | `openpencil_pipeline_finish` | Выполняет детерминированные нативные и DSH-гейты, рендерит точный PNG после финализации и атомарно публикует через `createIfAbsent`. Ровно один U-only ремонт и один последний finish разрешены только при `needs_correction`, `canContinue: true`, полном непустом `repairTargets` и `omitted: 0`; любой другой неопубликованный результат терминален. | | `openpencil_pipeline_abort` | Удаляет неопубликованный черновик, не создавая целевой файл. | | `openpencil_create` | Применяет транзакционную программу `batch_design`, чтобы сгенерировать или перестроить узлы на существующем живом холсте. | | `openpencil_edit` | Изменяет указанный узел или единственный узел, выбранный пользователем. | | `openpencil_render` | Создаёт неизменяемый снапшот `.op` с адресацией по содержимому и рендерит каждый верхнеуровневый кадр на активной странице — с опциональными `scale` и `editable`. | | `openpencil_selection` | Считывает точные узлы, выбранные на живом холсте редактора. | ## Рабочий процесс агента в дизайне Для обычной генерации используйте фиксированный короткий путь: `openpencil_pipeline_begin` → два прямых QuickJS-вызова `openpencil_pipeline_batch` → один `openpencil_pipeline_finish`. Begin создаёт единственный root и немедленно открывает приватный live canvas в боковой панели; запрошенный путь в рабочей области не существует до успешной публикации. После каждого успешного begin или батча немедленно выполняйте следующий обязательный вызов без повествования, планирования, сравнения, инспекции или посторонних инструментов. По умолчанию весь дизайн использует ровно одно изображение; каждый Hero/Product/Art/Media frame содержит ровно один основной визуал, никогда одновременно изображение и placeholder-иконку. Оба успешных батча пытаются показать пользователю точное PNG-превью. После возврата инструмента сразу следуйте `next`. Если `next` сообщает `previewUnavailable`, скрипт уже закоммичен в live canvas: не запускайте батч повторно и не вызывайте `openpencil_pipeline_inspect` или `read_image`. `openpencil_pipeline_inspect` предназначен только для диагностики, явно запрошенной пользователем. Finish выполняет нативные финализацию OpenPencil, lint, проверки контраста и макета, а также детерминированные гейты качества DSH; затем в том же здоровом вызове рендерит точный финальный PNG и атомарно публикует цель. Ремонт разрешён только если результат одновременно содержит `stage: "needs_correction"`, `canContinue: true`, полный непустой `repairTargets` с `omitted: 0`, а каждая цель — `operation: "U"`, точный непустой `nodeId` и непустой `patch`. Примените все цели вместе ровно в одном U-only батче, затем без пояснений вызовите finish ровно один последний раз. Любой другой неопубликованный результат, ошибка или `canContinue: false` терминальны: сообщите один раз и не повторяйте, не инспектируйте, не читайте image/context, не вызывайте abort и не создавайте заменяющий draft. При провале гейта или вызове `openpencil_pipeline_abort` цель не создаётся. Точный финальный PNG и live editor в published result уже авторитетны: верните результат и немедленно завершите работу. Боковая панель автоматически открывается только когда свободна, а **Редактировать холст** остаётся для явного переключения. В пределах того же работающего сервиса DSH после смены браузера или перезагрузки строго разобранную долговечную публикацию от `openpencil_new` или `openpencil_pipeline_finish` можно восстановить как точный PNG с явным действием **Редактировать холст**. Историческая карточка никогда не открывает боковую панель автоматически — пользователь должен нажать это действие. Обычный исторический `openpencil_render` остаётся только для чтения, а соединения не через loopback никогда не получают редакторский грант. Встроенный skill `openpencil-design` остаётся руководством по скриптингу и качеству, а управляемая среда не зависит от настольного бинарного файла. `openpencil_new` сохраняется как совместимый быстрый путь с одним батчем, но для генерации промышленного качества следует выбирать полный пайплайн. Используйте `openpencil_create` и `openpencil_edit` только для существующего живого холста. Их изменения остаются несохранёнными до действия «Сохранить» в редакторе. ## Ассеты веб-просмотрщика DSH обслуживает только `client.js` для клиентского плагина, поэтому ESM SDK OpenPencil, его WASM и CanvasKit подготавливаются как явные ассеты с тем же источником: ```sh pnpm run sync:viewer-assets ``` Команда синхронизации предпочитает соседний чекаут `../openpencil` (локальная разработка) и переключается на вендорный субмодуль `vendor/openpencil` (CI и свежие клоны). Переопределите его с помощью `OPENPENCIL_ROOT` или `--openpencil-root`. Полный каталог предсобранных ассетов можно выбрать с помощью `DSHPLUGIN_OPENPENCIL_VIEWER_SOURCE`. Поиск во время выполнения можно переопределить с помощью `DSHPLUGIN_OPENPENCIL_VIEWER_ASSET_DIR`. Ассеты просмотрщика загружаются лениво только после того, как пользователь откроет холст. Если они отсутствуют или невалидны, превью PNG остаётся доступным, а кнопка холста не предлагается. ## Управляемый редактор Редактируемые сессии используют управляемый веб-хост OpenPencil — ту же архитектуру, что и `op-vscode`. Плагин запускает хост только после авторизованного действия пользователя, держит токен демона в памяти, проверяет источник и происхождение iframe и закрывает процесс при завершении сессии редактирования. Поверхность редактора выбирается постепенно: нативные детали инструмента, когда хост объявляет такой шов, в противном случае — правая боковая рабочая область плагина с изменением размера и полноэкранным управлением. При запуске используется listening handshake, безопасный для медленных монтирований: проверки готовности начинаются только после того, как встроенный хост сообщит связанный адрес. Установка настольного OpenPencil не требуется. Опубликованная версия поддерживает шесть нативных целей: `darwin-arm64`, `darwin-x64`, `linux-arm64`, `linux-x64`, `win32-arm64` и `win32-x64`; пакетам Linux требуется glibc. Корневой пакет выбирает подходящий платформенный пакет по ОС и CPU через `optionalDependencies` с точными версиями (например, `@zseven-w/dsh-openpencil-darwin-arm64`). Этот пакет поставляет совместимые друг с другом `op-host-web-server`, веб-бандл редактора и CanvasKit как единый runtime. Поэтому управляемый редактор не зависит от `/Applications/OpenPencil.app`, `openpencil-desktop` в `PATH` или checkout исходного кода OpenPencil. Если DSH перезагружает или выгружает плагин, пока холст «грязный», хост сохраняет непрозрачный локальный черновик восстановления на срок до семи дней. При повторном открытии того же источника плагин спрашивает, прежде чем восстановить его на живом холсте; восстановление никогда не перезаписывает файл `.op`, пока пользователь явно не сохранит. Официальные пакеты для всех шести платформ получают bootstrap-эндпоинты совместной работы для Китая и глобального региона во время защищённой release-сборки; внедрённые значения проверяются до публикации. Локальная самостоятельная сборка без такого внедрения может переопределить bootstrap до запуска DSH через `OPENPENCIL_COLLAB_BOOTSTRAP_URL=https:///api/v1/collaboration/bootstrap`; значение должно использовать `https`, а путь должен быть строго `/api/v1/collaboration/bootstrap`. Для синхронизации холста между устройствами нативный runtime PC/DSH и мобильное приложение должны быть обновлены до одной и той же линии выпуска OpenPencil, содержащей текущее исправление очереди совместной работы. При сочетании старого мобильного приложения с новым runtime PC удалённые курсоры могут отображаться, но коммиты холста не поступать. При разработке из этого репозитория перед запуском DSH сначала соберите веб-бандл редактора, затем нативный хост, после чего подготовьте единый согласованный runtime. `pnpm run build:editor-web` запускает официально поддерживаемый OpenPencil gate для WASM-бандла. Требуются Bash, Cargo/Rust с target `wasm32-unknown-unknown`, CLI `wasm-bindgen`, `wasm-opt` из Binaryen, Node.js и `gzip`; для CanvasKit EMSDK не нужен. Веб-сборка не использует переменные сборки bootstrap совместной работы. Перед `pnpm run build:editor-runtime` задайте одновременно `OPENPENCIL_BUILD_COLLAB_BOOTSTRAP_URL_CN` и `OPENPENCIL_BUILD_COLLAB_BOOTSTRAP_URL_GLOBAL`. Они используются только нативной Cargo-сборкой, которая завершается по принципу fail closed при отсутствии любой из них. После успешного завершения обеих сборок подготовьте runtime последней командой. ```sh pnpm run build:editor-web pnpm run build:editor-runtime pnpm run stage:editor-runtime ``` Явные переопределения runtime принимаются только как полный согласованный набор: - `DSHPLUGIN_OPENPENCIL_EDITOR_BINARY` для `op-host-web-server`; - `DSHPLUGIN_OPENPENCIL_EDITOR_WEB_BUNDLE_DIR` для собранного веб-бандла редактора; - `DSHPLUGIN_OPENPENCIL_EDITOR_CANVASKIT_DIR` для ассетов CanvasKit. Указание только части набора является недопустимой конфигурацией; плагин не смешивает пользовательские пути с упакованными ассетами runtime. Сохранения используют оптимистичный хеш источника, атомарную замену и наследуемую возможность. Если источник изменился вне редактора, плагин сообщает о конфликте вместо перезаписи. ## Метаданные результата Видимый модели результат остаётся простым JSON. Только для браузера `presentationMeta.$dshOpenPencil` несёт дополнительные гранты для: - `image`: путь PNG, URL превью/скачивания и реальные ширина/высота; - `frames`: каждый точно отрендеренный верхнеуровневый кадр в порядке активной страницы, включая его id/имя/индекс узла и подписанные URL PNG; - `document`: путь исходного действия плюс неизменяемый URL снапшота, байты и SHA-256; - `viewer`: версионированные URL SDK/WASM/CanvasKit, когда подключён маршрут ассетов; - `editor`: ограниченные возможности запуска/обновления, когда авторизовано `editable: true`. Результат также фиксирует `renderer`, `rendererBinary`, `fidelity` и любые предупреждения. Существующие сообщения схемы v1 только с PNG остаются отображаемыми. DSH `0.1.1-rc.2` не сохраняет метаданные презентации браузера для инструментов, вложенных под PTC/Code Mode. Плагин восстанавливает эту проекцию UI-only через конечную точку same-origin, session-bound: браузер отправляет только session id, call id и неизменяемый SHA-256 документа, а хост получает авторитетный результат из долговечного журнала сессий DSH и использует кратковременный внутрипроцессный маркер только для авторизации недавнего живого редактирования. Подписанные возможности превью и редактора никогда не попадают в канонический результат инструмента или контекст модели. Долговечная история обычного `openpencil_render` остаётся только для чтения. Строго разобранная долговечная публикация от `openpencil_new` или `openpencil_pipeline_finish` может получить редакторский грант только через loopback и после явного клика пользователя; автоматическое открытие боковой панели предназначено лишь для недавних, доверенных живых результатов. Для ограниченного воспроизведения восстановление вложенных метаданных принимает до 128 верхнеуровневых кадров; более крупные результаты Code Mode остаются доступными через их канонический JSON-фолбэк. ## Текущие ограничения - Последующие правки существующего холста требуют уже открытого управляемого редактора. Изменения остаются несохранёнными, пока пользователь не вызовет его действие «Сохранить». - Лёгкий холст Web SDK доступен только для чтения; полноценное редактирование использует отдельную поверхность управляемого редактора. На DSH `0.1.1-rc.2` плагин использует изменяемую по размеру правую рабочую область с опцией полноэкранного режима. - Точная галерея охватывает верхнеуровневые кадры активной страницы; интерактивный холст остаётся способом изучать неактивные страницы и вложенные узлы. - Для кэшей рендеринга и снапшотов всё ещё нужна политика хранения на уровне продукта. ## Структура проекта ```text dsh-openpencil/ ├── src/ Plugin sources (TypeScript) │ ├── index.ts Host plugin entry — Cordis service, tools, assets │ ├── tool.ts / design-tools.ts / new-tool.ts Host-side design tools │ ├── renderer.ts Exact OpenPencil renderer + Jian fallback │ ├── editor-host.ts / editor-recovery.ts Managed editor lifecycle + drafts │ ├── viewer-assets.ts Web SDK / WASM / CanvasKit asset staging │ ├── mcp-client.ts OpenPencil MCP connection │ └── client/ Browser client — React workbench, gallery, selection dock ├── lib/ Compiled output (published to npm) ├── scripts/ Build helpers — viewer asset sync, client build, host tests ├── tests/ Node test suites (client, host API, MCP, viewer assets) ├── docs/images/ Documentation screenshots ├── vendor/openpencil/ OpenPencil checkout (git submodule — viewer asset source) ├── cordis.patch.yml DSH bundle patch that mounts the plugin ├── tsconfig.json Host / Node TypeScript config └── tsconfig.client.json Browser client TypeScript config ``` ## Сборка и проверка ```sh pnpm run sync:viewer-assets pnpm run build pnpm run test:viewer-assets pnpm run test:client pnpm run test:host /absolute/path/to/design.op 375 1091 ``` Для сборки требуется Node 24.11 или новее и pnpm. Пакеты хоста и клиента DSH — это peer-зависимости, поставляемые целевым профилем DSH. Инструменты сборки разрешаются из локальных dev-зависимостей, активного привязанного чекаута DSH или установленного бандла исходников DSH; `DSH_SOURCE_ROOT` может явно выбрать чекаут исходников. Lockfile фиксирует автономные публичные инструменты сборки, когда такое окружение подготавливается отдельно. Для приватного пререлиза DSH храните выданные npm-учётные данные вне этого репозитория (например, в пользовательском или временном `.npmrc`) и запускайте запрошенную версию напрямую: ```sh pnpm dlx --package=@deepseek-ai/dsh@latest dsh web ``` Никогда не коммитьте `.npmrc`, `NPM_TOKEN` или скопированные учётные данные реестра. Этот репозиторий по умолчанию игнорирует локальную npm-конфигурацию. `test:host` выполняет реальный точный рендер, проверяет геометрию IHDR PNG и SHA-256, проверяет по HTTP неизменяемые возможности изображений и документов и убеждается, что ассеты просмотрщика можно предоставлять. Ожидаемые размеры зависят от фикстуры. ## Экосистема DSH OpenPencil — это плагин DeepSeek Harness для **[OpenPencil](https://github.com/ZSeven-W/openpencil)** — первого в мире открытого ИИ-нативного инструмента векторного дизайна — и часть семейства **[ZSeven-W](https://github.com/ZSeven-W)** чистых Rust-инструментов с ИИ-нативностью. | Проект | Что это | | ------- | ---------- | | **[OpenPencil](https://github.com/ZSeven-W/openpencil)** | Инструмент дизайна, которым управляет этот плагин: генерация от промпта к холсту, параллельные команды агентов, файлы `.op` как дизайн-код и встроенный MCP-сервер. Точные превью, интерактивный холст и управляемый редактор здесь работают на самом OpenPencil. | | **[agent-rs](https://github.com/ZSeven-W/agent-rs)** | Чистый Rust-асинхронный рантайм для запуска LLM-агентов: мульти-провайдерный, с инструментами на всём пути, структурированными разрешениями, настоящим MCP и нулём `unsafe`. Обеспечивает встроенный агентный рантайм OpenPencil. | | **[jian](https://github.com/ZSeven-W/jian)** | Чистый Rust UI-фреймворк на GPU-Skia: виджеты, раскладка, события и горячая перезагрузка в одном стеке. UI-фреймворк OpenPencil и источник фолбэк-рендерера этого плагина. | | **[Zode](https://github.com/ZSeven-W/zode)** | Открытый ИИ-нативный ассистент кодинга для вашего терминала: читает ваш код, выполняет команды и управляет OpenPencil через MCP. | | **[noema](https://github.com/ZSeven-W/noema)** | Локальная, не векторная система памяти для агентов кодинга: долговечная память в виде обозримых файлов, работает в разных рантаймах. | | **[openpencil-skill](https://github.com/ZSeven-W/openpencil-skill)** | Плагин-скилл для LLM, обучающий ИИ-агентов проектировать с помощью `op`, — компаньон этого DSH-плагина. | Другие плагины DSH: - [DSH Android](https://github.com/ZSeven-W/dsh-android) — живой эмулятор Android или устройство по USB прямо в диалоге, полностью под управлением adb - [DSH Crew](https://github.com/ZSeven-W/dsh-crew) — делегировать задачи агентам DSH из Claude Code / Codex - [DSH iOS](https://github.com/ZSeven-W/dsh-ios) — живой симулятор iOS — и iPhone по USB — прямо в диалоге - [DSH Noema](https://github.com/ZSeven-W/dsh-noema) — долговременная память для DSH ## Участие в разработке Вклад приветствуется! Форкните и клонируйте репозиторий, создайте ветку, запустите `pnpm run build` и тестовые наборы, коммитьте с [Conventional Commits](https://www.conventionalcommits.org/) и открывайте PR в `main`. ## Сообщество Discord Присоединяйтесь к нашему Discord — Задавайте вопросы, делитесь дизайнами, предлагайте фичи. **Признанное сообщество: [LINUX DO](https://linux.do/)** ## Лицензия [MIT](./LICENSE) — Copyright (c) 2026 ZSeven-W Сторонние компоненты перечислены в [THIRD_PARTY_NOTICES.md](./THIRD_PARTY_NOTICES.md).