|
|
2 weeks ago | |
|---|---|---|
| bridge | 2 weeks ago | |
| content | 2 weeks ago | |
| injected | 2 weeks ago | |
| memory | 2 weeks ago | |
| test | 2 weeks ago | |
| .gitignore | 2 weeks ago | |
| README.md | 2 weeks ago | |
| background.js | 2 weeks ago | |
| manifest.json | 2 weeks ago | |
| package.json | 2 weeks ago | |
README.md
dsh-memory
Chrome-расширение: инструменты DSH (чтение/запись/правка файлов, bash, git) и постоянная память для чатов DeepSeek.
Что даёт: модель в чате может читать и писать файлы в вашей папке проекта, запускать whitelisted-команды, помнить контекст между чатами.
Как работает: расширение перехватывает ответы DeepSeek, находит специальные маркеры вызова, отправляет их локальному мосту (Node.js-сервер на вашем компьютере), мост выполняет команду и возвращает результат в чат.
Требования: Windows 10/11, Chrome (или Edge), Node.js, Git. Всё бесплатно.
Шаг 1. Установить Node.js
Node.js нужен для работы моста.
- Откройте https://nodejs.org/ в браузере.
- На главной странице большая кнопка LTS (Long Term Support). Нажмите, скачается файл
.msi. - Запустите этот файл. В установщике везде жмите Next, галочки не меняйте, в конце Install.
- Дождитесь окончания, нажмите Finish.
Проверка:
- Нажмите
Win + R, введитеcmd, нажмите Enter. Откроется чёрное окно — командная строка. - Введите:
node --versionНажмите Enter. Должно показать что-то вроде
v22.11.0. Если пишет «не является внутренней командой» — перезагрузите компьютер и проверьте снова.
Шаг 2. Установить Git
Git нужен чтобы скачать проект.
- Откройте https://git-scm.com/download/win
- Скачается установщик автоматически. Запустите его.
- Везде Next. Несколько экранов с опциями — ничего не меняйте, значения по умолчанию правильные. В конце Install, потом Finish.
Проверка: в новом окне cmd (закройте старое, откройте заново) введите:
git --version
Должно показать git version 2.xx.x.
Шаг 3. Скачать проект
- Откройте cmd.
- Перейдите в папку, где будет проект. Например, на диск
D::d:Затем создайте папку:
mkdir projects cd projects - Скачайте проект по HTTPS (не SSH!):
git clone https://git.starvery.ru/renegade/dsh-memory.gitПоявится папка
dsh-memory. - Зайдите в неё:
cd dsh-memory
Проверка: команда dir должна показать файлы manifest.json, bridge, content, injected и другие.
Шаг 4. Создать токен
Токен — длинный пароль, которым расширение доказывает мосту что оно «своё».
- В cmd (в папке
dsh-memory) выполните:node -e "console.log(require('crypto').randomBytes(32).toString('hex'))" - Скопируйте вывод — это 64 символа, например
a3f5b7.... Сохраните его, он понадобится дважды.
Если команда не работает — откройте https://random.org/strings/ , тип Hex, длина 64, нажмите Get strings. Скопируйте результат.
Шаг 5. Настроить config.json
- Откройте блокнот.
- В нём откройте файл
dsh-memory\bridge\config.json(в блокноте: Файл → Открыть → перейдите в папку проекта →bridge→config.json). - Приведите файл к такому виду, подставив свои значения:
{ "token": "ВСТАВЬТЕ_СЮДА_ВАШ_ТОКЕН", "port": 8766, "allowedRoots": [ "D:/projects" ], "bashTimeoutMs": 60000, "bashTimeoutMaxMs": 120000, "handoffTimeoutMs": 300000, "handoffTimeoutMaxMs": 1800000, "dailySendLimit": 100000, "memoryDir": "memory" }
Важно:
token— вставьте ваш токен из шага 4, в кавычках.port— оставьте 8766. Если занят (см. ниже), можно 8767, но тогда и в других местах поменяйте.allowedRoots— абсолютный путь к папке, где лежит ваш проект. Обратите внимание: слеши прямые/, не обратные\. Примеры:"D:/projects""C:/Users/Иван/Documents/код""D:/projects/dsh-memory"— если хотите чтобы модель видела только сам проект.
- НЕ пишите
"D:\projects"с обратными слешами — сломается.
- Сохраните (Ctrl+S) и закройте блокнот.
Шаг 6. Запустить мост
Мост — программа, которая слушает команды от расширения и выполняет их.
- В cmd (в папке
dsh-memory) перейдите в папку моста:cd bridge - Запустите:
node server.js - Должно появиться:
[DSH memory] bridge listening on http://127.0.0.1:8766 [DSH memory] state dir ready: D:\projects\.dsh-memory [DSH memory] allowedRoots: D:\projects [DSH memory] dsh runtime: NOT FOUND (handoff disabled; set config.dshBin to enable)Строка про
dsh runtime— нормально, handoff вам не нужен.
ОЧЕНЬ ВАЖНО:
- НЕ закрывайте это окно cmd. Пока оно открыто — мост работает. Закроете — мост остановится, и расширение перестанет работать.
- Окно можно свернуть, но не закрывать.
- Для остановки: в этом окне нажмите Ctrl+C, затем
Yи Enter.
Если порт 8766 занят (в консоли ошибка EADDRINUSE):
- Откройте
bridge/config.json, поменяйте"port": 8766на"port": 8767. - Сохраните, снова
node server.js. - Запомните новый порт — он понадобится в настройках расширения.
Шаг 7. Установить расширение в Chrome
- Откройте Chrome.
- В адресной строке введите:
chrome://extensionsEnter.
- В правом верхнем углу найдите переключатель Режим разработчика (Developer mode). Включите его (он станет синим).
- Появятся три новые кнопки сверху. Нажмите Загрузить распакованное расширение (Load unpacked).
- Откроется окно выбора папки. Выберите корень проекта
dsh-memory(ту самую папку, гдеmanifest.json, а не папкуbridgeи неcontent). - Нажмите Выбрать папку.
- В списке расширений появится DSH Memory (unified) с зелёной плашкой.
Если видите красную ошибку — вернитесь к шагу 3, проверьте, что папка именно dsh-memory (не вложенная).
Шаг 8. Настроить панель в DeepSeek
- Откройте https://chat.deepseek.com/ в этом же Chrome.
- В правом нижнем углу появится тёмная панель DSH Memory. Если её не видно — обновите страницу (F5).
- Нажмите на заголовок DSH Memory — панель раскроется.
- Нажмите кнопку Settings.
- В поле Token вставьте ваш токен из шага 4.
- Нажмите Save.
- В логе панели появится
token saved, reload page. - Обновите страницу (F5) — токен применяется только после перезагрузки.
Шаг 9. Проверка
- После F5 панель снова видна. Раскройте её.
- Нажмите кнопку Health. В логе должно быть
health ok, bridge up. Еслиhealth fail— мост не запущен (вернитесь к шагу 6) или токен в config.json не совпадает с токеном в панели. - Нажмите Start. Кнопка станет неактивной, в логе
started, фазаidle, точка зелёная. - Задайте модели любой вопрос, например:
Прочитай файл dsh-memory/manifest.json.
Модель ответит с вызовом. В течение 3–5 секунд в чат придёт результат: содержимое файла.
Всё работает.
Если что-то не работает
Панель не появилась
- Проверьте
chrome://extensions— расширение включено? - F5 на странице DeepSeek.
- Откройте консоль: F12 → вкладка Console. Ищите красные ошибки.
Health fail
- Мост запущен? Окно cmd с
node server.jsоткрыто? - Токен в
bridge/config.jsonсовпадает с токеном в панели (буква в букву)? - Порт в панели совпадает с портом моста (8766 по умолчанию)?
Модель отвечает, но вызов не выполняется
- Кнопка Start нажата?
- В панели лог:
exec mode: domилиexec mode: sse? Должно бытьsse. - Если статус мигает жёлтым — модель сгенерировала вызов с ошибкой. Смотрите в чате, там будет причина.
«Повторный вызов отброшен»
- Не вызывайте ту же команду с теми же аргументами дважды подряд. Модель должна менять файл или аргументы. Это защита от дублей.
Ошибка E_PATH_ESCAPE
- Путь за пределами
allowedRoots. Модель пытается выйти за папку проекта. Проверьтеconfig.json.
Ошибка EADDRINUSE при запуске моста
- Порт 8766 занят другой программой. Смените на 8767 (шаг 6).
Всё сломалось, ничего не помогает
- Закройте окно моста (Ctrl+C).
- Удалите папку
.dsh-memoryв корне вашего проекта (вallowedRoots). - Снова
node server.js. - F5 на странице DeepSeek.
- Start.
Как это остановить
- Остановить мост: в окне cmd с
node server.jsнажмите Ctrl+C, потомY. - Отключить расширение:
chrome://extensions, переключатель под DSH Memory → выкл. - Удалить расширение:
chrome://extensions, кнопка Удалить.
Файлы проекта
dsh-memory/
manifest.json — описание расширения для Chrome
bridge/
server.js — HTTP-мост, точка входа
config.json — настройки (токен, порт, allowedRoots)
tools.js — реализация инструментов (dsh_read, dsh_write, ...)
memory.js — память (записи, директивы, поиск)
guard.js — проверка путей и безопасность
state-dir.js — создание служебной папки .dsh-memory/
handoff.js — автономный режим (на Windows не работает)
content/
content.js — ISOLATED-скрипт, парсер вызовов
parser.js — разбор маркеров DSH
panel.js — панель в правом нижнем углу
chat-logger.js — инжект MAIN-скрипта
overlay.css — стили панели
injected/
chat-logger.js — MAIN-скрипт, перехват XHR
memory/
state.template.json — эталон памяти (в git)
state.json — рабочая память (создаётся, в gitignore)
После первого запуска в вашем проекте (allowedRoots) появится папка .dsh-memory/ со служебными файлами: логи, кэш, заметки. Её можно игнорировать в git (добавьте .dsh-memory/ в .gitignore).
Что дальше
- Модель сама разберётся с инструментами: при первом сообщении в новом чате она получает протокол из памяти.
- Если модель «забыла» протокол в старом чате — нажмите STG в настройках панели: блок протокола вставится в следующий ваш вопрос.
- Команды можно ограничивать:
allowedRootsвconfig.json— единственная папка, куда имеет доступ модель.
Лицензия
Проект внутренний, не для публикации. Сторонний код и идеи заимствованы с указанием источников — см. раздел «Заимствования» ниже.
Протокол и команды
Маркеры
Расширение находит в ответе модели три вида маркеров:
- DSH — обычный JSON: U+27E6 DSH + JSON-объект + /DSH U+27E7
- DSH_B64 — тот же JSON, закодированный в base64 (UTF-8). Удобно для контента со спецсимволами, не требуется экранирование
- DSH_FILE — сырое содержимое файла без экранирования: U+27E6 DSH_FILE path=путь U+27E7 + содержимое + /DSH_FILE U+27E7
Модель получает описание формата из памяти при первом ходе. Вручную писать маркеры не нужно, но полезно понимать что происходит.
Команды
| Команда | Что делает | Подтверждение |
|---|---|---|
| dsh_tree | Дерево папки в workspace | нет |
| dsh_read | Прочитать текстовый файл. Прямо до 512 КБ, с offset/limit до 2 МБ | нет |
| dsh_write | Записать файл целиком (создаёт папки). До 2 МБ | нет, кроме .env, package.json и lock-файлов |
| dsh_edit | Заменить уникальный фрагмент в файле | нет, кроме тех же |
| dsh_search | Найти подстроку или regex в файлах | нет |
| dsh_bash | Выполнить команду в консоли | да, если команда вне whitelist |
| dsh_git_status | git status | нет |
| dsh_git_diff | git diff | нет |
| dsh_log | Прочитать последние записи лога вызовов | нет |
| dsh_memory | Память: list, get, search, add, replace, remove, directives, budgets | нет |
| dsh_handoff | Автономный агент (на Windows не работает, не нужно) | — |
Что разрешено в dsh_bash без подтверждения
Базовые команды: pwd, dir, ls, tree, type, where, whoami
Git только на чтение: git status, git diff, git log, git show, git branch, git rev-parse, git ls-files, git describe, git remote
Менеджеры пакетов (подкоманды): npm, pnpm, yarn, bun — только test, run, build, lint, typecheck, check, --version, ls, list, why, outdated
Утилиты через npx: tsc, eslint, prettier, vitest, jest, mocha
Напрямую: tsc, eslint
Версии: node --version, npm --version, npx --version
Что заблокировано всегда
Удаление и перемещение: rm, del, rd, rmdir, mv, move, cp, copy, dd
Системные команды: shutdown, taskkill, tskill, reg, netsh, setx, sudo, sc, schtasks, format X:
Сеть и загрузка: curl, wget, ssh, scp, sftp, ftp, certutil, bitsadmin, mshta, rundll32, regsvr32
PowerShell: powershell, pwsh, iwr, irm, invoke-expression, invoke-webrequest
Git на запись: git push, commit, checkout, switch, reset, clean, rebase, merge, stash, restore, rm, mv, apply, cherry-pick, revert, tag, am, filter-branch, bisect
Управление сетью Windows: net use, net user, net localgroup, net share, net stop, net start, net session, net file, net time, net accounts
Метасимволы в командах: вертикальная черта, амперсанд, угловые скобки, точка с запятой, обратный апостроф, знак доллара, переносы строк
Что требует подтверждения в панели
Команда не в whitelist, но и не в blacklist. Например: node script.mjs, python main.py, go build, cargo test.
При такой команде в панели появляется попап с двумя кнопками Allow и Deny. Модель ждёт. Нажмите Allow — команда выполнится. Deny — вернётся ошибка E_USER_DENIED.
Защита от чтения секретов
Прочитать нельзя (E_FORBIDDEN_PATH):
- .pem, .key, id_rsa, id_ed25519, .pfx, .p12
- файлы с именем credential или secrets в имени (.json, .yaml, .txt)
Запись в .env, package.json, package-lock.json, pnpm-lock.yaml, yarn.lock требует подтверждения в панели.
Защита путей
Все пути относительные от папки из allowedRoots. Абсолютные пути запрещены. Попытка выйти за пределы через .. или символическую ссылку даёт E_PATH_ESCAPE.
Интерфейс панели
Панель в правом нижнем углу страницы DeepSeek. Свернуть/развернуть — клик по заголовку.
Кнопки основного экрана
| Кнопка | Что делает | Когда полезно |
|---|---|---|
| Start | Активирует исполнение вызовов. Без неё MAIN-перехватчик видит маркеры, но content.js их не исполняет | Каждый раз после F5 |
| Stop | Останавливает приём вызовов. Start снова доступен | Если нужно прервать работу |
| Reset queue | Сбрасывает очередь вызовов в content.js | При залипании (редко) |
| Settings | Открывает/закрывает панель настроек | Для токена, режима, STG |
Кнопки в настройках
| Кнопка | Что делает | Когда полезно |
|---|---|---|
| Save | Сохраняет токен в chrome storage. Требуется F5 | При первой настройке или смене токена |
| Health | Проверка связи с мостом | Если сомневаетесь что мост работает |
| STG (светлозелёная) | Принудительная инъекция протокола в следующий вопрос. Работает и в старых чатах, где авто-инъекции нет | В старом чате, если модель забыла протокол. Или после правки протокола в памяти |
| DOM / SSE | Переключатель режима исполнения | SSE если работает. DOM только как резерв |
Поля
| Поле | Что делает |
|---|---|
| Token | Пароль моста. Должен совпадать с bridge/config.json |
| Acc limit (100%) | Верхняя граница для метрики контекста. Приблизительный предел аккаунта. По умолчанию 900000 |
Индикаторы
| Индикатор | Что значит |
|---|---|
| Круглая точка слева от заголовка | зелёная — мост доступен; красная — нет связи; жёлтая мигает — ошибка в последнем вызове; зелёная мигает — исполнение идёт |
| Фаза рядом с точкой | off — не запущено; idle — ждёт; executing — выполняет вызов; sending — отправляет результат обратно |
| Метрика (acc: ... turn: ... msg: ... ctx ...%) | acc — накопленные токены чата (приблизительно); turn — за текущий ход; msg — размер сообщения; ctx — процент использованного контекста от acc limit |
| Лог под метрикой | Последние 60 строк событий. ok dsh_read — успех, fail dsh_write E_ARGS_INVALID — ошибка, dup call skipped — дедуп |
Режимы работы моста
У расширения два независимых канала получения вызовов из ответов DeepSeek: SSE и DOM. Переключаются кнопкой DOM/SSE в настройках панели. Переключение на лету, текущий чат продолжит работать.
SSE (основной режим)
Как работает. Расширение перехватывает XHR-запрос chat/completion и читает тело ответа в формате Server-Sent Events. Из событий потока извлекается текст ответа модели. В этом тексте ищутся маркеры вызовов.
Плюсы:
- Не зависит от DOM-рендерера страницы
- Работает с любым юникодом, многострочным текстом, фигурными скобками, кавычками, обратными слешами, доменами и URL без искажений
- Многострочный oldText в dsh_edit работает
- Не нужны обходы через .mjs и String.fromCharCode, можно писать напрямую
- Лимит 10 вызовов в одном сообщении
Минусы:
- Зависит от формата SSE-событий, который DeepSeek может поменять в любой момент
- При изменении протокола нужна адаптация функции extractAssistant (или ждать обновления расширения)
Когда использовать: всегда. Это основной режим, если он работает — сидите в нём.
DOM (резервный режим)
Как работает. Расширение наблюдает за DOM-деревом страницы через MutationObserver, извлекает текст из отрендеренных блоков сообщений. Дальше тот же парсер ищет маркеры.
Плюсы:
- Не зависит от внутреннего протокола DeepSeek
- Работает если SSE сломался после обновления DeepSeek
Минусы:
- Зависит от DOM-структуры (классы, разметка), которую DeepSeek тоже может поменять
- Линкификация: домены и URL рендерер превращает в ссылки, а сбор текста из DOM вставляет переводы строк между узлами. JSON-строки ломаются
- Многострочный oldText в dsh_edit не находится из-за разницы CRLF/LF
- Нужны обходы: писать контент через .mjs-скрипты, собирать спецсимволы через String.fromCharCode
- Безопасный лимит 3-4 вызова за сообщение, иначе много ошибок
Когда использовать: только если SSE сломался после обновления DeepSeek. Временно, пока не починят SSE.
Как переключать
В настройках панели нажмите кнопку с текущим режимом. Она покажет другой. Ключ в chrome storage: dshmem-transport, значения sse или dom.
В логе панели увидите: exec mode: sse или exec mode: dom.
Заимствования
Проект использует идеи и код из открытых источников. Спасибо авторам.
dsh-memento (Protocol v1)
Источник: https://github.com/PerryLink/dsh-memento Документ: docs/protocol-v1.md (raw: https://raw.githubusercontent.com/PerryLink/dsh-memento/010f2c4e7a15d14f42e5f792348f00b8f635e884/docs/protocol-v1.md)
Взято:
- Поля recallCount и lastRecalled — счётчик востребованности записи
- Разделение track: user (факты о пользователе) и agent (факты о среде, инструментах)
- Поле scope: user-global (глобально) и workspace (локально для проекта)
- Жёсткие бюджеты слоёв вместо тихого обрезания
- replace и remove по уникальному id с ошибкой ENTRY_NOT_FOUND при отсутствии
Не взято: approval gate на каждую запись, adapter registry, conformance suite, agentPreset — избыточно для локального моста.
DeepSeek Memory (dsmemory, community)
Источник: https://github.com/logicwahid/deepseek-memory
Взято:
- Таксономия префиксов ключей: user_, project_, directive_, pref_, tech_, interest_
- Две importance: always (всегда инжектится) и called (по запросу)
- Fingerprint скилов для пропуска повторного инжекта в том же чате
- Мультиязычность: хранить на языке пользователя, не переводить
- Санитизация закрывающих тегов перед вставкой в память
- Правило обновления факта: replace по тому же ключу, не создавать дубликат
- AUTHENTIC EXTRACTION ONLY: только то, что пользователь явно сказал
Не взято: инжект ALL memories в каждый ход (сжигает контекст за 10-15 минут), tag-hider для DOM (у нас инъекция в XHR до отправки), IndexedDB (у нас файлы через мост), payload-mutator.
DSH PRO (внутренний предшественник)
Предшественник этого расширения. Мост, guard.js, белый список bash, парсер маркеров, handoff, execution log — развиты в этом проекте. Исходники в Tools.Ext/dsh-pro (не публичный).
Маркеры DSH, DSH_B64, DSH_FILE — общие с DeepSeek Harness.
Новое в старых чатах
Автоматическая инъекция протокола работает только в новых чатах (при первом ходе). В уже начатом чате модель видела протокол только если вы вставили его вручную.
Если модель в старом чате забыла инструменты:
- Откройте настройки панели.
- Нажмите STG (кнопка станет мигающей — armed).
- Задайте любой вопрос.
- Протокол вставится в начало вашего вопроса автоматически, MAIN-перехватчик сбросит флаг.
- Кнопка вернётся в обычное состояние.
В логе консоли: [chat-log] send diag parent=N block=... force=true.