You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
Serge Shutov 93504edf2c revert-status-indicator-to-original-model 1 week ago
bridge fix-status-indicator-and-add-scripts 1 week ago
content revert-status-indicator-to-original-model 1 week ago
injected stg-button-force-inject-next-send 2 weeks ago
memory fix-marker-format-angular-vs-square-brackets 2 weeks ago
scripts fix-status-indicator-and-add-scripts 1 week ago
test feat-parser-dom-v0-2-0 2 weeks ago
.gitignore gitignore-state-json-bak 2 weeks ago
README.md readme-protocol-commands-panel-modes-attribution 2 weeks ago
background.js feat-e2-panel-v032-ui-token-migration 2 weeks ago
manifest.json bump-version-1.0.0 2 weeks ago
package.json bump-version-1.0.0 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 нужен для работы моста.

  1. Откройте https://nodejs.org/ в браузере.
  2. На главной странице большая кнопка LTS (Long Term Support). Нажмите, скачается файл .msi.
  3. Запустите этот файл. В установщике везде жмите Next, галочки не меняйте, в конце Install.
  4. Дождитесь окончания, нажмите Finish.

Проверка:

  1. Нажмите Win + R, введите cmd, нажмите Enter. Откроется чёрное окно — командная строка.
  2. Введите:
    node --version
    

    Нажмите Enter. Должно показать что-то вроде v22.11.0. Если пишет «не является внутренней командой» — перезагрузите компьютер и проверьте снова.


Шаг 2. Установить Git

Git нужен чтобы скачать проект.

  1. Откройте https://git-scm.com/download/win
  2. Скачается установщик автоматически. Запустите его.
  3. Везде Next. Несколько экранов с опциями — ничего не меняйте, значения по умолчанию правильные. В конце Install, потом Finish.

Проверка: в новом окне cmd (закройте старое, откройте заново) введите:

git --version

Должно показать git version 2.xx.x.


Шаг 3. Скачать проект

  1. Откройте cmd.
  2. Перейдите в папку, где будет проект. Например, на диск D::
    d:
    

    Затем создайте папку:

    mkdir projects
    cd projects
    
  3. Скачайте проект по HTTPS (не SSH!):
    git clone https://git.starvery.ru/renegade/dsh-memory.git
    

    Появится папка dsh-memory.

  4. Зайдите в неё:
    cd dsh-memory
    

Проверка: команда dir должна показать файлы manifest.json, bridge, content, injected и другие.


Шаг 4. Создать токен

Токен — длинный пароль, которым расширение доказывает мосту что оно «своё».

  1. В cmd (в папке dsh-memory) выполните:
    node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"
    
  2. Скопируйте вывод — это 64 символа, например a3f5b7.... Сохраните его, он понадобится дважды.

Если команда не работает — откройте https://random.org/strings/ , тип Hex, длина 64, нажмите Get strings. Скопируйте результат.


Шаг 5. Настроить config.json

  1. Откройте блокнот.
  2. В нём откройте файл dsh-memory\bridge\config.json (в блокноте: Файл → Открыть → перейдите в папку проекта → bridge → config.json).
  3. Приведите файл к такому виду, подставив свои значения:
    {
      "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" с обратными слешами — сломается.
  1. Сохраните (Ctrl+S) и закройте блокнот.

Шаг 6. Запустить мост

Мост — программа, которая слушает команды от расширения и выполняет их.

  1. В cmd (в папке dsh-memory) перейдите в папку моста:
    cd bridge
    
  2. Запустите:
    node server.js
    
  3. Должно появиться:
    [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):

  1. Откройте bridge/config.json, поменяйте "port": 8766 на "port": 8767.
  2. Сохраните, снова node server.js.
  3. Запомните новый порт — он понадобится в настройках расширения.

Шаг 7. Установить расширение в Chrome

  1. Откройте Chrome.
  2. В адресной строке введите:
    chrome://extensions
    

    Enter.

  3. В правом верхнем углу найдите переключатель Режим разработчика (Developer mode). Включите его (он станет синим).
  4. Появятся три новые кнопки сверху. Нажмите Загрузить распакованное расширение (Load unpacked).
  5. Откроется окно выбора папки. Выберите корень проекта dsh-memory (ту самую папку, где manifest.json, а не папку bridge и не content).
  6. Нажмите Выбрать папку.
  7. В списке расширений появится DSH Memory (unified) с зелёной плашкой.

Если видите красную ошибку — вернитесь к шагу 3, проверьте, что папка именно dsh-memory (не вложенная).


Шаг 8. Настроить панель в DeepSeek

  1. Откройте https://chat.deepseek.com/ в этом же Chrome.
  2. В правом нижнем углу появится тёмная панель DSH Memory. Если её не видно — обновите страницу (F5).
  3. Нажмите на заголовок DSH Memory — панель раскроется.
  4. Нажмите кнопку Settings.
  5. В поле Token вставьте ваш токен из шага 4.
  6. Нажмите Save.
  7. В логе панели появится token saved, reload page.
  8. Обновите страницу (F5) — токен применяется только после перезагрузки.

Шаг 9. Проверка

  1. После F5 панель снова видна. Раскройте её.
  2. Нажмите кнопку Health. В логе должно быть health ok, bridge up. Если health fail — мост не запущен (вернитесь к шагу 6) или токен в config.json не совпадает с токеном в панели.
  3. Нажмите Start. Кнопка станет неактивной, в логе started, фаза idle, точка зелёная.
  4. Задайте модели любой вопрос, например: Прочитай файл 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).

Всё сломалось, ничего не помогает

  1. Закройте окно моста (Ctrl+C).
  2. Удалите папку .dsh-memory в корне вашего проекта (в allowedRoots).
  3. Снова node server.js.
  4. F5 на странице DeepSeek.
  5. 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.


Новое в старых чатах

Автоматическая инъекция протокола работает только в новых чатах (при первом ходе). В уже начатом чате модель видела протокол только если вы вставили его вручную.

Если модель в старом чате забыла инструменты:

  1. Откройте настройки панели.
  2. Нажмите STG (кнопка станет мигающей — armed).
  3. Задайте любой вопрос.
  4. Протокол вставится в начало вашего вопроса автоматически, MAIN-перехватчик сбросит флаг.
  5. Кнопка вернётся в обычное состояние.

В логе консоли: [chat-log] send diag parent=N block=... force=true.