# dsh-session-folders Плагин папок сессий для веб-интерфейса DeepSeek Harness: браузер воркспейсов в сайдбаре заменяется на браузер с **папками сессий** — один уровень именованных папок на воркспейс. Сессии можно перетаскивать в папки или перемещать через контекстное меню; данные папок хранятся на сервере и переживают перезагрузку страницы. Бейджи статусов повторяют встроенный браузер сессий. Изменений в самом Harness не требуется. ## Скриншоты
dsh-session-folders screenshot 1 dsh-session-folders screenshot 2 dsh-session-folders screenshot 3
## Возможности #### Организация - **Папки сессий**: один уровень именованных папок на воркспейс; сессии вне папок лежат в «входящих» (свободная зона) - **Перемещение сессий**: перетаскивание сессии в папку или контекстное меню строки — «Переместить в папку…», с пунктом «Новая папка…», который создаёт папку и сразу перемещает в неё сессию; пункт подменю «Workspace» возвращает сессию из папки в свободную зону - **Управление папками**: создание, переименование, удаление (с подтверждением); имена уникальны в рамках воркспейса (без учёта регистра) - **Переименование на месте**: двойной клик по заголовку сессии — правка прямо в строке (Enter — сохранить, Esc — отмена) - **Автопереименование**: в контекстном меню сессии — «Auto rename»: модель самой сессии читает её первое сообщение и придумывает краткое название не более чем из трёх слов (описание процесса/фичи/задачи, на языке сообщения); результат закрепляется как обычное ручное переименование - **Порядок перетаскиванием**: перетащите строку воркспейса, чтобы изменить порядок воркспейсов; строку папки — порядок папок внутри воркспейса (папки всегда над свободными сессиями, сортировка сессий по времени не меняется); порядок хранится на сервере - **Показать больше / меньше** в каждой папке и в блоке Archive: показывается не более пяти сессий, пока не нажата строка-переполнение; состояние раскрытия — отдельно для каждой папки, в пределах сессии браузера #### Действия с сессиями - **Контекстные меню**: у каждой строки сессии / папки / воркспейса по правому клику открывается меню действий (кнопки «…» убраны); каждый пункт снабжён иконкой - **Закрепление сессий (Pin / Unpin)**: закреплённая сессия всегда стоит первой в своей папке или в свободной зоне; состояние хранится на сервере и следует за сессией при перемещении; у закреплённой сессии без бейджа статуса в слоте статуса показывается маленькая иконка-булавка - **Быстрая архивация при наведении**: при наведении на строку сессии метка времени на её месте сменяется маленькой иконкой архива — один клик архивирует сессию (то же действие, что в контекстном меню); подмена происходит на месте, раскладка не сдвигается - **Бейдж ID сессии**: рядом с иконкой быстрой архивации при наведении на строку сессии появляется маленький бейдж `ID` — один клик копирует `session-` этой сессии в буфер обмена - **Кнопки новой сессии**: «+» на строке воркспейса создаёт сессию в этом воркспейсе; «+» поменьше на строке папки — сессию сразу внутри папки (созданный черновик перемещается в папку и открывается) - **Бейджи статусов** Выполняется / Завершено — как во встроенном браузере сессий #### Архив и восстановление - **Блок Archive**: иконка архива на строке воркспейса показывает/скрывает виртуальную папку Archive со всеми заархивированными сессиями воркспейса; пока показана, иконка перечёркнута, а папка открыта развёрнутой. Внутри сессии идут от новых к старым (сначала пять, со строкой «Показать ещё N / Показать меньше»). Перетаскивание: сброс сессии на неё архивирует сессию (как пункт меню); сброс заархивированной сессии на папку или в свободную зону восстанавливает её там - **Восстановление из архива**: правый клик по заархивированной сессии — «Восстановить в исходную папку» (сессия возвращается туда, где была до архивации, или в свободную зону); левый клик восстанавливает её в папку **Restored** воркспейса (создаётся по требованию, при необходимости раскрывается автоматически) и открывает в чате. Восстановленные сессии отделены от обычных: папка Restored всегда первая (сразу под блоком Archive) и прячется, когда в ней нет видимых сессий #### Навигация - **Секция Recent**: над списком воркспейсов — пять самых свежих сессий воркспейсов (из папок или свободной зоны), новые сверху; клик открывает сессию в чате, автоматически раскрывает свёрнутые уровни воркспейса/папки, и она подсвечивается и в Recent, и в своём воркспейсе/папке. Заголовок сворачивает секцию (состояние сохраняется) - **Карточка происхождения в Recent**: при наведении на сессию в Recent справа от строки появляется карточка с её воркспейсом и папкой - **Линии дерева папок**: пунктирные направляющие идут от значка каждой папки к её сессиям; всё дерево папки с открытой сессией окрашивается в синий. Переключатель в шапке браузера (включено по умолчанию) - **Поиск сессий** с подсветкой совпадений — по заголовку и содержимому - **Открыть папку воркспейса**: первая кнопка на строке воркспейса (иконка папки) открывает корневой каталог воркспейса системным файловым менеджером через нативный API хоста `openPath` - **Свернуть / развернуть всё**: пара кнопок-шевронов в шапке браузера сворачивает и разворачивает все группы воркспейсов, папки, секцию Recent и блоки Archive в один клик - **Фокус на воркспейсе**: переключатель-прицел на строке воркспейса (также в его контекстном меню) скрывает всё остальное — другие воркспейсы, Recent, Ungrouped — до выключения; фокус сбрасывается при перезапуске #### Хранение и интерфейс - **Серверное хранение**: папки живут в storage-домене DSH и переживают перезагрузку страницы; состояние вида (свёрнутые папки и т. п.) — в localStorage браузера - **Сервер — источник истины**: каждое действие валидируется на сервере (существование воркспейса, принадлежность сессии, конфликты имён); клиент лишь отражает правила - **Двуязычный интерфейс**: подстраивается под язык страницы (zh / en) - **Свёрнутый сайдбар**: в узкой панели рендерятся только кнопки поиска и нового воркспейса — как во встроенном браузере ## Установка ### Из npm ```sh dsh plugin --profile web add dsh-session-folders ``` Установка готового пакета из реестра — пропускает шаг одобрения сборки (`allowBuilds`). ### Из GitHub ```sh dsh plugin --profile web add 'github:EugeneVl/dsh_session_folders#v0.4.2' ``` ### Из локального каталога ```sh dsh plugin --profile web add /absolute/path/to/dsh-session-folders ``` ### Из tarball ```sh pnpm pack dsh plugin --profile web add /absolute/path/to/dsh-session-folders-0.4.0.tgz ``` После установки **перезапустите** `dsh web` (хост-плагин и клиентский bundle загружаются при старте). ## Использование #### Начало работы 1. Откройте сайдбар: в каждом воркспейсе папки показываются над свободными сессиями #### Папки 1. **Создать папку** — правый клик по строке воркспейса → «Новая папка»; имя должно быть уникальным в рамках воркспейса 2. **Переименовать / удалить папку** — правый клик по строке папки → «Переименовать»; удаление требует подтверждения, сессии папки становятся свободными 3. **Порядок** — перетащите строку воркспейса на новое место; строку папки — в пределах её воркспейса (верхняя/нижняя половина строки = до/после) #### Сессии 1. **Переместить сессию** — перетащите строку сессии на папку (только в папку того же воркспейса) или правый клик по сессии → «Переместить в папку…» → выберите папку или «Новая папка…», чтобы создать и переместить сразу 2. **Вернуть в свободную зону** — правый клик по сессии → «Переместить в папку…» → «Workspace» (первый пункт) 3. **Закрепить сессию** — правый клик → «Pin»: сессия встаёт в начало своей папки (или свободной зоны) и остаётся там, пока приходят другие сессии; «Unpin» возвращает порядок «новые сверху»; у закреплённой сессии без бейджа статуса в слоте статуса — маленькая булавка 4. **Новая сессия** — «+» на строке воркспейса создаёт сессию в нём; «+» поменьше на строке папки — сразу внутри папки 5. **Переименовать сессию** — двойной клик по её заголовку (Enter — сохранить, Esc — отмена) или правый клик → «Переименовать» 6. **Автопереименование** — правый клик по сессии → «Auto rename»: модель сессии по первому сообщению придумывает название не более чем из трёх слов. В простое ничего не вызывает; ошибки — в notice-бар 7. **Быстрая архивация** — наведите на строку сессии: метка времени на её месте сменится иконкой архива; клик — архивация #### Архив и восстановление 1. **Архив** — иконка архива на строке воркспейса показывает/скрывает виртуальную папку Archive (все заархивированные сессии воркспейса, новые сверху, по пять за раз). Сброс сессии на неё архивирует; сброс заархивированной сессии на папку или в свободную зону восстанавливает 2. **Восстановление** — правый клик по заархивированной сессии → «Восстановить в исходную папку» (на прежнее место); левый клик восстанавливает в папку **Restored** (если свёрнута — раскроется автоматически) и открывает сессию. Папка Restored всегда первая и прячется, когда пуста #### Поиск и навигация 1. **Поиск** — поле вверху браузера; совпадения подсвечены и кликабельны 2. **Recent** — секция над списком воркспейсов показывает пять самых свежих сессий (папки + свободная зона). Клик открывает сессию; строка в Recent и иконки воркспейса/папки отмечают текущую сессию; заголовок сворачивает секцию 3. **Открыть папку воркспейса** — первая кнопка (иконка папки) на строке воркспейса открывает корневой каталог в системном файловом менеджере #### Вид 1. **Свернуть / развернуть всё** — пара кнопок-шевронов вверху браузера: - свернуть: сворачивает все группы воркспейсов и папки (включая Recent и Archive) - развернуть: снова раскрывает их ## Как это устроено | Слой | Реализация | |---|---| | Хост | `lib/index.js` — cordis-плагин: 10 POST-роутов `/dsh-session-folders/{list,create,rename,delete,move,reorder-folders,reorder-workspaces,pin,unarchive}`; собственный storage-домен `dsh_session_folders` (одна глобальная запись со списком папок); мутации сериализуются через promise-хвост, чтобы два браузера не перезаписывали друг друга; воркспейсы и принадлежность сессий валидируются через `ctx.workspaceRegistry` | | Клиент | `lib/client.js` — bundle, загружаемый через `window.__ModuleLoader__.load`, зарегистрирован в слоте `sidebar.workspaces` (приоритет -1); сервисы `slots / locale / sessions / workspaces`; состояние вида в localStorage (`dsh.session-folders.view.v1`) | - Папки не влияют на учёт сессий: воркспейс владеет сессиями, папки — только группировка. Сессия, не указанная ни в одной папке, свободна по определению - Удаление воркспейса не удаляет записи папок: они перестают отдаваться (фильтр по живым id воркспейсов) и безвредно остаются в хранилище - DSH-домены гарантируют запись «сначала долговечность»; файл хранилища — `~/.dsh/storages/dsh_session_folders.json` - Никаких изменений системного промпта и новых инструментов модели — нулевое влияние на токены ## Ограничения - Только один уровень папок: вложенные папки не поддерживаются - Сессию можно переместить только в папку её воркспейса; сессия вне всех воркспейсов (неучтённая) не может попасть в папку - Имена папок ограничены 80 символами; дубликаты отклоняются (без учёта регистра) - Порядок работает с сервером как источником истины: клиент отправляет полный список id, сервер его валидирует (воркспейсы нельзя бросить вне живого набора, папки не могут покинуть свой воркспейс) ## Совместимость Текущая версия рассчитана на DSH `0.1.0-rc.6` (слот `sidebar.workspaces`, сервисы `webServer / storageDomain / workspaceRegistry`, `@deepseek-ai/dsh-storage-domain`, `@deepseek-ai/dsh-workspace`, `zod`). Апгрейд DSH, меняющий API слотов/сервисов, может потребовать адаптации. ## Разработка Шага сборки нет: `lib/` — это закоммиченный bundle (хост + клиент). Правите файлы напрямую и проверяете синтаксис: ```sh node --check lib/index.js node --check lib/client.js ``` Клиентские изменения (пункты меню, кнопки, рендер) обычно требуют только обновления страницы — bundle отдаётся по требованию; изменения на стороне хоста (роуты, валидация) требуют перезапуска `dsh web`. ### Чек-лист релиза 1. Поднять `version` в `package.json` и добавить запись в `CHANGELOG.md` 2. Закоммитить, поставить тег `vN.N.N`, запушить master и тег 3. Указать профилю новую версию: `dsh plugin --profile web add 'github:EugeneVl/dsh_session_folders#vN.N.N'`, затем перезапустить `dsh web`