dsh-composer-plus 1.16.0 → 1.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.de.md +28 -15
- package/README.es.md +28 -15
- package/README.fr.md +28 -15
- package/README.hi.md +28 -15
- package/README.id.md +28 -15
- package/README.ja.md +28 -15
- package/README.ko.md +28 -15
- package/README.md +28 -15
- package/README.pt-BR.md +28 -15
- package/README.ru.md +28 -15
- package/README.tr.md +28 -15
- package/README.vi.md +28 -15
- package/README.zh.md +28 -15
- package/assets/features/contextBreakdown.webp +0 -0
- package/assets/features/handoffChat.webp +0 -0
- package/assets/features/headerFit.webp +0 -0
- package/assets/features/projectMemory.webp +0 -0
- package/assets/features/protectedFiles.webp +0 -0
- package/client.js +729 -48
- package/index.js +762 -47
- package/package.json +2 -2
- package/tether/gateway/server.mjs +1 -1
package/README.ru.md
CHANGED
|
@@ -29,7 +29,7 @@ dsh plugin --profile web add dsh-composer-plus
|
|
|
29
29
|
|
|
30
30
|
Затем перезапустите dsh. (CLI не может устанавливать плагины в профиль настольного приложения: им управляет само приложение.)
|
|
31
31
|
|
|
32
|
-
> pnpm в dsh пропускает версии, которые вышли меньше 24 часов назад. Сразу после выпуска укажите версию: `dsh-composer-plus@1.
|
|
32
|
+
> pnpm в dsh пропускает версии, которые вышли меньше 24 часов назад. Сразу после выпуска укажите версию: `dsh-composer-plus@1.17.0`.
|
|
33
33
|
|
|
34
34
|
## Функции
|
|
35
35
|
|
|
@@ -47,6 +47,7 @@ dsh plugin --profile web add dsh-composer-plus
|
|
|
47
47
|
| **Режим плана по Shift+Tab** | <a id="feature-plantoggle"></a>`Shift+Tab` добавляет `/plan ` в начало черновика (нажмите ещё раз, чтобы убрать). Если чат уже в режиме плана, `Shift+Tab` выходит из него. | <a href="assets/features/planToggle.webp"><img src="assets/features/planToggle.webp" width="160" alt="Снимок экрана: Режим плана по Shift+Tab"></a> |
|
|
48
48
|
| **Сохранять фокус в поле ввода** | <a id="feature-keepfocus"></a>После отправки команды `/` или навыка курсор остаётся в поле ввода, и можно сразу печатать дальше. Это работает и для клавиатурных макросов, которые вводят команду и нажимают `Enter`. Пока dsh обрабатывает команду, поле ввода доступно только для чтения, и браузер снимает с него фокус. Эта функция возвращает фокус, если он не занят меню, диалогом или другим полем. | <a href="assets/features/keepFocus.webp"><img src="assets/features/keepFocus.webp" width="160" alt="Снимок экрана: Сохранять фокус в поле ввода"></a> |
|
|
49
49
|
| **Подгонять карточку вопроса под окно** | <a id="feature-questionfit"></a>Когда агент задаёт вам вопрос, вопрос и ответы прокручиваются в карточке вместе, а **Пропустить** и **Отправить** остаются видны внизу. Карточка занимает высоту окна (минус 200 px на заголовок чата и полосу чата), поэтому растёт и уменьшается вместе с окном. Без этой функции dsh ограничивает карточку 60% окна (не больше 520 px) и прокручивает только ответы: длинный вопрос может вытолкнуть из карточки свой конец, ответы и кнопки. | <a href="assets/features/questionFit.webp"><img src="assets/features/questionFit.webp" width="160" alt="Снимок экрана: Подгонять карточку вопроса под окно"></a> |
|
|
50
|
+
| **Подогнать заголовок чата под окно** | <a id="feature-headerfit"></a>В узком окне кнопки в заголовке чата dsh (режим, субагенты, фоновые задачи, Открыть в, метка ветки и метка разрешений) больше не перекрывают друг друга. Название чата сохраняет не меньше 120 px; кнопки, которые не помещаются, переходят на вторую строку справа, и каждая остаётся кликабельной. Когда всё помещается в одну строку (широкое окно), заголовок точно такой же, как у dsh. Без этой функции dsh сжимает только название: при субагенте и фоновых задачах его кнопки наезжают друг на друга в узкой колонке чата. Метка ветки (**Ветка для каждого чата**) и метка разрешений (**Разрешить для этого чата**) подстраиваются под заголовок и при выключенном переключателе. | <a href="assets/features/headerFit.webp"><img src="assets/features/headerFit.webp" width="160" alt="Снимок экрана: Подогнать заголовок чата под окно"></a> |
|
|
50
51
|
| **Продолжение в один клик** | <a id="feature-continuebutton"></a>После остановленного, завершившегося сбоем или оборванного хода в пустом поле ввода появляется **▶**. Один щелчок продолжает работу с текущего разговора. Ничего не нужно писать в поле ввода, и в чате не появляется новое сообщение. (Модель получает короткую скрытую заметку «продолжи с того места, где остановился», потому что некоторые провайдеры, например Claude, отклоняют запрос, который заканчивается ответом ассистента.) Сообщения в очереди остаются в ней: ▶ продолжает только остановленную задачу, а потом выполняется очередь. После завершённого хода остаётся обычная кнопка отправки. | <a href="assets/features/continueButton.webp"><img src="assets/features/continueButton.webp" width="160" alt="Снимок экрана: Продолжение в один клик"></a> |
|
|
51
52
|
| **Продолжать после перезапуска** | <a id="feature-resumeafterrestart"></a>По умолчанию выключено: включите функцию в **Настройки → Composer Plus**. Если выйти из dsh (или он закроется), пока чат работает, этот чат сам продолжит работу, когда вы снова откроете dsh. Он получает ту же скрытую заметку, что и при продолжении в один клик. Если выполнялся раунд цели (`/goal`), цель продолжается со следующего раунда (при каждом запуске dsh приостанавливает цели, пока вы их не возобновите). Чаты, которые вы остановили, которые завершились или завершились сбоем, не продолжаются. В самом dsh такой настройки нет: он только помечает такой ход как прерванный. | <a href="assets/features/resumeAfterRestart.webp"><img src="assets/features/resumeAfterRestart.webp" width="160" alt="Снимок экрана: Продолжать после перезапуска"></a> |
|
|
52
53
|
| **Перетаскивание в очереди** | <a id="feature-queuereorder"></a>У сообщений в очереди появляется маркер (⠿). Перетащите его, чтобы изменить порядок, или переведите на него фокус и нажмите `↑` / `↓`. `Esc` отменяет перемещение. | <a href="assets/features/queueReorder.webp"><img src="assets/features/queueReorder.webp" width="160" alt="Снимок экрана: Перетаскивание в очереди"></a> |
|
|
@@ -63,19 +64,22 @@ dsh plugin --profile web add dsh-composer-plus
|
|
|
63
64
|
| **Ветки в дереве рабочих областей** | <a id="feature-branchtree"></a>Настройки → Composer Plus → **Ветки в дереве рабочих областей** (по умолчанию выключено). Каждая ветка с папкой worktree в `<project>/.worktrees/` показывается как проект внутри своего проекта; выберите в dsh **Параметры просмотра** → **Дерево рабочих областей**, чтобы видеть вложенность. Ветка, чью папку удалили, уходит из списка, а dsh показывает её чаты в **Без группы**. Когда агент чата в папке проекта создаёт ветку и переключается на неё (`git switch -c`, `git checkout -b`), а в папке нет незакоммиченных изменений, папка проекта возвращается на прежнюю ветку, ветка получает свою папку, и чат переходит туда: копия открывается в проекте ветки и продолжает задачу, а старый чат архивируется. Список проверяется при запуске, каждые 30 секунд, после каждого хода и когда вы возвращаетесь в окно. | <a href="assets/features/branchTree.webp"><img src="assets/features/branchTree.webp" width="160" alt="Снимок экрана: Ветки в дереве рабочих областей"></a> |
|
|
64
65
|
| **Предсказание следующего сообщения** | <a id="feature-nextprediction"></a>По умолчанию включено: выключить функцию можно в **Настройки → Composer Plus**. Когда агент завершает ход (не остановленный и не завершившийся сбоем), пустое поле ввода серым текстом показывает предположение о вашем следующем сообщении и подсказку **Tab — принять**. `Tab` вставляет текст в поле ввода, но не отправляет его. `Esc` скрывает предположение до конца этого хода. Ввод текста тоже скрывает его, а новый ход заменяет его новым. Меню **Модель** под переключателем показывает собственные модели dsh (тот же список, что и в меню моделей dsh). По умолчанию выбран пункт **По умолчанию в dsh**: он следует модели dsh по умолчанию. Каждый завершённый ход стоит один короткий вызов модели. В Tether предположение появляется над пустым полем ввода: коснитесь его, чтобы вставить текст в поле. | <a href="assets/features/nextPrediction.webp"><img src="assets/features/nextPrediction.webp" width="160" alt="Снимок экрана: Предсказание следующего сообщения"></a> |
|
|
65
66
|
| **Дополнение при вводе** | <a id="feature-typingcompletion"></a>По умолчанию выключено: включить функцию можно в **Настройки → Composer Plus**. Пока вы печатаете, серый текст сразу после курсора показывает, как может продолжиться ваше сообщение. `Tab` добавляет его в сообщение, но не отправляет. `Esc` скрывает его. Функция предлагает только ваши собственные следующие слова: никогда не ответ вам и без выдуманных текстов ошибок или имён. Если сообщение выглядит законченным или модель не уверена, ничего не появляется. Если вы набираете следующие буквы серого текста, он остаётся, без нового вызова модели. Под её переключателем есть своё меню **Модель**. Первый пункт, **Как у предсказания следующего сообщения**, использует модель **Предсказание следующего сообщения** (выбран по умолчанию). Выберите другую модель, чтобы у каждой функции была своя, например более быстрая модель для дополнений. Она делает один вызов модели при каждой паузе в наборе, поэтому расходует намного больше токенов, чем предсказание: выберите быструю и недорогую модель. Она не работает для слеш-команды, для сообщения со значком файла и когда курсор стоит не в конце. В Tether остаток текста появляется над полем, пока вы печатаете: коснитесь его, чтобы добавить. | <a href="assets/features/typingCompletion.webp"><img src="assets/features/typingCompletion.webp" width="160" alt="Снимок экрана: Дополнение при вводе"></a> |
|
|
66
|
-
| **Улучшить промпт** | <a id="feature-promptimprove"></a>Напишите черновой запрос, затем нажмите волшебную палочку (**Улучшить промпт**) рядом с меню моделей. Один вызов модели переписывает его в более понятный промпт: сначала цель, короткие пронумерованные шаги, если частей несколько, и проверка, которую нужно запустить. Функция читает этот чат (без сообщений, убранных откатом), README, AGENTS.md и манифест проекта, изменённые файлы и файлы, имена которых совпадают с вашими словами, и сохраняет ваш язык. Она никогда не выдумывает имена файлов. Новый текст заменяет ваш черновик, но не отправляется: прочитайте его, отредактируйте, затем нажмите `Enter`. `Cmd/Ctrl+Z` возвращает ваш текст за один шаг, как и кнопка (**Отменить улучшение**). Если вы печатаете, пока она работает, ваш новый текст остаётся. `Esc` или повторное нажатие отменяет. У неё есть своё меню **Модель** в настройках (по умолчанию: **Как модель чата**). Не работает для
|
|
67
|
-
| **Проверка цели** | <a id="feature-goalcheck"></a>Начните цель командой `/goal`. Когда агент в автоматическом раунде отмечает цель как выполненную, цель закрывается только после двух проверок. Сначала тестовая команда проекта запускается в папке чата, в режиме песочницы этого чата. Это ваша собственная команда или команда, найденная в `package.json`, `Makefile`, `Cargo.toml`, `go.mod` или pytest. Если последним шагом самого агента был успешный запуск этого теста, повторно он не запускается. Затем независимый вызов модели без инструментов читает цель, этот чат, `git status` и результат теста. Если проверка не пройдена, цель остаётся активной, агент читает
|
|
68
|
-
|
|
|
67
|
+
| **Улучшить промпт** | <a id="feature-promptimprove"></a>Напишите черновой запрос, затем нажмите волшебную палочку (**Улучшить промпт**) рядом с меню моделей. Один вызов модели переписывает его в более понятный промпт: сначала цель, короткие пронумерованные шаги, если частей несколько, и проверка, которую нужно запустить. Функция читает этот чат (без сообщений, убранных откатом), README, AGENTS.md и манифест проекта, изменённые файлы и файлы, имена которых совпадают с вашими словами, и сохраняет ваш язык. Она никогда не выдумывает имена файлов. Новый текст заменяет ваш черновик, но не отправляется: прочитайте его, отредактируйте, затем нажмите `Enter`. `Cmd/Ctrl+Z` возвращает ваш текст за один шаг, как и кнопка (**Отменить улучшение**). Если вы печатаете, пока она работает, ваш новый текст остаётся. `Esc` или повторное нажатие отменяет. У неё есть своё меню **Модель** в настройках (по умолчанию: **Как модель чата**). В сообщении `/goal <objective>` она переписывает только цель — как условие завершения, которое может проверить **Проверка цели**: результаты, проверки, которые должны пройти, доказательства, которые нужно показать в чате, часть, которую нельзя сделать, с отметкой «не решено», и остановка, если то же препятствие остаётся. Команда `/goal` сохраняется. Не работает для других слеш-команд, управляющего слова `/goal` (`clear`, `pause`, `resume`) и сообщения со значком файла. В Tether палочка находится рядом с полем. | <a href="assets/features/promptImprove.webp"><img src="assets/features/promptImprove.webp" width="160" alt="Снимок экрана: Улучшить промпт"></a> |
|
|
68
|
+
| **Проверка цели** | <a id="feature-goalcheck"></a>Начните цель командой `/goal`. Когда агент в автоматическом раунде отмечает цель как выполненную, цель закрывается только после двух проверок. Сначала тестовая команда проекта запускается в папке чата, в режиме песочницы этого чата. Это ваша собственная команда или команда, найденная в `package.json`, `Makefile`, `Cargo.toml`, `go.mod` или pytest. Если последним шагом самого агента был успешный запуск этого теста, повторно он не запускается. Затем независимый вызов модели без инструментов читает цель, этот чат, `git status` и результат теста. Модель отвечает таблицей доказательств: каждая часть цели отмечается как подтверждённая, неверная или нерешённая, с доказательством и исправлением; цель закрывается, только когда подтверждены все части. Если проверка не пройдена, цель остаётся активной, агент читает каждую открытую часть с её доказательством и исправлением, и начинается следующий раунд. Строка под панелью цели (**Проверка цели**) показывает тест, последний результат и число подтверждённых частей (наведите на неё указатель, чтобы увидеть таблицу). **Изменить** задаёт вашу собственную тестовую команду и лимит времени или токенов; при превышении лимита цель становится заблокированной. Лимит токенов учитывает и субагентов чата. **Запустить сейчас** запускает проверку, не закрывая цель. У функции есть своё меню **Модель** в настройках (по умолчанию: **Как модель чата**). Когда вы сами завершаете цель, ничего не проверяется. | <a href="assets/features/goalCheck.webp"><img src="assets/features/goalCheck.webp" width="160" alt="Снимок экрана: Проверка цели"></a> |
|
|
69
|
+
| **Продолжить в новом чате** | <a id="feature-handoffchat"></a>Правый щелчок по чату на боковой панели (или его меню **…**) → **Продолжить в новом чате…**. Один вызов собственной модели чата пишет заметку для передачи по тому, что показывает чат: Задача, Результаты, Сделано, Решения, Открытые вопросы и Следующий шаг (вызовы инструментов и их результаты служат доказательствами; шаги, которые вы откатили, не учитываются). Заметка открывается в диалоге: прочитайте и отредактируйте её. **Написать заново** пишет новую заметку. **Начать новый чат** (или `Cmd/Ctrl+Enter`) открывает новый чат в том же проекте; его первое сообщение — заметка и ссылка на старый чат. Старый чат остаётся как есть. Используйте функцию, когда длинный чат заполнен или работает медленно, или чтобы продолжить завтра. В проект ничего не записывается. | <a href="assets/features/handoffChat.webp"><img src="assets/features/handoffChat.webp" width="160" alt="Снимок экрана: Продолжить в новом чате"></a> |
|
|
70
|
+
| **Состав контекста** | <a id="feature-contextbreakdown"></a>Правая боковая панель → `+` → **Контекст**. Страница показывает, что сейчас заполняет контекст модели открытого чата и какую часть контекстного окна это занимает: системный промпт, инструкции проекта (AGENTS.md), навыки, ваши сообщения, ответы агента и вызовы инструментов, результаты инструментов (по инструментам), результаты MCP (по серверам), определения инструментов, сводку сжатия и другие заметки контекста — для каждого число токенов и доля. Нажмите на часть, чтобы увидеть её инструменты или серверы. Страница читает только журнал чата, после `/compact` и откатов, и не вызывает модель; она перечитывает его после каждого хода и по кнопке **Обновить**. Используйте её, чтобы понять, почему чат медленный или заполнен, например из-за большого результата инструмента MCP или множества определений инструментов. | <a href="assets/features/contextBreakdown.webp"><img src="assets/features/contextBreakdown.webp" width="160" alt="Снимок экрана: Состав контекста"></a> |
|
|
71
|
+
| **Защищённые файлы** | <a id="feature-protectedfiles"></a>Включено по умолчанию. Собственные файловые инструменты агента не могут читать или изменять файлы, подходящие под ваши шаблоны: `read`, `read_image` и `grep` по файлу отклоняются для шаблонов **чтение и запись**, а `write`, `edit` и `str_replace_editor` — для обоих видов. Агент читает причину, и ему предлагается спросить вас. Шаблоны по умолчанию: `.env*`, `*.pem` и `*.key`. Настройки → Composer Plus → **Защищённые файлы**: добавьте шаблон (например, `published/**` или `config/*.yml`), нажмите на его вид, чтобы переключить между **чтение и запись** и **только запись**, удалите его кнопкой ✕ или нажмите **Использовать значения по умолчанию**. Шаблон без `/` подходит к имени файла в любой папке. Это ограждение, а не песочница: команда оболочки (`cat .env`), скрипт или инструмент MCP всё равно могут добраться до файла (см. «Ограничения»). | <a href="assets/features/protectedFiles.webp"><img src="assets/features/protectedFiles.webp" width="160" alt="Снимок экрана: Защищённые файлы"></a> |
|
|
72
|
+
| **Память проекта** | <a id="feature-projectmemory"></a>По умолчанию выключено: включите функцию в **Настройки → Composer Plus**. У каждой папки проекта своя память, которую читают следующие чаты этого проекта, так же как DS Bot хранит память для каждого бота. После каждого завершённого хода один вызов модели чата читает новые сообщения (без отменённых откатом), сохраняет ваши постоянные предпочтения, решения и факты как короткие заметки и изменяет или удаляет старые. Агент также может сам сохранять, удалять и искать заметки (`memory_remember`, `memory_forget`, `memory_recall`). Заметка может быть и глобальной: её читают все проекты. Новый чат получает заметки в системном промпте; заметка, сохранённая позже, появляется со следующего чата. Файлы хранятся в формате Markdown в домашней папке dsh (`storages/dsh-composer-plus/memory/`), никогда в папке проекта. Кнопка **Открыть память** в той же строке показывает все сохранённые заметки по проектам (и глобальную память), с фильтром. Опишите своими словами, что изменить (например, «я перешёл с yarn на pnpm»), затем нажмите **Предпросмотр изменений**: модель dsh по умолчанию предлагает изменения, а сохраняет их только **Применить**. В Tether: меню заголовка чата → Project memory. | <a href="assets/features/projectMemory.webp"><img src="assets/features/projectMemory.webp" width="160" alt="Снимок экрана: Память проекта"></a> |
|
|
69
73
|
| **Разрешить для этого чата** | <a id="feature-allowforchat"></a>Когда автопроверка спрашивает вас, на карточке одобрения появляется кнопка **Разрешить для этого чата**. После этого тот же инструмент в том же чате разрешён с любыми аргументами, пока не истечёт лимит времени (по умолчанию 1 час; выберите его в **Настройки → Composer Plus → Разрешить для этого чата**). Затем агент снова спрашивает. Значок в заголовке показывает список разрешений со временем их окончания и позволяет их отозвать. Разрешения сохраняются после перезапуска. | <a href="assets/features/allowForChat.webp"><img src="assets/features/allowForChat.webp" width="160" alt="Снимок экрана: Разрешить для этого чата"></a> |
|
|
70
74
|
| **Статус проекта** | <a id="feature-projectstatus"></a>Строка проекта на боковой панели показывает ту же метку, что и его чаты: индикатор выполнения, ожидание или «готово». Поэтому даже свёрнутый проект сообщает, что чат внутри работает или ждёт вас. Сначала показывается чат, который ждёт вас, затем завершённый чат, который вы ещё не открыли (зелёная точка, даже пока другой чат ещё выполняется), затем индикатор выполнения. Наведите на метку указатель, чтобы увидеть подробности. В режиме **Дерево рабочих областей** строка родительской папки также показывает чаты каждого проекта внутри неё (например, каждой папки ветки в `.worktrees/`), даже когда папка свёрнута. | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="Снимок экрана: Статус проекта"></a> |
|
|
71
|
-
| **Ветка Git в строках чатов** | <a id="feature-sessionbranch"></a>Каждая строка чата на боковой панели показывает маленькую серую метку с веткой git, на которой была папка проекта чата в его последнем ходе (например, `main` или `feature/login`; при отсоединённом HEAD
|
|
75
|
+
| **Ветка Git в строках чатов** | <a id="feature-sessionbranch"></a>Каждая строка чата на боковой панели показывает маленькую серую метку с веткой git, на которой была папка проекта чата в его последнем ходе (например, `main` или `feature/login`; при отсоединённом HEAD ветки нет, и метка не показывается). Два чата одного проекта на разных ветках больше не выглядят одинаково, и вы сразу видите, если собираетесь продолжить чат не на той ветке. Наведите указатель на метку, чтобы увидеть полное имя. Host-часть читает ветку (`git branch --show-current`, только чтение), когда ход начинается и когда заканчивается; у чата без хода с момента установки этой функции или у папки, которая не является репозиторием git, метки нет. Если строка проекта над чатом называется так же, как ветка (например, папка «Ветка для каждого чата»), строка чата не показывает метку, но в режиме «Одним списком» метка по-прежнему видна. | <a href="assets/features/sessionBranch.webp"><img src="assets/features/sessionBranch.webp" width="160" alt="Снимок экрана: Ветка Git в строках чатов"></a> |
|
|
72
76
|
| **Отметить все как прочитанные** | <a id="feature-markprojectread"></a>На боковой панели нажмите кнопку **…** проекта → **Отметить все как прочитанные**. У всех чатов этого проекта сразу пропадает зелёная точка непрочитанного. У других проектов точки остаются. Если в проекте нет непрочитанных чатов, пункт показан серым (**Нет непрочитанных чатов**). | <a href="assets/features/markProjectRead.webp"><img src="assets/features/markProjectRead.webp" width="160" alt="Снимок экрана: Отметить все как прочитанные"></a> |
|
|
73
77
|
| **Активные проекты сверху** | <a id="feature-activeprojectsfirst"></a>Когда чат начинает работать или ждёт вас, его проект перемещается в начало боковой панели со встроенной анимацией строк dsh (так же, как при перетаскивании). Завершённые проекты остаются на месте; их можно перетаскивать как обычно. Перемещения сохраняются в порядке проектов dsh, поэтому при отключении функции текущий порядок остаётся. | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="Снимок экрана: Активные проекты сверху"></a> |
|
|
74
78
|
| **Фильтр недавних проектов** | <a id="feature-recentprojects"></a>Боковая панель → параметры просмотра (значок с ползунками) → **Активные за последние 2 часа**. Пока этот пункт выбран, боковая панель показывает только проекты с чатом, активным за последние 2 часа. Это чат, обновлённый за это время, выполняющийся или ожидающий чат, открытый чат или завершённый чат, который вы ещё не открыли (зелёная точка dsh «готово»), — такой чат оставляет проект на виду и после 2 часов. Проекты без такого чата скрыты, в том числе новые и пустые. В режиме **Дерево рабочих областей** родительская папка остаётся на виду, пока активен проект внутри неё, а чаты, которые не были активны за последние 2 часа, тоже скрыты, поэтому видны только недавние чаты. Выберите пункт ещё раз, чтобы показать все проекты. Выбор сохраняется на этом устройстве. | <a href="assets/features/recentProjects.webp"><img src="assets/features/recentProjects.webp" width="160" alt="Снимок экрана: Фильтр недавних проектов"></a> |
|
|
75
79
|
| **Свернуть все проекты** | <a id="feature-collapseprojects"></a>Пока на боковой панели открыт хотя бы один проект, рядом с параметрами просмотра (значок с ползунками) есть кнопка. Нажмите её, чтобы сразу закрыть все открытые проекты, например 3 открытых из 5. Когда открытых проектов нет, кнопка снова скрывается. | <a href="assets/features/collapseProjects.webp"><img src="assets/features/collapseProjects.webp" width="160" alt="Снимок экрана: Свернуть все проекты"></a> |
|
|
76
80
|
| **Сортировка по состоянию** | <a id="feature-statusorder"></a>Боковая панель → параметры просмотра → **Сортировать** → **По состоянию** (вместе с **Одним списком**). Сначала идут завершённые чаты (с точкой dsh «готово»; её получает и ход, который закончился ошибкой), затем выполняющиеся или ожидающие чаты, затем чаты с активной автоматизацией (расписанием), затем остальные в порядке dsh. Когда вы открываете завершённый чат, он опускается ниже. Меняется только вид: чтобы вернуться, выберите **Вручную** или **По дате изменения**. | <a href="assets/features/statusOrder.webp"><img src="assets/features/statusOrder.webp" width="160" alt="Снимок экрана: Сортировка по состоянию"></a> |
|
|
77
81
|
| **Фоновые уведомления** | <a id="feature-notifications"></a>Пока dsh работает в фоне, вы получаете уведомление, когда ход завершён (первая строка ответа) или когда чат действительно ждёт вас: одобрения (имя инструмента), ответа (сам вопрос) или проверки плана. Запрос должен оставаться открытым и через 1,5 с. Поэтому одобрения, на которые ответили автоматически (разрешения автопроверки, другие плагины), не вызывают уведомлений. Уведомление убирается, как только на его запрос ответили. Значок в Dock или на панели задач показывает число ожидающих чатов. Щелчок по уведомлению открывает этот чат. | <a href="assets/features/notifications.webp"><img src="assets/features/notifications.webp" width="160" alt="Снимок экрана: Фоновые уведомления"></a> |
|
|
78
|
-
| **Открывать ожидающий чат при бездействии** | <a id="feature-idleswitch"></a>Когда чат задаёт
|
|
82
|
+
| **Открывать ожидающий чат при бездействии** | <a id="feature-idleswitch"></a>Когда чат задаёт вопрос, ждёт одобрения или проверки плана (оранжевая точка) или завершает ход, который вы ещё не прочитали (зелёная точка), а вы не пользуетесь dsh 30 секунд, dsh открывает этот чат. Оранжевые чаты открываются раньше зелёных. В каждой группе первым открывается тот, что ждёт дольше всех; следующий открывается ещё через 30 секунд бездействия. Нажатие клавиши, щелчок, движение мыши, колесо прокрутки или касание запускают отсчёт 30 секунд заново. Текст в поле с фокусом, выделенный текст или открытое меню либо диалог тоже не дают переключиться. Пока ожидающий чат на экране, ничего не меняется. Если вы ушли из ожидающего чата, не ответив, он может открыться снова после следующих 30 секунд бездействия. Когда открывается зелёный чат, его точка исчезает; следующий зелёный чат откроется только после того, как вы снова воспользуетесь dsh, а затем 30 секунд не будете им пользоваться. Функция работает и когда dsh в фоне, но окно dsh не выходит на передний план. | <a href="assets/features/idleSwitch.webp"><img src="assets/features/idleSwitch.webp" width="160" alt="Снимок экрана: Открывать ожидающий чат при бездействии"></a> |
|
|
79
83
|
| **Язык приложения** | <a id="feature-language"></a>Настройки → Composer Plus → **Язык приложения** переключает весь интерфейс dsh на Türkçe, Español, Português (Brasil), Français, Deutsch, Русский, 日本語, 한국어, Bahasa Indonesia, Tiếng Việt или हिन्दी (см. ниже). | <a href="assets/features/language.webp"><img src="assets/features/language.webp" width="160" alt="Снимок экрана: Язык приложения"></a> |
|
|
80
84
|
| **Мобильное подключение (iPhone)** | <a id="feature-mobileconnect"></a>Работайте с dsh на iPhone через приложение [Tether](tether/) в той же сети Wi-Fi или через [Tailscale](https://tailscale.com). Включите функцию в **Настройки → Composer Plus** (по умолчанию она выключена, потому что открывает сетевой порт на этом Mac). Затем нажмите **Мобильное подключение** внизу слева на боковой панели, отсканируйте QR-код камерой iPhone (коснитесь **Open in Tether**) или кнопкой **Scan code** в Tether, коснитесь **Connect** и нажмите **Approve**. Сначала установите Tether: без него камера не сможет открыть код. Телефон показывает ваши чаты, отправляет сообщения (с фото: **+** в поле ввода → Camera, Photos или Paste image), отвечает на запросы одобрения и вопросы, переключает модели и агентов. Можно связать сколько угодно Mac: имя Mac вверху слева в приложении переключает между ними. Панель **Мобильное подключение** показывает связанные iPhone и время их последнего подключения: **Remove** сразу отключает любой из них. «Tailscale only» отклоняет подключения из локальной сети (для общей сети Wi-Fi), а журнал доступа показывает, кто пытался подключиться. В Tether «Settings → Privacy» блокирует приложение с помощью Face ID. | <a href="assets/features/mobileConnect.webp"><img src="assets/features/mobileConnect.webp" width="160" alt="Снимок экрана: Мобильное подключение (iPhone)"></a> |
|
|
81
85
|
| **Автоматические обновления** | <a id="feature-autoupdate"></a>При запуске dsh плагин проверяет [последний выпуск на GitHub](https://github.com/furkancak1r/dsh-composer-plus/releases/latest). Если он новее и уже есть в npm, плагин устанавливает именно эту версию через встроенный менеджер плагинов dsh (тем же путём, что и Настройки → Плагины) и уведомляет вас. Перезапустите dsh, чтобы загрузить её. **Настройки → Composer Plus → Обновления Composer Plus** показывает версию и кнопки **Проверить обновления** / **Обновить сейчас**. При первом запуске dsh с новой версией окно **Что нового в Composer Plus N** один раз показывает примечания к этой версии (из той же проверки обновлений, без нового сетевого запроса); **Закрыть** или `Esc` закрывает его. | <a href="assets/features/autoUpdate.webp"><img src="assets/features/autoUpdate.webp" width="160" alt="Снимок экрана: Автоматические обновления"></a> |
|
|
@@ -160,7 +164,10 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
|
|
|
160
164
|
- **Дополнение при вводе:** выключено, пока вы его не включите. Когда оно включено, при каждой паузе в наборе Host-часть отправляет уже набранный текст, а также ваши собственные сообщения в чате и текстовые ответы агента (без вывода инструментов, скрытого контекста и рассуждений), не более примерно 3 000 символов чата, модели, выбранной для **Дополнение при вводе** (по умолчанию это модель **Предсказание следующего сообщения**). Новая пауза останавливает предыдущий запрос. В чате ничего не сохраняется. Переключатель хранится в `$DSH_HOME/storages/dsh-composer-plus/complete.json` (файл доступен только владельцу).
|
|
161
165
|
- **Улучшить промпт:** ничего не запускается, пока вы не нажмёте волшебную палочку. Затем Host-часть одним запросом отправляет модели, выбранной для **Улучшить промпт** (по умолчанию это модель самого чата), ваш черновик, ваши собственные сообщения в чате и текстовые ответы агента (без вывода инструментов, скрытого контекста, рассуждений и сообщений, убранных откатом; не более примерно 6 000 символов, самую новую часть), ту же сводку проекта, что и **Идеи функций** (с теми же правилами для файлов: без `.env*` и файлов ключей, без символических ссылок за пределы папки, без FIFO), пути, которые `git status` показывает как изменённые, и до 30 отслеживаемых или неотслеживаемых (не игнорируемых) путей, в именах которых есть слова из вашего черновика. Другое содержимое файлов, кроме этой сводки, не отправляется. В чат и в проект ничего не записывается: ответ только заменяет ваш черновик в поле ввода, а отправлять ли его, решаете вы. Выбранная модель хранится в `$DSH_HOME/storages/dsh-composer-plus/improve.json` (файл доступен только владельцу).
|
|
162
166
|
- **Проверка цели:** запускается, только когда агент в автоматическом раунде отмечает `/goal` как выполненную (или когда вы нажимаете **Запустить сейчас**). Host-часть запускает тестовую команду в папке чата в режиме песочницы этого чата (как собственный инструмент `bash` в dsh: та же политика доступа к файлам; если эта песочница не может запуститься, тест не запускается и проверка не пройдена). Чтобы найти команду, она читает только `package.json`, `Makefile`, `Cargo.toml`, `go.mod`, `pyproject.toml` и `pytest.ini`, как обычные файлы внутри папки (без символических ссылок за пределы папки, без FIFO). Затем она одним запросом без инструментов отправляет модели, выбранной для **Проверка цели** (по умолчанию это модель самого чата), цель, чат с момента начала цели (ваши сообщения, ответы агента, вызовы инструментов, обрезанные до 1 000 символов, и последние 2 000 символов каждого результата инструмента; без рассуждений и шагов, убранных откатом; не более примерно 60 000 символов, самую новую часть), `git status --short` и конец вывода теста. Вывод инструментов может содержать то, что прочитал агент, поэтому в этом запросе могут быть части ваших файлов, как и в самом чате. В чат и в проект ничего не записывается. Ваша тестовая команда, лимиты, последний результат (с концом его вывода) и выбранная модель хранятся в `$DSH_HOME/storages/dsh-composer-plus/goal-check.json` (файл доступен только владельцу, последние 500 чатов).
|
|
163
|
-
-
|
|
167
|
+
- **Продолжить в новом чате:** ничего не запускается, пока вы не нажмёте этот пункт. Затем Host-часть отправляет чат (так, как его читает Проверка цели: без рассуждений и шагов, убранных откатом) собственной модели чата и показывает заметку для передачи; новый чат создаёт только **Начать новый чат**. В проект ничего не записывается.
|
|
168
|
+
- **Состав контекста:** Host-часть читает только журнал чата; без вызова модели и без файлов проекта.
|
|
169
|
+
- **Защищённые файлы:** список и переключатель хранятся в `$DSH_HOME/storages/dsh-composer-plus/protected-files.json` (файл доступен только владельцу). Проверка читает только путь каждого вызова файлового инструмента (и его реальный путь), но никогда не сам файл.
|
|
170
|
+
- **Память проекта:** выключена, пока вы её не включите. Когда она включена, после каждого завершённого хода чата верхнего уровня часть Host отправляет новые сообщения этого чата с момента последнего разбора (ваши сообщения и текстовые ответы агента; без вывода инструментов, рассуждений, скрытого контекста и сообщений, убранных откатом; в ответвлённом чате копия родительского чата не учитывается; не больше примерно 16 000 символов) и сохранённые заметки модели этого чата, одним запросом без инструментов. Заметки — это файлы Markdown в `$DSH_HOME/storages/dsh-composer-plus/memory/` (доступны только владельцу): `projects/<id>/` для каждой папки проекта (`<id>` — хеш реального пути папки; `project.json` указывает папку), `global/`, `journal.jsonl` (каждое изменение со строкой до и после) и `reviewed.json` (до какого места прочитан каждый чат). В папку проекта ничего не записывается. Заметки, похожие на ключ, токен, пароль или номер документа, отклоняются. Заметки проекта попадают в системный промпт каждого нового чата в этой папке, поэтому уходят модели с каждым запросом этого чата. Переключатель хранится в `memory.json` там же. **Открыть память** ничего не отправляет, пока вы не нажмёте **Предпросмотр изменений**; тогда она отправляет показанные заметки и ваш текст модели dsh по умолчанию одним запросом без инструментов. Изменения записываются только по **Применить**, в журнале с `editor`. Tether читает и изменяет заметки через тот же маршрут.
|
|
164
171
|
- **Резервное копирование:** ничего не покидает ваш компьютер. Архивы сохраняются в `~/Desktop/dsh-backups` (файлы доступны только владельцу). Секретов в архиве нет: файлы учётных данных (`.credentials.yaml`, `.env`), файлы ключей (`.pem`, `.key`, `.p12`, `.pfx`) и значения настроек token, secret, password и API-ключей в файлах yml скрыты; их настоящие копии остаются в `composer-plus-vault/<archive>/` в той же папке (доступно только владельцу) и только на этом компьютере. **Для другого компьютера** не копирует vault: введите эти секреты там заново. Ваши журналы чатов, настройки и остальное содержимое домашней папки dsh лежат в архиве как есть: держите папку закрытой, как и сам `$DSH_HOME`. Резервное копирование читает файлы с `O_NOFOLLOW | O_NONBLOCK`; символическая ссылка сохраняется как ссылка (переход по ней не выполняется), а FIFO или устройство пропускается. Переключатель и настройки автоматического резервного копирования хранятся в `$DSH_HOME/storages/dsh-composer-plus/auto-backup.json`, переключатель аварийной консоли — в `rescue-console.json`, а пока dsh работает, `running/host-<pid>.json` указывает каждый процесс dsh (аварийная консоль читает эти файлы, чтобы отказать в восстановлении).
|
|
165
172
|
- **Аварийная консоль:** меню в терминале; она не открывает сетевой порт. Восстановление пишет только в новую папку рядом с домашней папкой dsh (файлы — с `O_EXCL | O_NOFOLLOW`, символические ссылки — в последнюю очередь и без перехода по ним) и отклоняет архив с небезопасным именем (`..`, абсолютный путь), устройством или FIFO, более чем одной папкой верхнего уровня или записью внутри ссылки.
|
|
166
173
|
|
|
@@ -182,7 +189,7 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
|
|
|
182
189
|
- **На строке чата нет метки ветки:** у чата не было хода с момента установки этой версии, его папка не является репозиторием git, или функция **Ветка Git в строках чатов** выключена. После обновления перезапустите dsh (ветку записывает Host-часть).
|
|
183
190
|
- **Проверка цели сообщает, что тест завершился с кодом 127 или «not found»:** у dsh, запущенного из Finder или Dock, PATH может быть короче, чем в вашем терминале, поэтому он не находит `npm`, `pnpm` или `cargo`. Запустите dsh из терминала или задайте свою тестовую команду с полным путём в **Проверка цели** → **Изменить**. **Запустить сейчас** сразу показывает результат.
|
|
184
191
|
- **Цель не закрывается, и агент продолжает работать:** **Проверка цели** нашла непройденный тест или недоделанную работу; строка под целью показывает причину (наведите указатель на результат, чтобы увидеть подробности). Исправьте причину или тестовую команду либо завершите цель сами командой `/goal` или через панель цели (это не проверяется).
|
|
185
|
-
- **Установка не удаётся сразу после выпуска:** укажите версию (`dsh-composer-plus@1.
|
|
192
|
+
- **Установка не удаётся сразу после выпуска:** укажите версию (`dsh-composer-plus@1.17.0`), см. примечание об установке выше.
|
|
186
193
|
- **Кнопка «Создать копию сейчас» сообщает «Уже выполняется другое действие с резервными копиями»:** действие выполняется в другом окне dsh или в аварийной консоли (они используют общий файл блокировки `.composer-plus.lock` в папке резервных копий). Дождитесь его окончания. Если никакое действие не выполняется, блокировку закрытого процесса перехватит следующее нажатие.
|
|
187
194
|
- **Аварийная консоль сообщает «dsh is running»:** сначала выйдите из dsh. Если dsh действительно закрыт, файл, названный в сообщении, остался после сбоя: удалите его и повторите попытку.
|
|
188
195
|
- **После восстановления dsh не запускается или не хватает плагина:** пакеты плагинов профиля нужно установить заново. Аварийная консоль предлагает это после восстановления; или выполните `pnpm install` в каждой папке внутри `$DSH_HOME/profiles/`, которую она перечисляет. Секреты, которых не было в vault (другой компьютер), нужно ввести заново: консоль перечисляет их.
|
|
@@ -205,6 +212,7 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
|
|
|
205
212
|
- **Разрешить для этого чата** отсчитывает лимит времени с момента выдачи разрешения. Новый лимит времени сразу применяется к действующим разрешениям, поэтому более короткий лимит может сразу их завершить. У разрешений из версии 1.12 и более ранних нет времени: после обновления агент ещё раз спросит об этих инструментах.
|
|
206
213
|
- **Сохранять фокус в поле ввода** возвращает фокус только после команды `/` или навыка. Пока dsh обрабатывает команду, поле ввода несколько миллисекунд доступно только для чтения, поэтому клавиши, нажатые в это время, теряются. Если меню `/` в dsh ещё открыто, `Enter` выбирает выделенную строку и ничего не отправляет.
|
|
207
214
|
- **Подгонять карточку вопроса под окно** меняет только карточку вопроса dsh, а не карточку проверки плана. Она находит карточку по разметке dsh (`data-question-key`, `data-question-scroll`); если обновление dsh изменит эту разметку, карточка будет выглядеть так, как её рисует dsh. Высота карточки следует за окном, а не за чатом: в чате в узкой боковой панели высокая карточка всё ещё может выходить выше чата.
|
|
215
|
+
- **Подогнать заголовок чата под окно** находит заголовок чата dsh по его сгенерированным именам классов (`_titleRow`, `_titleCluster`, `_crumbs`, `_headerActions`, `_headerUtilities`), потому что dsh не даёт точки подключения для его раскладки. Если обновление dsh переименует их, заголовок показывается так, как его рисует dsh. В очень узкой колонке чата заголовок может занять две или три строки, и места над сообщениями становится меньше.
|
|
208
216
|
- **Мобильное подключение** работает только в macOS (оно использует `en0`, `openssl`, `swift` и `dns-sd`). Оно использует фиксированные порты 19390 и 19391, поэтому на каждом Mac его может одновременно запускать только один dsh (каждый Mac — одна запись в списке Mac на телефоне). Телефон получает уведомления, только пока Tether открыт или только что ушёл в фон (сервиса push-уведомлений нет). Tether отправляет их только после того, как вы включите в Tether «Settings → Notifications → Send notifications». По умолчанию этот переключатель выключен, а разрешение iOS запрашивает в момент включения. Приложения для iOS пока нет в App Store: соберите его из `tether/ios` в Xcode. «Tailscale only» всё равно требует адрес Wi-Fi или Ethernet на Mac (шлюз запускается только при таком адресе). Журнал доступа у каждого Mac свой и хранит только 200 самых новых попыток; повторная попытка в течение минуты увеличивает счётчик той же строки на один. Блокировка приложения Tether не скрывает превью уведомлений на экране блокировки iPhone: выключите их в настройках iOS. Зелёные точки в Tether следуют за Mac: у чата, который вы открыли в dsh, точка пропадает и на телефоне. У чата, который вы открыли в Tether, точка пропадает только на телефонах. Собственная точка dsh на Mac остаётся, пока вы не откроете чат на Mac.
|
|
209
217
|
- Ссылка на сеанс работает внутри чатов; щелчок по ней не открывает чат. Ссылка, созданная через **Копировать ссылку на сообщение**, открывает своё сообщение только в dsh 0.2.1 и новее и только из сообщения в чате (в dsh 0.2.0 нет правил для пользовательского текста, поэтому там ссылка копируется, но показывается как обычный текст). Сообщение, которое убрал откат или которое сжатие удалило из истории, загружаемой dsh, показать нельзя: ссылка тогда сообщает об этом. Кнопки 🔗 привязаны к строкам сообщений dsh; если обновление dsh изменит эту разметку, они не появятся.
|
|
210
218
|
- **Отметить все как прочитанные** меняет собственные точки непрочитанного dsh через часть dsh, которая не является публичным API (список `completionUnread` в состоянии сеансов dsh). Если обновление dsh переименует его, пункт не появится. Пункт добавляется в меню «…» проекта в dsh, где нет места для плагинов; если dsh изменит это меню, пункт тоже не появится.
|
|
@@ -216,10 +224,10 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
|
|
|
216
224
|
- **Чаты, которые изменили этот файл**, как и **Этот чат**, знают только файловые инструменты dsh (`write`, `edit`, `str_replace_editor`): изменение, сделанное командой (`bash`), в списке не появляется. Список читает 300 самых новых чатов репозитория (по времени создания) и сообщает, если их больше; он показывает не более 100 строк. Переименованный файл показан под тем именем, которое записал инструмент. Чат, папка которого находится вне репозитория (в том числе через другой путь к тем же файлам), не учитывается. Первое открытие после запуска dsh читает все журналы чатов репозитория (около 4 с для 275 чатов); последующие открытия читают только чаты, изменившиеся с тех пор.
|
|
217
225
|
- **Ветка Git в строках чатов** показывает ветку папки чата на момент начала или конца его последнего хода, а не текущую ветку: переключение ветки вне хода появится после следующего хода. У чатов, созданных до этой версии, метки нет до их следующего хода. Метка встроена в разметку строк чатов dsh (в dsh нет для неё отдельного места); если обновление dsh изменит эту разметку, метка не появится. Если строка проекта над чатом называется так же, как ветка (например, папка «Ветка для каждого чата»), строка чата не показывает метку, но в режиме «Одним списком» метка по-прежнему видна.
|
|
218
226
|
- **Ветка для каждого чата** в режиме плана: dsh отправляет `/plan <сообщение>` как команду, а не как сообщение, поэтому Composer Plus перехватывает отправку команды в поле ввода dsh (это не публичный API). Если обновление dsh это изменит, `/plan <сообщение>` при выбранном пункте **Новая ветка** выполнится на открытом экране нового чата как собственная команда dsh. Если Host не может включить режим плана в новом чате, папка ветки остаётся, а сообщение не отправляется, поэтому новый чат не меняет файлы в режиме по умолчанию.
|
|
219
|
-
- **Ветка для каждого чата**: когда папка ветки чата (`<project>/.worktrees/<name>`) удалена, например когда агент самого чата удаляет worktree и ветку, следующий шаг чата выводит чат из этой папки. Проект папки ветки исчезает с боковой панели, а чат появляется в разделе «Без группы» и остаётся открытым. В dsh 0.2.1 и новее чат продолжается в основной папке проекта, и модель получает заметку о новой папке. В dsh 0.2.0 чат остаётся в удалённой папке: команда там завершается с ошибкой, пока вы не начнёте новый чат.
|
|
227
|
+
- **Ветка для каждого чата**: когда папка ветки чата (`<project>/.worktrees/<name>`) удалена, например когда агент самого чата удаляет worktree и ветку, следующий шаг чата выводит чат из этой папки. Проект папки ветки исчезает с боковой панели, а чат появляется в разделе «Без группы» и остаётся открытым. В dsh 0.2.1 и новее чат продолжается в основной папке проекта, и модель получает заметку о новой папке. В dsh 0.2.0 чат остаётся в удалённой папке: команда там завершается с ошибкой, пока вы не начнёте новый чат. Проект удалённой ветки, который не использует ни один чат, тоже исчезает с боковой панели: Composer Plus проверяет папки веток при запуске и каждые 30 секунд, также без фильтра боковой панели. Пока чат переносится, **Новая ветка** в том же репозитории отвечает «попробуйте ещё раз». Если переключатель выключен, снова показывается собственная ошибка dsh («working-directory: directory does not exist»).
|
|
220
228
|
- **Ветки в дереве рабочих областей** пишет в git без клика: при переносе чата он возвращает папку проекта на прежнюю ветку (`git switch`) и добавляет worktree (`git worktree add`). Он никогда не удаляет ветку, worktree или файл. dsh не может сменить папку чата, поэтому перенесённый чат — это копия (собственный форк dsh с новым id), а старый чат архивируется. Копия продолжает остановленную задачу; вызов инструмента, который шёл в момент появления ветки, завершается отказом, и агент запускает его снова в новой папке. Цель старого чата не переносится. Переносится только чат, чья папка — главная папка репозитория, и только ради ветки, которую он создал и на которую переключился в этом ходе (`git switch -c`, `git checkout -b`): ветка, созданная только через `git branch`, папка с незакоммиченными изменениями, связанный worktree или подпапка ничего не переносят. В дереве показываются только worktree прямо в `<project>/.worktrees/` с веткой; отсоединённый (detached) worktree или worktree в другом месте не показывается. Копия открывается сама, только если её чат был открытым (плагин читает это из строки боковой панели dsh); иначе она находится в проекте ветки.
|
|
221
229
|
- **Поиск в чате** ищет только в том, что показывает страница: в загруженных сообщениях и ответах (для более старых прокрутите вверх или нажмите **Загрузить более ранние**), но не в закрытых шагах инструментов и не в свёрнутом тексте вывода инструмента. Он считает не более 2 000 совпадений (дальше — «2000+»). Он использует API подсветки браузера (Chromium 105 и новее; в настольном приложении он есть): в более старом браузере счётчик и переходы работают без цвета. `Cmd+F` на Mac (`Ctrl+F` в Windows и Linux) открывает его, только пока на экране есть чат; в других местах встроенный поиск браузера работает как раньше. На Mac `Ctrl+F` сохраняет своё действие macOS в текстовых полях (курсор сдвигается на один символ вперёд).
|
|
222
|
-
- **Открывать ожидающий чат при бездействии** знает только то, что видит окно dsh: работа в другом приложении не считается, поэтому, когда dsh в фоне, функция может открыть ожидающий чат через 30 секунд. Окно dsh при этом не выходит на передний план. Чтение без нажатия клавиш, щелчков и движений мыши считается бездействием. Функция смотрит только на чаты с оранжевой точкой dsh (вопрос, одобрение или проверка плана); запрос субагента показывается в его родительском чате. Пока ожидающий чат на экране, другой не открывается; чат, из которого вы ушли без ответа, может открыться снова после следующих 30 секунд бездействия. 30 секунд изменить нельзя.
|
|
230
|
+
- **Открывать ожидающий чат при бездействии** знает только то, что видит окно dsh: работа в другом приложении не считается, поэтому, когда dsh в фоне, функция может открыть ожидающий чат через 30 секунд. Окно dsh при этом не выходит на передний план. Чтение без нажатия клавиш, щелчков и движений мыши считается бездействием. Функция смотрит только на чаты с оранжевой точкой dsh (вопрос, одобрение или проверка плана) или с зелёной точкой (завершённый ход, который вы ещё не открыли); запрос субагента показывается в его родительском чате. Оранжевые чаты открываются первыми. Открытие зелёного чата убирает его точку, поэтому 30 секунд следующего зелёного чата начинаются только после вашего следующего нажатия клавиши, щелчка, движения мыши, прокрутки колесом или касания: когда вы вернётесь, остальные зелёные точки останутся на месте. Пока ожидающий чат на экране, другой не открывается; чат, из которого вы ушли без ответа, может открыться снова после следующих 30 секунд бездействия. 30 секунд изменить нельзя.
|
|
223
231
|
- Уведомление, отправленное до перезапуска, при щелчке только выводит dsh на передний план.
|
|
224
232
|
- Активные проекты перемещаются через сохранённый порядок проектов dsh, поэтому новый порядок сохраняется после перезапуска. Чаты вне проектов («Без группы») перемещать нельзя; dsh всегда показывает их последними.
|
|
225
233
|
- В меню параметров просмотра на боковой панели у dsh нет точки расширения, поэтому пункт фильтра недавних проектов добавляется во встроенное меню dsh. Если обновление dsh изменит это меню, пункт не появится, и все проекты останутся видны. Фильтр работает со строками проектов, поэтому режим **Одним списком** не фильтруется. В режиме **Дерево рабочих областей** родительская папка остаётся видна, пока активен проект внутри неё, а строки чатов, которые не были активны за последние 2 часа, тоже скрываются; в режиме **По рабочей области** фильтруются только строки проектов. Фильтр узнаёт текущий вид dsh из сохранённой настройки вида dsh (это не публичный API); если обновление dsh её переименует, **Дерево рабочих областей** фильтруется как **По рабочей области**. Функция «Статус проекта» читает ту же настройку: в режиме **Дерево рабочих областей** строка родительской папки учитывает и чаты проектов внутри неё; если dsh переименует настройку, каждая строка показывает только свои чаты. У **По состоянию** ограничение того же рода: в dsh нет места для своего порядка сортировки, поэтому пункт и порядок строк привязаны к разметке меню и списка dsh.
|
|
@@ -228,10 +236,13 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
|
|
|
228
236
|
- В dsh также нет точки расширения, которая выбирает, где открывается **Новый сеанс**. **Рабочая область по умолчанию для нового сеанса** оборачивает метод dsh, который не является публичным API (`startSession` службы рабочих областей dsh). Если обновление dsh его переименует, **Новый сеанс** откроется там, где выберет dsh (открытый или последний проект). Каждый вызов без проекта использует значение по умолчанию: кнопка на боковой панели, её сочетание клавиш, логотип, а также **Создать** на странице **Задачи автоматизации**. При запуске dsh по-прежнему открывает последний чат. Общая папка создаётся и добавляется в ваши проекты при первом использовании; в Windows или Linux с перемещённой папкой Documents она может отличаться от папки самого dsh.
|
|
229
237
|
- Для подсказки в поле ввода у dsh тоже нет точки расширения, поэтому текст **Предсказание следующего сообщения** накладывается на собственный текст-заполнитель dsh (`[data-composer-placeholder]`). Если обновление dsh изменит эту разметку, предсказание не появится. Пока функция включена, каждый завершённый ход стоит один короткий вызов модели.
|
|
230
238
|
- **Дополнение при вводе** показывает свой текст через собственную подсказку поля ввода dsh (стиль `--dsh-composer-hint`, который dsh использует для подсказки аргумента слеш-команды). Функция не работает для слеш-команды, для сообщения со значком файла или символа и когда курсор стоит не в конце сообщения. Если обновление dsh изменит этот стиль, дополнение не появится. Каждая пауза в наборе стоит один вызов модели.
|
|
231
|
-
- **Улучшить промпт** видит только краткую сводку проекта, изменённые пути и пути, имена которых совпадают с вашими словами, но не сам код. Поэтому функция может пропустить нужный файл и называет только те пути, которые получила. Прочитайте новый текст перед отправкой. Она не работает для
|
|
232
|
-
- **Проверка цели** проверяет только выполнение, которое агент отмечает в автоматическом раунде цели: выполнение, о котором вы просите в чате, `/goal` и панель цели не проверяются. Агент может сам изменить тесты или файлы тестовой команды; верификатор читает чат и может это увидеть, но может ошибиться в обе стороны (ошибочное «не выполнено» стоит ещё одного раунда; ошибочное «выполнено» закрывает цель). Верификатор видит чат и `git status`, но не сам код. Запуск тестов используется повторно, только если последним шагом агента, который может менять файлы, был его собственный успешный запуск `bash` точно той же команды в той же папке; команда с конвейером (`| tail`) или `&&` повторно не используется. Бюджет измеряется, когда заканчивается ход, поэтому один ход может его превысить.
|
|
239
|
+
- **Улучшить промпт** видит только краткую сводку проекта, изменённые пути и пути, имена которых совпадают с вашими словами, но не сам код. Поэтому функция может пропустить нужный файл и называет только те пути, которые получила. Прочитайте новый текст перед отправкой. Она не работает для слеш-команды, кроме `/goal <цель>`, для управляющего слова `/goal` (`clear`, `pause`, `resume`) и для сообщения со значком файла или символа (новый текст — обычный текст, поэтому значок бы потерялся), а в сообщении может быть не более 8 000 символов. Для цели `/goal` функция пишет условия только из черновика и контекста; слишком строгое условие может стоить лишних раундов цели, поэтому прочитайте его перед отправкой. Изображения остаются прикреплёнными: меняется только текст. Каждое нажатие стоит один вызов модели; сильной модели может понадобиться минута (`Esc` отменяет).
|
|
240
|
+
- **Проверка цели** проверяет только выполнение, которое агент отмечает в автоматическом раунде цели: выполнение, о котором вы просите в чате, `/goal` и панель цели не проверяются. Агент может сам изменить тесты или файлы тестовой команды; верификатор читает чат и может это увидеть, но может ошибиться в обе стороны (ошибочное «не выполнено» стоит ещё одного раунда; ошибочное «выполнено» закрывает цель). Верификатор видит чат и `git status`, но не сам код. Запуск тестов используется повторно, только если последним шагом агента, который может менять файлы, был его собственный успешный запуск `bash` точно той же команды в той же папке; команда с конвейером (`| tail`) или `&&` повторно не используется. Бюджет измеряется, когда заканчивается ход, поэтому один ход может его превысить. Бюджет токенов учитывает и вызовы чатов субагентов этого чата (они читаются из их сохранённых журналов в конце каждого хода, поэтому проверка чата с большим числом субагентов идёт немного дольше). Таблица доказательств основана на том, как верификатор сам прочитал чат: часть, которую он называет подтверждённой, всё равно стоит проверить самому, если она важна. `update_goal` ждёт, пока идёт проверка (тест не более 15 минут, верификатор не более 3 минут). Ответвление получает новый id чата, поэтому начинает без собственной тестовой команды и лимитов родительского чата. Каждое выполнение, которое доходит до верификатора, стоит одного вызова модели.
|
|
241
|
+
- **Защищённые файлы** — это ограждение, а не песочница. Функция охватывает собственные файловые инструменты dsh (`read`, `read_image`, `grep` по файлу, `write`, `edit`, `str_replace_editor`). Команда оболочки (`cat .env`), скрипт, который пишет агент, оболочка субагента, инструмент MCP, список `glob` и `grep` по всей папке всё равно могут добраться до защищённого файла. Для настоящего ограничения используйте режимы песочницы dsh или храните секреты вне папки проекта. Шаблоны понимают `*`, `**` и `?`, но не `{a,b}` и не `[ab]`, и не учитывают регистр букв.
|
|
242
|
+
- **Продолжить в новом чате** отправляет чат (сообщения, вызовы инструментов и конец каждого результата инструмента, не более примерно 60 000 символов, самую новую часть) собственной модели чата. Заметка для передачи может пропустить решение или файл: прочитайте её перед запуском. Новый чат знает только заметку и связанный чат (dsh прикрепляет старый чат как контекст только для чтения); его контекст модели начинается с малого, а старый чат остаётся как есть. Для одного чата одновременно идёт только одна заметка или один запуск.
|
|
243
|
+
- **Состав контекста** показывает оценки по собственному правилу dsh (около 4 символов на токен), тому же правилу, что и у кольца контекста dsh; собственный подсчёт модели может отличаться. Определения инструментов взяты из самого нового запроса. Функция показывает контекст так, как он записан в журнале чата; ход, который идёт сейчас, появляется после своего следующего шага.
|
|
233
244
|
- **Приоритет сообщения после остановки** работает только после того, как вы остановили чат (или после хода с ошибкой, или когда вы открываете чат, у которого ещё есть очередь): сообщение, отправленное во время хода, по-прежнему ждёт в конце очереди. Оно обгоняет только ваши собственные сообщения в очереди: если в очереди ждёт раунд цели или ответ на вопрос, остаётся порядок dsh. Функция читает часть dsh, которая не является публичным API (завершается ли ещё остановленный ход); если обновление dsh её переименует, сообщение встанет первым только после завершения этого хода. Чаты субагентов сохраняют порядок dsh.
|
|
234
|
-
- **Память проекта** принадлежит первой папке чата (папке проекта dsh): чат, который меняет папку командой `cd`, сохраняет память своего первого проекта, а та же папка, открытая по другому пути к тем же файлам, использует ту же память. Чат замораживает свой раздел памяти при запуске, поэтому заметка, сохранённая позже, появляется со следующего чата (`memory_recall` находит её сразу). Разбор сохраняет только то, что решила сохранить модель: он может пропустить факт или сохранить неверный;
|
|
245
|
+
- **Память проекта** принадлежит первой папке чата (папке проекта dsh): чат, который меняет папку командой `cd`, сохраняет память своего первого проекта, а та же папка, открытая по другому пути к тем же файлам, использует ту же память. Чат замораживает свой раздел памяти при запуске, поэтому заметка, сохранённая позже, появляется со следующего чата (`memory_recall` находит её сразу). Разбор сохраняет только то, что решила сохранить модель: он может пропустить факт или сохранить неверный; проверьте их в **Открыть память** и измените там, или правьте файлы вручную, когда dsh закрыт. **Открыть память** отправляет заметки выбранного проекта и глобальные заметки (все проекты, если выбрано «Все заметки»; не больше примерно 60 000 символов, остальные только считаются и не могут измениться в этом запросе) и ваш текст модели dsh по умолчанию, а не модели чата. Предпросмотр хранится на Mac 30 минут и до перезапуска dsh; если за это время разбор или агент изменят заметки, **Применить** откажет, и нужно запросить предпросмотр снова. **Применить** сохраняет все изменения предпросмотра или ни одного: если одно изменение нельзя сохранить (например, MEMORY.md заполнен), заметки остаются как были, и показывается причина. Каждый завершённый ход с вашим сообщением стоит одного вызова модели; неудачный вызов перечитывает те же сообщения после следующего хода. Чаты субагентов не разбираются. Идея и формат файлов взяты из [DS Bot](https://github.com/Fei2411/DS-Bot) (Apache-2.0); Composer Plus не использует его код и никогда не читает и не записывает собственную память DS Bot.
|
|
235
246
|
- **Резервное копирование** использует одну постоянную папку, `~/Desktop/dsh-backups` (папку dsh-backup по умолчанию, поэтому его архивы остаются пригодными); настройки для другой папки нет. Архив примерно такого же размера, как домашняя папка dsh без `cache/` и `dsh-runtimes/` (измерено: из 1,6 ГБ файлов получился архив 830 МБ примерно за 30 с на Apple Silicon; dsh при этом отвечал). Файл, который меняется во время чтения, сохраняется в том виде, в каком он был, когда резервное копирование его открыло, поэтому журнал открытого чата может заканчиваться обрезанной записью, которую dsh исправляет при следующей записи. Скрытие находит секрет в файле yml по имени ключа в одной строке (`token:`, `apiKey:`, …); секрет в потоковом словаре (`{token: x}`), в списке под таким ключом, в файле JSON (например, `apiKey` сервера MCP в файле `.json`) или под другим именем остаётся в архиве. Архивы dsh-backup по типам (`dsh-t-…`) не показываются в списке. **Для другого компьютера** копирует архив (в APFS — клон, без дополнительного места); vault с ним не копируется. **Создать копию сейчас** не удаляет ни одной резервной копии. Автоматическое резервное копирование хранит самые новые резервные копии, которые создал Composer Plus (настройка **Хранить** функции **Автоматическое резервное копирование**), и удаляет более старые из них; снимки перед обновлением считаются отдельно (остаются 2 самых новых). Архивы dsh-backup не удаляются никогда: уберите их кнопкой **Удалить**. Пока dsh-backup ещё установлен, он учитывает архивы Composer Plus в своём лимите хранимых копий и может их удалить.
|
|
236
247
|
- **Восстановить** можно только в аварийной консоли, пока dsh закрыт: восстановление заменяет всю домашнюю папку dsh. Старая остаётся рядом как `.dsh.pre-restore-<time>`, пока вы её не удалите, поэтому на диске нужно место для обеих. Чаты сохраняют пути своих проектов: на другом компьютере проект по другому пути показывается как отсутствующий, пока вы не добавите его снова. Символические ссылки, которые указывают за пределы домашней папки dsh (например, навыки, подключённые ссылкой из другой папки), возвращаются как ссылки; их цели должны существовать на том компьютере.
|
|
237
248
|
- **Проверка журналов сеансов** читает самый новый журнал каждого чата по собственным правилам dsh о том, что открывается: строка, которая не является JSON или стоит не по порядку, считается повреждением, только когда после неё идёт конец хода (иначе dsh открывает чат без строк начиная с этой, поэтому чат не попадает в список). Она не сверяет события журнала с собственными правилами событий dsh, поэтому журнал, который она считает исправным, всё равно может не открыться после обновления dsh. Исправление берёт копию из резервной копии: сообщения после этой резервной копии из чата пропадают (повреждённый файл остаётся рядом). Чат, открытый в этом dsh, в Настройках не исправляется: его удерживает dsh.
|
|
@@ -264,7 +275,7 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
|
|
|
264
275
|
|
|
265
276
|
**Можно ли сделать так, чтобы агент сам не отмечал свою работу как выполненную, как в циклах с верификатором из loop engineering?** Да, с функцией **Проверка цели** (включена по умолчанию): начните цель командой `/goal`. Когда агент говорит, что цель выполнена, запускаются тесты проекта, а независимый вызов модели сверяет цель с чатом; если что-то не пройдено, цель остаётся открытой, а агент читает причину. Свою тестовую команду, лимит времени или лимит токенов задайте кнопкой **Изменить** в строке **Проверка цели** под целью.
|
|
266
277
|
|
|
267
|
-
**Может ли агент помнить мои предпочтения между чатами, как память DS Bot?** Да, с функцией **Память проекта** (по умолчанию выключена): включите её в **Настройки → Composer Plus**. После каждого хода ваши постоянные предпочтения и решения сохраняются короткими заметками для проекта чата, и каждый новый чат этого проекта их читает. Попросите агента что-то запомнить, и он сразу сохранит это.
|
|
278
|
+
**Может ли агент помнить мои предпочтения между чатами, как память DS Bot?** Да, с функцией **Память проекта** (по умолчанию выключена): включите её в **Настройки → Composer Plus**. После каждого хода ваши постоянные предпочтения и решения сохраняются короткими заметками для проекта чата, и каждый новый чат этого проекта их читает. Попросите агента что-то запомнить, и он сразу сохранит это. Чтобы посмотреть или изменить заметки, нажмите **Открыть память** в той же строке и напишите, что изменить.
|
|
268
279
|
|
|
269
280
|
**Может ли dsh создавать резервные копии моих чатов и настроек, как dsh-backup?** Да: **Настройки → Composer Plus → Резервное копирование → Создать копию сейчас**. Он записывает архив того же формата в ту же папку (`~/Desktop/dsh-backups`), поэтому архивы dsh-backup тоже показываются и восстанавливаются, а dsh-backup можно удалить. Чтобы копии создавались по расписанию, включите **Автоматическое резервное копирование**.
|
|
270
281
|
|
|
@@ -304,7 +315,7 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
|
|
|
304
315
|
|
|
305
316
|
**Как получать уведомления macOS / Windows, когда задача dsh завершилась или ждёт одобрения?** Оставьте включёнными **Фоновые уведомления** (по умолчанию) и разрешите уведомления для DeepSeek Harness в настройках ОС.
|
|
306
317
|
|
|
307
|
-
**Может ли dsh сам открыть чат, который задаёт мне вопрос?** Да, с функцией **Открывать ожидающий чат при бездействии** (включена по умолчанию): когда чат ждёт ответа, одобрения или проверки плана, а вы не пользуетесь dsh 30 секунд, dsh открывает его. Пока вы печатаете, прокручиваете или двигаете мышь, функция ждёт.
|
|
318
|
+
**Может ли dsh сам открыть чат, который задаёт мне вопрос?** Да, с функцией **Открывать ожидающий чат при бездействии** (включена по умолчанию): когда чат ждёт ответа, одобрения или проверки плана, а вы не пользуетесь dsh 30 секунд, dsh открывает его. Чат, который завершил ход, который вы ещё не прочитали (зелёная точка), открывается так же, после оранжевых. Пока вы печатаете, прокручиваете или двигаете мышь, функция ждёт.
|
|
308
319
|
|
|
309
320
|
**Как переключить интерфейс DeepSeek Harness на турецкий, испанский, японский…?** Настройки → Composer Plus → **Язык приложения**.
|
|
310
321
|
|
|
@@ -343,6 +354,8 @@ PLAYWRIGHT=/path/to/playwright node test/browser-readme-anchors.mjs
|
|
|
343
354
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-keep-focus.mjs /path/to/dsh/lib/bin.js
|
|
344
355
|
# Fit question card to window (fake model asks a long question at 1280 × 820): question, answers, Skip and Submit readable, height follows the window + its thumbnail
|
|
345
356
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-question-fit.mjs /path/to/dsh/lib/bin.js
|
|
357
|
+
# Fit chat header to window (fake model, subagent + background jobs, branch pill, grants chip): no overlap from 1280 to 320 px, wide header unchanged + its thumbnail
|
|
358
|
+
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-header-fit.mjs /path/to/dsh/lib/bin.js
|
|
346
359
|
# Mobile connect: switch on, QR popover, a fake iPhone pairs and calls dsh through the gateway, switch off + its thumbnail
|
|
347
360
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-mobile-connect.mjs /path/to/dsh/lib/bin.js
|
|
348
361
|
# Resume after restart (fake slow model, real quit and start): a running chat and a goal continue, a stopped chat does not
|