# dsh-session-folders
Плагин папок сессий для веб-интерфейса DeepSeek Harness: браузер воркспейсов в сайдбаре заменяется на браузер с **папками сессий** — один уровень именованных папок на воркспейс. Сессии можно перетаскивать в папки или перемещать через контекстное меню; данные папок хранятся на сервере и переживают перезагрузку страницы. Бейджи статусов повторяют встроенный браузер сессий. Изменений в самом Harness не требуется.
## Скриншоты
## Возможности
#### Организация
- **Папки сессий**: один уровень именованных папок на воркспейс; сессии вне папок лежат в «входящих» (свободная зона)
- **Перемещение сессий**: перетаскивание сессии в папку или контекстное меню строки — «Переместить в папку…», с пунктом «Новая папка…», который создаёт папку и сразу перемещает в неё сессию; пункт подменю «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`