dsh-draft-sessions
Đã xác minhdsh-draft-sessions · v0.1.2 · MIT · Giao diện web
Persistent unsent draft sessions for DeepSeek Harness
Cài đặt
dsh plugin add dsh-draft-sessions Xác nhận layer đã áp bằng dsh --profile default --dump-config — xem hướng dẫn cài plugin.
Mã nguồn
Thẻ
Tác giả
Readme
dsh-draft-sessions
Постоянные неотправленные будущие диалоги для DeepSeek Harness.
Цель плагина — дать привычный по Cursor UX: можно подготовить несколько независимых задач, уйти из них без отправки и позже продолжить каждую с сохранённым текстом.
[!IMPORTANT] Сейчас это ранняя alpha-версия. Durable lifecycle черновика, composer bridge и взаимодействия в sidebar уже реализованы. Release-проверки после рестартов, в браузерах, на разных ОС и поддерживаемых версиях DSH ещё в работе.
English · Спецификация · Архитектура · План
Как это выглядит
С @michengai/dsh-automation
Automation предоставляет опциональный host для совместных вкладок. Когда плагин установлен и активен, Draft Sessions обнаруживает __dshNativeTabs@1 и добавляет Drafts между Tasks и Scheduled. Жёсткой зависимости от Automation и требований к порядку загрузки нет.

На штатном DeepSeek Harness
Без Automation или другого совместимого tab host штатный browser workspaces и sessions остаётся без изменений. Draft Sessions добавляет кнопку в footer; по нажатию тот же список черновиков открывается в popover.

Меню строки работает одинаково в обоих режимах и отображается поверх sidebar без дополнительного скролла:
Что уже реализовано
- Host-backed JSON-хранилище в
$DSH_HOME/storages/dsh-draft-sessions/drafts.json. - Строгие Remote-методы
draftSessions.list/create/update/delete/rebind. - Независимый порядок в workspace и настраиваемый лимит.
- Optimistic revision: устаревшая запись из второго браузера не затирает свежую.
- Атомарная запись файла и строгая проверка данных при загрузке.
- Создание отдельной blank Session с сохранением id только после успеха.
- Обнаружение исчезнувшей Session и recovery через замену без потери текста.
- Финализация только после принятого Send и подтверждённого
blank: false. - Сохранение draft при отклонённом Send и blank slash-командах.
- Точное восстановление текста через официальный per-session InputHub.
- Debounced optimistic autosave с обязательным flush перед переключением.
- Создание через
+в секции Drafts илиCtrl/Cmd + Shift + N; оба действия сначала сохраняют активный draft, затем открывают отдельный новый. - Отдельная вкладка
Drafts, когда активный sidebar host предоставляет протокол__dshNativeTabs@1. - Штатная кнопка и popover через
sidebar.footer.action, когда протокола вкладок нет. - Вынесенные поверх панелей row-меню, inline rename, duplicate, подтверждаемое удаление, клавиатурная навигация и ограниченный drag reorder.
- Безопасное удаление активного draft с финальным autosave flush и восстановлением после отказа.
- Опциональная фильтрация backing shell через протокол вкладок без изменения обычных Sessions.
- Плагин не регистрируется в single-slot
sidebar.workspaces; штатный browser, Archive Manager и другие владельцы сохраняют полный контроль. - Unit- и DOM-тесты persistence, concurrency, lifecycle, composer и sidebar.
Текущий код не отправляет prompt, не изменяет историю обычных Sessions и не удаляет blank Sessions.
Требования
- Node.js
^22.19.0или>=24.0.0 - pnpm 11
- DeepSeek Harness
>=0.1.1-rc.2 <0.2.0с публичным list-slotsidebar.footer.action
Опубликованный клиент rc.2 поддерживается без патчей. Sidebar host с вкладками определяется через опциональный версионированный протокол __dshNativeTabs@1; если его нет, плагин использует штатный footer action и не заменяет workspace browser.
Локальная разработка
cd dsh-draft-sessions
pnpm install
pnpm check
Сборка и подключение checkout к Web profile:
pnpm build
dsh plugin --profile web add .
dsh --profile web --dump-config
Удаление:
dsh plugin --profile web remove dsh-draft-sessions
Релизы
Релизы собираются из существующих SemVer-тегов с префиксом v ручным Release workflow. Workflow делает checkout точного тега, запускает полный quality gate, подставляет в пакет версию из тега, создаёт npm tarball и SHA-256 checksum, проверяет чистую установку tarball, загружает Actions artifact и оформляет GitHub Release с автоматически сгенерированными notes.
Maintainer может запустить его через Actions → Release → Run workflow или GitHub CLI:
git tag -a v0.1.0-rc.1 -m "v0.1.0-rc.1"
git push origin v0.1.0-rc.1
gh workflow run release.yml -f tag=v0.1.0-rc.1 -f publish_npm=false
Prerelease-теги публикуются в npm dist-tag next, стабильные — в latest. Публикация в npm по умолчанию выключена. Для включения opt-in job нужно:
- Один раз опубликовать пакет в npm вручную, если его ещё не существует.
- Настроить npm trusted publishing для этого GitHub-репозитория, файла
release.yml, environmentnpmи действияnpm publish. - Создать защищённый GitHub environment
npmи запустить workflow сpublish_npm=true.
Publish job использует GitHub OIDC вместо долгоживущего npm token. GitHub Release всегда создаётся до попытки публикации в npm.
Настройки
- id: draft-sessions
config:
storagePath: ""
maxDraftsPerWorkspace: 50
Пустой storagePath означает стандартный файл внутри $DSH_HOME.
Главные границы дизайна
- Источник истины для неотправленного текста —
DraftStore. - Реальная blank Session служит execution shell для model/preset/permissions UI.
- Создание draft никогда не запускает модель.
- Draft превращается в обычную Session только после принятого первого prompt.
- Attachments отложены до v2.
- Draft-строки композируются рядом с single workspace-browser occupant; плагин не отключает и не встраивает
ui-workspace. - Backing blank Sessions исключаются только из slot workspace browser, поэтому стандартный composer по-прежнему получает настоящую текущую Session.
Полные критерии находятся в SPEC.md, последовательность следующих этапов — в ROADMAP.md.